OpenCores
URL https://opencores.org/ocsvn/viterb_encoder_and_decoder/viterb_encoder_and_decoder/trunk

Subversion Repositories viterb_encoder_and_decoder

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 1 to Rev 2
    Reverse comparison

Rev 1 → Rev 2

/viterb_encoder_and_decoder/trunk/bench/viterbi_tx_rx_tb.v
0,0 → 1,381
module viterbi_tx_rx_tb();
reg clk;
reg rst;
reg encoder_i;
reg enable_encoder_i;
wire decoder_o;
 
viterbi_tx_rx vtr(
.clk(clk),
.rst(rst),
.encoder_i(encoder_i),
.enable_encoder_i(enable_encoder_i),
.decoder_o(decoder_o)
);
 
always
#50 clk = ~clk;
 
 
initial
begin
clk = 1'b1;
rst = 1'b0;
encoder_i= 1'b0;
enable_encoder_i = 1'b0;
#1000
rst = 1'b1;
encoder_i= 1'b0;
enable_encoder_i = 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#1000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
#10000
encoder_i= 1'b0;
#100
encoder_i= 1'b1;
 
 
 
 
#1000000
$finish();
end
 
endmodule
/viterb_encoder_and_decoder/trunk/bench/encoder_tb.v
0,0 → 1,70
module encoder_tb;
 
reg clk;
reg rst;
reg d_in;
wire [1:0] d_out;
 
encoder DUT
(
clk,
rst,
d_in,
d_out
);
 
always
#10 clk = ~clk;
initial
begin
clk = 1'b0;
rst = 1'b0;
d_in = 1'b0;
 
#110
rst = 1'b1;
d_in = 1'b0;
#20
d_in = 1'b1;
 
#20
d_in = 1'b0;
 
#20
d_in = 1'b0;
 
#20
d_in = 1'b0;
 
#20
d_in = 1'b1;
 
#20
d_in = 1'b0;
 
#20
d_in = 1'b0;
 
#20
d_in = 1'b1;
 
#20
d_in = 1'b1;
#20
d_in = 1'b0;
#20
d_in = 1'b0;
 
$finish();
 
 
 
 
 
end
endmodule
/viterb_encoder_and_decoder/trunk/bench/sim.do
0,0 → 1,3
add log -r /*
run -all
quit
/viterb_encoder_and_decoder/trunk/bench/run_sim
0,0 → 1,5
vlib work
 
vlog ../rtl/*.v
vlog ../bench/*.v
vsim -c -novopt mac_test -do sim.do
viterb_encoder_and_decoder/trunk/bench/run_sim Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: viterb_encoder_and_decoder/trunk/rtl/bmc/bmc000.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/bmc/bmc000.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/bmc/bmc000.v (revision 2) @@ -0,0 +1,24 @@ +module bmc000 +( + rx_pair, + path_0_bmc, + path_1_bmc +); + + + input [1:0] rx_pair; + output [1:0] path_0_bmc; + output [1:0] path_1_bmc; + + + assign tmp00 = (rx_pair[0] ^ 1'b0); + assign tmp01 = (rx_pair[1] ^ 1'b0); + + assign tmp10 = (rx_pair[0] ^ 1'b1); + assign tmp11 = (rx_pair[1] ^ 1'b1); + + assign path_0_bmc = {(tmp00 & tmp01),(tmp00 ^ tmp01)}; + assign path_1_bmc = {(tmp10 & tmp11),(tmp10 ^ tmp11)}; + + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/bmc/bmc100.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/bmc/bmc100.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/bmc/bmc100.v (revision 2) @@ -0,0 +1,22 @@ +module bmc100 +( + rx_pair, + path_0_bmc, + path_1_bmc +); + + + input [1:0] rx_pair; + output [1:0] path_0_bmc; + output [1:0] path_1_bmc; + + assign tmp00 = (rx_pair[0] ^ 1'b0); + assign tmp01 = (rx_pair[1] ^ 1'b0); + + assign tmp10 = (rx_pair[0] ^ 1'b1); + assign tmp11 = (rx_pair[1] ^ 1'b1); + + assign path_0_bmc = {(tmp00 & tmp01),(tmp00 ^ tmp01)}; + assign path_1_bmc = {(tmp10 & tmp11),(tmp10 ^ tmp11)}; + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/bmc/bmc010.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/bmc/bmc010.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/bmc/bmc010.v (revision 2) @@ -0,0 +1,23 @@ +module bmc010 +( + rx_pair, + path_0_bmc, + path_1_bmc +); + + + input [1:0] rx_pair; + output [1:0] path_0_bmc; + output [1:0] path_1_bmc; + + assign tmp00 = (rx_pair[0] ^ 1'b0); + assign tmp01 = (rx_pair[1] ^ 1'b1); + + assign tmp10 = (rx_pair[0] ^ 1'b1); + assign tmp11 = (rx_pair[1] ^ 1'b0); + + assign path_0_bmc = {(tmp00 & tmp01),(tmp00 ^ tmp01)}; + assign path_1_bmc = {(tmp10 & tmp11),(tmp10 ^ tmp11)}; + + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/bmc/bmc001.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/bmc/bmc001.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/bmc/bmc001.v (revision 2) @@ -0,0 +1,22 @@ +module bmc001 +( + rx_pair, + path_0_bmc, + path_1_bmc +); + + + input [1:0] rx_pair; + output [1:0] path_0_bmc; + output [1:0] path_1_bmc; + + assign tmp00 = (rx_pair[0] ^ 1'b0); + assign tmp01 = (rx_pair[1] ^ 1'b1); + + assign tmp10 = (rx_pair[0] ^ 1'b1); + assign tmp11 = (rx_pair[1] ^ 1'b0); + + assign path_0_bmc = {(tmp00 & tmp01),(tmp00 ^ tmp01)}; + assign path_1_bmc = {(tmp10 & tmp11),(tmp10 ^ tmp11)}; + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/bmc/bmc110.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/bmc/bmc110.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/bmc/bmc110.v (revision 2) @@ -0,0 +1,22 @@ +module bmc110 +( + rx_pair, + path_0_bmc, + path_1_bmc +); + + + input [1:0] rx_pair; + output [1:0] path_0_bmc; + output [1:0] path_1_bmc; + + assign tmp00 = (rx_pair[0] ^ 1'b0); + assign tmp01 = (rx_pair[1] ^ 1'b1); + + assign tmp10 = (rx_pair[0] ^ 1'b1); + assign tmp11 = (rx_pair[1] ^ 1'b0); + + assign path_0_bmc = {(tmp00 & tmp01),(tmp00 ^ tmp01)}; + assign path_1_bmc = {(tmp10 & tmp11),(tmp10 ^ tmp11)}; + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/bmc/bmc101.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/bmc/bmc101.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/bmc/bmc101.v (revision 2) @@ -0,0 +1,22 @@ +module bmc101 +( + rx_pair, + path_0_bmc, + path_1_bmc +); + + + input [1:0] rx_pair; + output [1:0] path_0_bmc; + output [1:0] path_1_bmc; + + assign tmp00 = (rx_pair[0] ^ 1'b0); + assign tmp01 = (rx_pair[1] ^ 1'b1); + + assign tmp10 = (rx_pair[0] ^ 1'b1); + assign tmp11 = (rx_pair[1] ^ 1'b0); + + assign path_0_bmc = {(tmp00 & tmp01),(tmp00 ^ tmp01)}; + assign path_1_bmc = {(tmp10 & tmp11),(tmp10 ^ tmp11)}; + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/bmc/bmc011.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/bmc/bmc011.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/bmc/bmc011.v (revision 2) @@ -0,0 +1,23 @@ +module bmc011 +( + rx_pair, + path_0_bmc, + path_1_bmc +); + + + input [1:0] rx_pair; + output [1:0] path_0_bmc; + output [1:0] path_1_bmc; + + assign tmp00 = (rx_pair[0] ^ 1'b0); + assign tmp01 = (rx_pair[1] ^ 1'b0); + + assign tmp10 = (rx_pair[0] ^ 1'b1); + assign tmp11 = (rx_pair[1] ^ 1'b1); + + assign path_0_bmc = {(tmp00 & tmp01),(tmp00 ^ tmp01)}; + assign path_1_bmc = {(tmp10 & tmp11),(tmp10 ^ tmp11)}; + + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/bmc/bmc111.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/bmc/bmc111.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/bmc/bmc111.v (revision 2) @@ -0,0 +1,22 @@ +module bmc111 +( + rx_pair, + path_0_bmc, + path_1_bmc +); + + + input [1:0] rx_pair; + output [1:0] path_0_bmc; + output [1:0] path_1_bmc; + + assign tmp00 = (rx_pair[0] ^ 1'b0); + assign tmp01 = (rx_pair[1] ^ 1'b0); + + assign tmp10 = (rx_pair[0] ^ 1'b1); + assign tmp11 = (rx_pair[1] ^ 1'b1); + + assign path_0_bmc = {(tmp00 & tmp01),(tmp00 ^ tmp01)}; + assign path_1_bmc = {(tmp10 & tmp11),(tmp10 ^ tmp11)}; + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/mem_1x1024.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/mem_1x1024.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/mem_1x1024.v (revision 2) @@ -0,0 +1,25 @@ +module mem_disp +( + clk, + wr, + addr, + d_i, + d_o +); + + input clk; + input wr; + input [9:0] addr; + input d_i; + output reg d_o; + + reg mem [1023:0]; + + + always @ (posedge clk) + begin + if(wr) + mem[addr] <= d_i; + d_o <= mem[addr]; + end +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/encoder.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/encoder.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/encoder.v (revision 2) @@ -0,0 +1,151 @@ +module encoder +( + clk, + rst, + enable_i, + d_in, + valid_o, + d_out +); + input clk; + input rst; + input enable_i; + input d_in; + output reg valid_o; + output [1:0] d_out; + + reg [2:0] cstate; + reg [2:0] nstate; + + reg [1:0] d_out_reg; + + assign d_out = (enable_i==1'b1)?d_out_reg:2'b00; + + + always @(*) begin + valid_o = enable_i; + case (cstate) + 3'b000: + begin + if(d_in==1'b0) + begin + nstate = 3'b000; + d_out_reg = 2'b00; + end + else + begin + nstate = 3'b100; + d_out_reg = 2'b11; + end + end + 3'b001: + begin + if(d_in==1'b0) + begin + nstate = 3'b100; + d_out_reg = 2'b00; + end + else + begin + nstate = 3'b000; + d_out_reg = 2'b11; + end + end + 3'b010: + begin + if(d_in==1'b0) + begin + nstate = 3'b101; + d_out_reg = 2'b10; + end + else + begin + nstate = 3'b001; + d_out_reg = 2'b01; + end + end + 3'b011: + begin + if(d_in==1'b0) + begin + nstate = 3'b001; + d_out_reg = 2'b10; + end + else + begin + nstate = 3'b101; + d_out_reg = 2'b01; + end + end + 3'b100: + begin + if(d_in==1'b0) + begin + nstate = 3'b010; + d_out_reg = 2'b10; + end + else + begin + nstate = 3'b110; + d_out_reg = 2'b01; + end + end + 3'b101: + begin + if(d_in==1'b0) + begin + nstate = 3'b110; + d_out_reg = 2'b10; + end + else + begin + nstate = 3'b010; + d_out_reg = 2'b01; + end + end + 3'b110: + begin + if(d_in==1'b0) + begin + nstate = 3'b111; + d_out_reg = 2'b00; + end + else + begin + nstate = 3'b011; + d_out_reg = 2'b11; + end + end + 3'b111: + begin + if(d_in==1'b0) + begin + nstate = 3'b011; + d_out_reg = 2'b00; + end + else + begin + nstate = 3'b111; + d_out_reg = 2'b11; + end + end + + endcase + end + + + + always @ (posedge clk,negedge rst) + begin +// $display("data in=%d state=%b%b%b data out=%b%b",d_in,reg_1,reg_2,reg_3,d_out_reg[1],d_out_reg[0]); + if(rst==1'b0) + cstate <= 3'b000; + else if(enable_i==1'b0) + cstate <= 3'b000; + else + cstate <= nstate; + end + + + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/original/mem_8x1024_ori.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/original/mem_8x1024_ori.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/original/mem_8x1024_ori.v (revision 2) @@ -0,0 +1,26 @@ +module mem +( + clk, + wr, + addr, + d_i, + d_o +); + + input clk; + input wr; + input [9:0] addr; + input [7:0] d_i; + output[7:0] d_o; + + reg [7:0] mem [1023:0]; + + assign d_o = mem[addr]; + + always @ (posedge clk) + begin + if(wr) + mem[addr] <= d_i; + + end +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/original/mem_1x1024_ori.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/original/mem_1x1024_ori.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/original/mem_1x1024_ori.v (revision 2) @@ -0,0 +1,26 @@ +module mem_disp +( + clk, + wr, + addr, + d_i, + d_o +); + + input clk; + input wr; + input [9:0] addr; + input d_i; + output d_o; + + reg mem [1023:0]; + + assign d_o = mem[addr]; + + always @ (posedge clk) + begin + if(wr) + mem[addr] <= d_i; + + end +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/backup/decoder_20120201_1.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/backup/decoder_20120201_1.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/backup/decoder_20120201_1.v (revision 2) @@ -0,0 +1,510 @@ +module decoder +( + clk, + rst, + d_in, + d_out +); + + input clk; + input rst; + input [1:0] d_in; + output d_out; + + reg decoder_o_reg; + + +//bmc module signals + wire [1:0] bmc000_path_0_bmc; + wire [1:0] bmc001_path_0_bmc; + wire [1:0] bmc010_path_0_bmc; + wire [1:0] bmc011_path_0_bmc; + wire [1:0] bmc100_path_0_bmc; + wire [1:0] bmc101_path_0_bmc; + wire [1:0] bmc110_path_0_bmc; + wire [1:0] bmc111_path_0_bmc; + + wire [1:0] bmc000_path_1_bmc; + wire [1:0] bmc001_path_1_bmc; + wire [1:0] bmc010_path_1_bmc; + wire [1:0] bmc011_path_1_bmc; + wire [1:0] bmc100_path_1_bmc; + wire [1:0] bmc101_path_1_bmc; + wire [1:0] bmc110_path_1_bmc; + wire [1:0] bmc111_path_1_bmc; + +//ACS modules signals + reg [7:0] validity; + reg [7:0] selection; + reg [7:0] path_cost [7:0]; + wire [7:0] validity_nets; + wire [7:0] selection_nets; + + wire ACS000_selection; + wire ACS001_selection; + wire ACS010_selection; + wire ACS011_selection; + wire ACS100_selection; + wire ACS101_selection; + wire ACS110_selection; + wire ACS111_selection; + + wire ACS000_valid_o; + wire ACS001_valid_o; + wire ACS010_valid_o; + wire ACS011_valid_o; + wire ACS100_valid_o; + wire ACS101_valid_o; + wire ACS110_valid_o; + wire ACS111_valid_o; + + wire [7:0] ACS000_path_cost; + wire [7:0] ACS001_path_cost; + wire [7:0] ACS010_path_cost; + wire [7:0] ACS011_path_cost; + wire [7:0] ACS100_path_cost; + wire [7:0] ACS101_path_cost; + wire [7:0] ACS110_path_cost; + wire [7:0] ACS111_path_cost; + +//Trelis memory write operation + reg [1:0] mem_bank; + reg [1:0] mem_bank_buf; + reg [1:0] mem_bank_buf_buf; + reg [1:0] mem_bank_buf_buf_buf; + reg [1:0] mem_bank_buf_buf_buf_buf; + reg [1:0] mem_bank_buf_buf_buf_buf_buf; + reg [9:0] wr_mem_counter; + reg [9:0] rd_mem_counter; + + reg [9:0] addr_mem_A; + reg [9:0] addr_mem_B; + reg [9:0] addr_mem_C; + reg [9:0] addr_mem_D; + + reg wr_mem_A; + reg wr_mem_B; + reg wr_mem_C; + reg wr_mem_D; + + reg [7:0] d_in_mem_A; + reg [7:0] d_in_mem_B; + reg [7:0] d_in_mem_C; + reg [7:0] d_in_mem_D; + + wire [7:0] d_o_mem_A; + wire [7:0] d_o_mem_B; + wire [7:0] d_o_mem_C; + wire [7:0] d_o_mem_D; + +//Trace back module signals + reg selection_tbu_0; + reg selection_tbu_1; + + reg [7:0] d_in_0_tbu_0; + reg [7:0] d_in_1_tbu_0; + reg [7:0] d_in_0_tbu_1; + reg [7:0] d_in_1_tbu_1; + + wire d_o_tbu_0; + wire d_o_tbu_1; + +//Display memory operations + wire wr_disp_mem_0; + wire wr_disp_mem_1; + + wire d_in_disp_mem_0; + wire d_in_disp_mem_1; + + reg [9:0] wr_mem_counter_disp; + reg [9:0] rd_mem_counter_disp; + + reg [9:0] addr_disp_mem_0; + reg [9:0] addr_disp_mem_1; + + + assign d_out = decoder_o_reg; + + +//Branch matrc calculation modules + + bmc000 bmc000_inst(d_in,bmc000_path_0_bmc,bmc000_path_1_bmc); + bmc001 bmc001_inst(d_in,bmc001_path_0_bmc,bmc001_path_1_bmc); + bmc010 bmc010_inst(d_in,bmc010_path_0_bmc,bmc010_path_1_bmc); + bmc011 bmc011_inst(d_in,bmc011_path_0_bmc,bmc011_path_1_bmc); + bmc100 bmc100_inst(d_in,bmc100_path_0_bmc,bmc100_path_1_bmc); + bmc101 bmc101_inst(d_in,bmc101_path_0_bmc,bmc101_path_1_bmc); + bmc110 bmc110_inst(d_in,bmc110_path_0_bmc,bmc110_path_1_bmc); + bmc111 bmc111_inst(d_in,bmc111_path_0_bmc,bmc111_path_1_bmc); + + +//Add Compare Select Modules + + ACS ACS000(validity[0],validity[1],bmc000_path_0_bmc,bmc000_path_1_bmc,path_cost[0],path_cost[1],ACS000_selection,ACS000_valid_o,ACS000_path_cost); + ACS ACS001(validity[3],validity[2],bmc001_path_0_bmc,bmc001_path_1_bmc,path_cost[3],path_cost[2],ACS001_selection,ACS001_valid_o,ACS001_path_cost); + ACS ACS010(validity[4],validity[5],bmc010_path_0_bmc,bmc010_path_1_bmc,path_cost[4],path_cost[5],ACS010_selection,ACS010_valid_o,ACS010_path_cost); + ACS ACS011(validity[7],validity[6],bmc011_path_0_bmc,bmc011_path_1_bmc,path_cost[7],path_cost[6],ACS011_selection,ACS011_valid_o,ACS011_path_cost); + ACS ACS100(validity[1],validity[0],bmc100_path_0_bmc,bmc100_path_1_bmc,path_cost[1],path_cost[0],ACS100_selection,ACS100_valid_o,ACS100_path_cost); + ACS ACS101(validity[2],validity[3],bmc101_path_0_bmc,bmc101_path_1_bmc,path_cost[2],path_cost[3],ACS101_selection,ACS101_valid_o,ACS101_path_cost); + ACS ACS110(validity[5],validity[4],bmc110_path_0_bmc,bmc110_path_1_bmc,path_cost[5],path_cost[4],ACS110_selection,ACS110_valid_o,ACS110_path_cost); + ACS ACS111(validity[6],validity[7],bmc111_path_0_bmc,bmc111_path_1_bmc,path_cost[6],path_cost[7],ACS111_selection,ACS111_valid_o,ACS111_path_cost); + + + assign selection_nets = {ACS111_selection,ACS110_selection,ACS101_selection,ACS100_selection, + ACS011_selection,ACS010_selection,ACS001_selection,ACS000_selection}; + assign validity_nets = {ACS111_valid_o,ACS110_valid_o,ACS101_valid_o,ACS100_valid_o, + ACS011_valid_o,ACS010_valid_o,ACS001_valid_o,ACS000_valid_o}; + + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + begin + validity <= 8'b00000001; + selection <= 8'b00000001; + + path_cost[0] <= 8'd0; + path_cost[1] <= 8'd0; + path_cost[2] <= 8'd0; + path_cost[3] <= 8'd0; + path_cost[4] <= 8'd0; + path_cost[5] <= 8'd0; + path_cost[6] <= 8'd0; + path_cost[7] <= 8'd0; + + end + else begin + validity <= validity_nets; + selection <= selection_nets; + + path_cost[0] <= ACS000_path_cost; + path_cost[1] <= ACS001_path_cost; + path_cost[2] <= ACS010_path_cost; + path_cost[3] <= ACS011_path_cost; + path_cost[4] <= ACS100_path_cost; + path_cost[5] <= ACS101_path_cost; + path_cost[6] <= ACS110_path_cost; + path_cost[7] <= ACS111_path_cost; + + end + end + + + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + wr_mem_counter <= 10'd0; + else + wr_mem_counter <= wr_mem_counter + 10'd1; + end + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + rd_mem_counter <= 10'b1111111111; + else + rd_mem_counter <= rd_mem_counter - 10'd1; + end + + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + mem_bank <= 2'b00; + else begin + if(wr_mem_counter==10'b1111111111) + mem_bank <= mem_bank + 2'b01; + end + end + + + always @ (posedge clk) + begin + d_in_mem_A <= selection; + d_in_mem_B <= selection; + d_in_mem_C <= selection; + d_in_mem_D <= selection; + + end + + + always @ (posedge clk) + begin + case(mem_bank) + 2'b00: + begin + addr_mem_A <= wr_mem_counter; + addr_mem_B <= rd_mem_counter; + addr_mem_C <= 10'd0; + addr_mem_D <= rd_mem_counter; + + wr_mem_A <= 1'b1; + wr_mem_B <= 1'b0; + wr_mem_C <= 1'b0; + wr_mem_D <= 1'b0; + end + 2'b01: + begin + addr_mem_A <= rd_mem_counter; + addr_mem_B <= wr_mem_counter; + addr_mem_C <= rd_mem_counter; + addr_mem_D <= 10'd0; + + wr_mem_A <= 1'b0; + wr_mem_B <= 1'b1; + wr_mem_C <= 1'b0; + wr_mem_D <= 1'b0; + + end + 2'b10: + begin + addr_mem_A <= 10'd0; + addr_mem_B <= rd_mem_counter; + addr_mem_C <= wr_mem_counter; + addr_mem_D <= rd_mem_counter; + + wr_mem_A <= 1'b0; + wr_mem_B <= 1'b0; + wr_mem_C <= 1'b1; + wr_mem_D <= 1'b0; + end + 2'b11: + begin + addr_mem_A <= rd_mem_counter; + addr_mem_B <= 10'd0; + addr_mem_C <= rd_mem_counter; + addr_mem_D <= wr_mem_counter; + + wr_mem_A <= 1'b0; + wr_mem_B <= 1'b0; + wr_mem_C <= 1'b0; + wr_mem_D <= 1'b1; + end + endcase + end + +//Trelis memory module instantiation + + mem trelis_mem_A + ( + .clk(clk), + .wr(wr_mem_A), + .addr(addr_mem_A), + .d_i(d_in_mem_A), + .d_o(d_o_mem_A) + ); + + mem trelis_mem_B + ( + .clk(clk), + .wr(wr_mem_B), + .addr(addr_mem_B), + .d_i(d_in_mem_B), + .d_o(d_o_mem_B) + ); + + mem trelis_mem_C + ( + .clk(clk), + .wr(wr_mem_C), + .addr(addr_mem_C), + .d_i(d_in_mem_C), + .d_o(d_o_mem_C) + ); + + mem trelis_mem_D + ( + .clk(clk), + .wr(wr_mem_D), + .addr(addr_mem_D), + .d_i(d_in_mem_D), + .d_o(d_o_mem_D) + ); + +//Trace back module operation + + always @(posedge clk) + mem_bank_buf <= mem_bank; + + always @(posedge clk) + mem_bank_buf_buf <= mem_bank_buf; + + always @ (posedge clk) + begin + case(mem_bank_buf_buf) + 2'b00: + begin + d_in_0_tbu_0 <= d_o_mem_D; + d_in_1_tbu_0 <= d_o_mem_C; + + d_in_0_tbu_1 <= d_o_mem_C; + d_in_1_tbu_1 <= d_o_mem_B; + + selection_tbu_0<= 1'b0; + selection_tbu_1<= 1'b1; + + end + 2'b01: + begin + d_in_0_tbu_0 <= d_o_mem_D; + d_in_1_tbu_0 <= d_o_mem_C; + + d_in_0_tbu_1 <= d_o_mem_A; + d_in_1_tbu_1 <= d_o_mem_D; + + selection_tbu_0<= 1'b1; + selection_tbu_1<= 1'b0; + end + 2'b10: + begin + d_in_0_tbu_0 <= d_o_mem_B; + d_in_1_tbu_0 <= d_o_mem_A; + + d_in_0_tbu_1 <= d_o_mem_A; + d_in_1_tbu_1 <= d_o_mem_D; + + selection_tbu_0<= 1'b0; + selection_tbu_1<= 1'b1; + end + 2'b11: + begin + d_in_0_tbu_0 <= d_o_mem_B; + d_in_1_tbu_0 <= d_o_mem_A; + + d_in_0_tbu_1 <= d_o_mem_C; + d_in_1_tbu_1 <= d_o_mem_B; + + selection_tbu_0<= 1'b1; + selection_tbu_1<= 1'b0; + end + endcase + end + +//Trace-Back modules instantiation + + tbu tbu_0 + ( + .clk(clk), + .rst(rst), + .selection(selection_tbu_0), + .d_in_0(d_in_0_tbu_0), + .d_in_1(d_in_1_tbu_0), + .d_o(d_o_tbu_0), + .wr_en(wr_disp_mem_0) + ); + + tbu tbu_1 + ( + .clk(clk), + .rst(rst), + .selection(selection_tbu_1), + .d_in_0(d_in_0_tbu_1), + .d_in_1(d_in_1_tbu_1), + .d_o(d_o_tbu_1), + .wr_en(wr_disp_mem_1) + ); + +//Display Memory modules Instantioation + + assign d_in_disp_mem_0 = d_o_tbu_0; + assign d_in_disp_mem_1 = d_o_tbu_1; + + + mem_disp disp_mem_0 + ( + .clk(clk), + .wr(wr_disp_mem_0), + .addr(addr_disp_mem_0), + .d_i(d_in_disp_mem_0), + .d_o(d_o_disp_mem_0) + ); + + mem_disp disp_mem_1 + ( + .clk(clk), + .wr(wr_disp_mem_1), + .addr(addr_disp_mem_1), + .d_i(d_in_disp_mem_1), + .d_o(d_o_disp_mem_1) + ); + +// Display memory module operation + always @ (posedge clk) + mem_bank_buf_buf_buf <= mem_bank_buf_buf; + + always @ (posedge clk) + begin + if(rst==1'b0) + wr_mem_counter_disp <= 10'b1111111100; + else + wr_mem_counter_disp <= wr_mem_counter_disp + 10'd1; + end + + always @ (posedge clk) + begin + if(rst==1'b0) + rd_mem_counter_disp <= 10'b0000000011; + else + rd_mem_counter_disp <= rd_mem_counter_disp - 10'd1; + end + + + always @ (posedge clk) + begin + case(mem_bank_buf_buf_buf) + 2'b00: + begin + addr_disp_mem_0 <= rd_mem_counter_disp; + addr_disp_mem_1 <= wr_mem_counter_disp; + end + 2'b01: + begin + addr_disp_mem_0 <= wr_mem_counter_disp; + addr_disp_mem_1 <= rd_mem_counter_disp; + end + 2'b10: + begin + addr_disp_mem_0 <= rd_mem_counter_disp; + addr_disp_mem_1 <= wr_mem_counter_disp; + end + 2'b11: + begin + addr_disp_mem_0 <= wr_mem_counter_disp; + addr_disp_mem_1 <= rd_mem_counter_disp; + end + endcase + end + + always @ (posedge clk) + mem_bank_buf_buf_buf_buf <= mem_bank_buf_buf_buf; + + always @ (posedge clk) + mem_bank_buf_buf_buf_buf_buf <= mem_bank_buf_buf_buf_buf; + + + + always @ (posedge clk) + begin + case(mem_bank_buf_buf_buf_buf_buf) + 2'b00: + begin + decoder_o_reg <= d_o_disp_mem_0; + end + 2'b01: + begin + decoder_o_reg <= d_o_disp_mem_1; + end + 2'b10: + begin + decoder_o_reg <= d_o_disp_mem_1; + end + 2'b11: + begin + decoder_o_reg <= d_o_disp_mem_0; + end + endcase + end + + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/mem_8x1024.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/mem_8x1024.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/mem_8x1024.v (revision 2) @@ -0,0 +1,27 @@ +module mem +( + clk, + wr, + addr, + d_i, + d_o +); + + input clk; + input wr; + input [9:0] addr; + input [7:0] d_i; + output reg [7:0] d_o; + + reg [7:0] mem [1023:0]; + + + + always @ (posedge clk) + begin + if(wr) + mem[addr] <= d_i; + d_o <= mem[addr]; + + end +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/decoder.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/decoder.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/decoder.v (revision 2) @@ -0,0 +1,563 @@ +module decoder +( + clk, + rst, + enable, + d_in, + d_out +); + + input clk; + input rst; + input enable; + input [1:0] d_in; + output d_out; + + reg decoder_o_reg; + + +//bmc module signals + wire [1:0] bmc000_path_0_bmc; + wire [1:0] bmc001_path_0_bmc; + wire [1:0] bmc010_path_0_bmc; + wire [1:0] bmc011_path_0_bmc; + wire [1:0] bmc100_path_0_bmc; + wire [1:0] bmc101_path_0_bmc; + wire [1:0] bmc110_path_0_bmc; + wire [1:0] bmc111_path_0_bmc; + + wire [1:0] bmc000_path_1_bmc; + wire [1:0] bmc001_path_1_bmc; + wire [1:0] bmc010_path_1_bmc; + wire [1:0] bmc011_path_1_bmc; + wire [1:0] bmc100_path_1_bmc; + wire [1:0] bmc101_path_1_bmc; + wire [1:0] bmc110_path_1_bmc; + wire [1:0] bmc111_path_1_bmc; + +//ACS modules signals + reg [7:0] validity; + reg [7:0] selection; + reg [7:0] path_cost [7:0]; + wire [7:0] validity_nets; + wire [7:0] selection_nets; + + wire ACS000_selection; + wire ACS001_selection; + wire ACS010_selection; + wire ACS011_selection; + wire ACS100_selection; + wire ACS101_selection; + wire ACS110_selection; + wire ACS111_selection; + + wire ACS000_valid_o; + wire ACS001_valid_o; + wire ACS010_valid_o; + wire ACS011_valid_o; + wire ACS100_valid_o; + wire ACS101_valid_o; + wire ACS110_valid_o; + wire ACS111_valid_o; + + wire [7:0] ACS000_path_cost; + wire [7:0] ACS001_path_cost; + wire [7:0] ACS010_path_cost; + wire [7:0] ACS011_path_cost; + wire [7:0] ACS100_path_cost; + wire [7:0] ACS101_path_cost; + wire [7:0] ACS110_path_cost; + wire [7:0] ACS111_path_cost; + +//Trelis memory write operation + reg [1:0] mem_bank; + reg [1:0] mem_bank_buf; + reg [1:0] mem_bank_buf_buf; + reg mem_bank_buf_buf_buf; + reg mem_bank_buf_buf_buf_buf; + reg mem_bank_buf_buf_buf_buf_buf; + reg [9:0] wr_mem_counter; + reg [9:0] rd_mem_counter; + + reg [9:0] addr_mem_A; + reg [9:0] addr_mem_B; + reg [9:0] addr_mem_C; + reg [9:0] addr_mem_D; + + reg wr_mem_A; + reg wr_mem_B; + reg wr_mem_C; + reg wr_mem_D; + + reg [7:0] d_in_mem_A; + reg [7:0] d_in_mem_B; + reg [7:0] d_in_mem_C; + reg [7:0] d_in_mem_D; + + wire [7:0] d_o_mem_A; + wire [7:0] d_o_mem_B; + wire [7:0] d_o_mem_C; + wire [7:0] d_o_mem_D; + +//Trace back module signals + reg selection_tbu_0; + reg selection_tbu_1; + + reg [7:0] d_in_0_tbu_0; + reg [7:0] d_in_1_tbu_0; + reg [7:0] d_in_0_tbu_1; + reg [7:0] d_in_1_tbu_1; + + wire d_o_tbu_0; + wire d_o_tbu_1; + + reg enable_tbu_0; + reg enable_tbu_1; + +//Display memory operations + wire wr_disp_mem_0; + wire wr_disp_mem_1; + + wire d_in_disp_mem_0; + wire d_in_disp_mem_1; + + reg [9:0] wr_mem_counter_disp; + reg [9:0] rd_mem_counter_disp; + + reg [9:0] addr_disp_mem_0; + reg [9:0] addr_disp_mem_1; + + + assign d_out = decoder_o_reg; + + +//Branch matrc calculation modules + + bmc000 bmc000_inst(d_in,bmc000_path_0_bmc,bmc000_path_1_bmc); + bmc001 bmc001_inst(d_in,bmc001_path_0_bmc,bmc001_path_1_bmc); + bmc010 bmc010_inst(d_in,bmc010_path_0_bmc,bmc010_path_1_bmc); + bmc011 bmc011_inst(d_in,bmc011_path_0_bmc,bmc011_path_1_bmc); + bmc100 bmc100_inst(d_in,bmc100_path_0_bmc,bmc100_path_1_bmc); + bmc101 bmc101_inst(d_in,bmc101_path_0_bmc,bmc101_path_1_bmc); + bmc110 bmc110_inst(d_in,bmc110_path_0_bmc,bmc110_path_1_bmc); + bmc111 bmc111_inst(d_in,bmc111_path_0_bmc,bmc111_path_1_bmc); + + +//Add Compare Select Modules + + ACS ACS000(validity[0],validity[1],bmc000_path_0_bmc,bmc000_path_1_bmc,path_cost[0],path_cost[1],ACS000_selection,ACS000_valid_o,ACS000_path_cost); + ACS ACS001(validity[3],validity[2],bmc001_path_0_bmc,bmc001_path_1_bmc,path_cost[3],path_cost[2],ACS001_selection,ACS001_valid_o,ACS001_path_cost); + ACS ACS010(validity[4],validity[5],bmc010_path_0_bmc,bmc010_path_1_bmc,path_cost[4],path_cost[5],ACS010_selection,ACS010_valid_o,ACS010_path_cost); + ACS ACS011(validity[7],validity[6],bmc011_path_0_bmc,bmc011_path_1_bmc,path_cost[7],path_cost[6],ACS011_selection,ACS011_valid_o,ACS011_path_cost); + ACS ACS100(validity[1],validity[0],bmc100_path_0_bmc,bmc100_path_1_bmc,path_cost[1],path_cost[0],ACS100_selection,ACS100_valid_o,ACS100_path_cost); + ACS ACS101(validity[2],validity[3],bmc101_path_0_bmc,bmc101_path_1_bmc,path_cost[2],path_cost[3],ACS101_selection,ACS101_valid_o,ACS101_path_cost); + ACS ACS110(validity[5],validity[4],bmc110_path_0_bmc,bmc110_path_1_bmc,path_cost[5],path_cost[4],ACS110_selection,ACS110_valid_o,ACS110_path_cost); + ACS ACS111(validity[6],validity[7],bmc111_path_0_bmc,bmc111_path_1_bmc,path_cost[6],path_cost[7],ACS111_selection,ACS111_valid_o,ACS111_path_cost); + + + assign selection_nets = {ACS111_selection,ACS110_selection,ACS101_selection,ACS100_selection, + ACS011_selection,ACS010_selection,ACS001_selection,ACS000_selection}; + assign validity_nets = {ACS111_valid_o,ACS110_valid_o,ACS101_valid_o,ACS100_valid_o, + ACS011_valid_o,ACS010_valid_o,ACS001_valid_o,ACS000_valid_o}; + + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + begin + validity <= 8'b00000001; + selection <= 8'b00000000; + + path_cost[0] <= 8'd0; + path_cost[1] <= 8'd0; + path_cost[2] <= 8'd0; + path_cost[3] <= 8'd0; + path_cost[4] <= 8'd0; + path_cost[5] <= 8'd0; + path_cost[6] <= 8'd0; + path_cost[7] <= 8'd0; + + end + else if(enable==1'b0) + begin + validity <= 8'b00000001; + selection <= 8'b00000000; + + path_cost[0] <= 8'd0; + path_cost[1] <= 8'd0; + path_cost[2] <= 8'd0; + path_cost[3] <= 8'd0; + path_cost[4] <= 8'd0; + path_cost[5] <= 8'd0; + path_cost[6] <= 8'd0; + path_cost[7] <= 8'd0; + + end + else if( path_cost[0][7] && path_cost[1][7] && path_cost[2][7] && path_cost[3][7] && + path_cost[4][7] && path_cost[5][7] && path_cost[6][7] && path_cost[7][7] ) + begin + + validity <= validity_nets; + selection <= selection_nets; + + path_cost[0] <= 8'b01111111 & ACS000_path_cost; + path_cost[1] <= 8'b01111111 & ACS001_path_cost; + path_cost[2] <= 8'b01111111 & ACS010_path_cost; + path_cost[3] <= 8'b01111111 & ACS011_path_cost; + path_cost[4] <= 8'b01111111 & ACS100_path_cost; + path_cost[5] <= 8'b01111111 & ACS101_path_cost; + path_cost[6] <= 8'b01111111 & ACS110_path_cost; + path_cost[7] <= 8'b01111111 & ACS111_path_cost; + end + else + begin + validity <= validity_nets; + selection <= selection_nets; + + path_cost[0] <= ACS000_path_cost; + path_cost[1] <= ACS001_path_cost; + path_cost[2] <= ACS010_path_cost; + path_cost[3] <= ACS011_path_cost; + path_cost[4] <= ACS100_path_cost; + path_cost[5] <= ACS101_path_cost; + path_cost[6] <= ACS110_path_cost; + path_cost[7] <= ACS111_path_cost; + end + end + + + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + wr_mem_counter <= 10'd0; + else if(enable==1'b0) + wr_mem_counter <= 10'd0; + else + wr_mem_counter <= wr_mem_counter + 10'd1; + end + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + rd_mem_counter <= 10'b1111111111; + else if(enable==1'b0) + wr_mem_counter <= 10'd0; + else + rd_mem_counter <= rd_mem_counter - 10'd1; + end + + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + mem_bank <= 2'b00; + else begin + if(wr_mem_counter==10'b1111111111) + mem_bank <= mem_bank + 2'b01; + end + end + + + always @ (posedge clk) + begin + d_in_mem_A <= selection; + d_in_mem_B <= selection; + d_in_mem_C <= selection; + d_in_mem_D <= selection; + + end + + + always @ (posedge clk) + begin + case(mem_bank) + 2'b00: + begin + addr_mem_A <= wr_mem_counter; + addr_mem_B <= rd_mem_counter; + addr_mem_C <= 10'd0; + addr_mem_D <= rd_mem_counter; + + wr_mem_A <= 1'b1; + wr_mem_B <= 1'b0; + wr_mem_C <= 1'b0; + wr_mem_D <= 1'b0; + end + 2'b01: + begin + addr_mem_A <= rd_mem_counter; + addr_mem_B <= wr_mem_counter; + addr_mem_C <= rd_mem_counter; + addr_mem_D <= 10'd0; + + wr_mem_A <= 1'b0; + wr_mem_B <= 1'b1; + wr_mem_C <= 1'b0; + wr_mem_D <= 1'b0; + + end + 2'b10: + begin + addr_mem_A <= 10'd0; + addr_mem_B <= rd_mem_counter; + addr_mem_C <= wr_mem_counter; + addr_mem_D <= rd_mem_counter; + + wr_mem_A <= 1'b0; + wr_mem_B <= 1'b0; + wr_mem_C <= 1'b1; + wr_mem_D <= 1'b0; + end + 2'b11: + begin + addr_mem_A <= rd_mem_counter; + addr_mem_B <= 10'd0; + addr_mem_C <= rd_mem_counter; + addr_mem_D <= wr_mem_counter; + + wr_mem_A <= 1'b0; + wr_mem_B <= 1'b0; + wr_mem_C <= 1'b0; + wr_mem_D <= 1'b1; + end + endcase + end + +//Trelis memory module instantiation + + mem trelis_mem_A + ( + .clk(clk), + .wr(wr_mem_A), + .addr(addr_mem_A), + .d_i(d_in_mem_A), + .d_o(d_o_mem_A) + ); + + mem trelis_mem_B + ( + .clk(clk), + .wr(wr_mem_B), + .addr(addr_mem_B), + .d_i(d_in_mem_B), + .d_o(d_o_mem_B) + ); + + mem trelis_mem_C + ( + .clk(clk), + .wr(wr_mem_C), + .addr(addr_mem_C), + .d_i(d_in_mem_C), + .d_o(d_o_mem_C) + ); + + mem trelis_mem_D + ( + .clk(clk), + .wr(wr_mem_D), + .addr(addr_mem_D), + .d_i(d_in_mem_D), + .d_o(d_o_mem_D) + ); + +//Trace back module operation + + always @(posedge clk) + mem_bank_buf <= mem_bank; + + always @(posedge clk) + mem_bank_buf_buf <= mem_bank_buf; + + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + enable_tbu_0 <= 1'b0; + else begin + if(mem_bank_buf_buf==2'b10) + enable_tbu_0 <= 1'b1; + else + enable_tbu_0 <= enable_tbu_0; + end + end + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + enable_tbu_1 <= 1'b0; + else begin + if(mem_bank_buf_buf==2'b11) + enable_tbu_1 <= 1'b1; + else + enable_tbu_1 <= enable_tbu_1; + end + end + + always @ (posedge clk) + begin + case(mem_bank_buf_buf) + 2'b00: + begin + d_in_0_tbu_0 <= d_o_mem_D; + d_in_1_tbu_0 <= d_o_mem_C; + + d_in_0_tbu_1 <= d_o_mem_C; + d_in_1_tbu_1 <= d_o_mem_B; + + selection_tbu_0<= 1'b0; + selection_tbu_1<= 1'b1; + + end + 2'b01: + begin + d_in_0_tbu_0 <= d_o_mem_D; + d_in_1_tbu_0 <= d_o_mem_C; + + d_in_0_tbu_1 <= d_o_mem_A; + d_in_1_tbu_1 <= d_o_mem_D; + + selection_tbu_0<= 1'b1; + selection_tbu_1<= 1'b0; + end + 2'b10: + begin + d_in_0_tbu_0 <= d_o_mem_B; + d_in_1_tbu_0 <= d_o_mem_A; + + d_in_0_tbu_1 <= d_o_mem_A; + d_in_1_tbu_1 <= d_o_mem_D; + + selection_tbu_0<= 1'b0; + selection_tbu_1<= 1'b1; + end + 2'b11: + begin + d_in_0_tbu_0 <= d_o_mem_B; + d_in_1_tbu_0 <= d_o_mem_A; + + d_in_0_tbu_1 <= d_o_mem_C; + d_in_1_tbu_1 <= d_o_mem_B; + + selection_tbu_0<= 1'b1; + selection_tbu_1<= 1'b0; + end + endcase + end + +//Trace-Back modules instantiation + + tbu tbu_0 + ( + .clk(clk), + .rst(rst), + .enable(enable_tbu_0), + .selection(selection_tbu_0), + .d_in_0(d_in_0_tbu_0), + .d_in_1(d_in_1_tbu_0), + .d_o(d_o_tbu_0), + .wr_en(wr_disp_mem_0) + ); + + tbu tbu_1 + ( + .clk(clk), + .rst(rst), + .enable(enable_tbu_1), + .selection(selection_tbu_1), + .d_in_0(d_in_0_tbu_1), + .d_in_1(d_in_1_tbu_1), + .d_o(d_o_tbu_1), + .wr_en(wr_disp_mem_1) + ); + +//Display Memory modules Instantioation + + assign d_in_disp_mem_0 = d_o_tbu_0; + assign d_in_disp_mem_1 = d_o_tbu_1; + + + mem_disp disp_mem_0 + ( + .clk(clk), + .wr(wr_disp_mem_0), + .addr(addr_disp_mem_0), + .d_i(d_in_disp_mem_0), + .d_o(d_o_disp_mem_0) + ); + + mem_disp disp_mem_1 + ( + .clk(clk), + .wr(wr_disp_mem_1), + .addr(addr_disp_mem_1), + .d_i(d_in_disp_mem_1), + .d_o(d_o_disp_mem_1) + ); + +// Display memory module operation + always @ (posedge clk) + mem_bank_buf_buf_buf <= mem_bank_buf_buf[0]; + + always @ (posedge clk) + begin + if(rst==1'b0) + wr_mem_counter_disp <= 10'b0000000010; + if(enable==1'b0) + wr_mem_counter_disp <= 10'b0000000010; + else + wr_mem_counter_disp <= wr_mem_counter_disp - 10'd1; + end + + always @ (posedge clk) + begin + if(rst==1'b0) + rd_mem_counter_disp <= 10'b1111111101; + if(enable==1'b0) + rd_mem_counter_disp <= 10'b1111111101; + else + rd_mem_counter_disp <= rd_mem_counter_disp + 10'd1; + end + + + always @ (posedge clk) + begin + case(mem_bank_buf_buf_buf) + 1'b0: + begin + addr_disp_mem_0 <= rd_mem_counter_disp; + addr_disp_mem_1 <= wr_mem_counter_disp; + end + 1'b1: + begin + addr_disp_mem_0 <= wr_mem_counter_disp; + addr_disp_mem_1 <= rd_mem_counter_disp; + end + endcase + end + + + always @ (posedge clk) + mem_bank_buf_buf_buf_buf <= mem_bank_buf_buf_buf; + + always @ (posedge clk) + mem_bank_buf_buf_buf_buf_buf <= mem_bank_buf_buf_buf_buf; + + + + always @ (posedge clk) + begin + case(mem_bank_buf_buf_buf_buf_buf) + 1'b0: + begin + decoder_o_reg <= d_o_disp_mem_0; + end + 1'b1: + begin + decoder_o_reg <= d_o_disp_mem_1; + end + endcase + end + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/ACS.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/ACS.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/ACS.v (revision 2) @@ -0,0 +1,52 @@ +module ACS +( + path_0_valid, + path_1_valid, + path_0_bmc, + path_1_bmc, + path_0_pmc, + path_1_pmc, + selection, + valid_o, + path_cost +); + input path_0_valid; + input [1:0] path_0_bmc; + input [7:0] path_0_pmc; + + input path_1_valid; + input [1:0] path_1_bmc; + input [7:0] path_1_pmc; + + output reg selection; + output reg valid_o; + output [7:0] path_cost; + + + wire [7:0] path_cost_0; + wire [7:0] path_cost_1; + + assign path_cost_0 = path_0_bmc + path_0_pmc; + assign path_cost_1 = path_1_bmc + path_1_pmc; + + assign path_cost = (valid_o?(selection?path_cost_1:path_cost_0):7'd0); + + + always @ (*) + begin + valid_o = 1'b1; + + case({path_0_valid,path_1_valid}) + 2'b00: + begin + selection = 1'b0; + valid_o = 1'b0; + end + 2'b01: selection = 1'b1; + 2'b10: selection = 1'b0; + 2'b11: selection = (path_cost_0 > path_cost_1)?1'b1:1'b0; + endcase + end + + +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/viterbi_tx_rx.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/viterbi_tx_rx.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/viterbi_tx_rx.v (revision 2) @@ -0,0 +1,64 @@ +module viterbi_tx_rx( + clk, + rst, + encoder_i, + enable_encoder_i, + decoder_o +); + input clk; + input rst; + input encoder_i; + input enable_encoder_i; + output decoder_o; + + wire [1:0] encoder_o; + + + reg [3:0] error_counter; + reg [1:0] encoder_o_reg; + + reg enable_decoder_in; + wire valid_encoder_o; + + + + always @ (posedge clk or negedge rst) + begin + if(rst==1'b0) + begin + error_counter <= 4'd0; + encoder_o_reg <= 2'b00; + enable_decoder_in <= 1'b0; + end + else + begin + enable_decoder_in <= valid_encoder_o; + encoder_o_reg <= 2'b00; + error_counter <= error_counter + 4'd1; + if(error_counter==4'b1111) + encoder_o_reg <= {~encoder_o[1],encoder_o[0]}; + else + encoder_o_reg <= {encoder_o[1],encoder_o[0]}; + end + end + + + encoder encoder1 + ( + .clk(clk), + .rst(rst), + .enable_i(enable_encoder_i), + .d_in(encoder_i), + .valid_o(valid_encoder_o), + .d_out(encoder_o) + ); + + decoder decoder1 + ( + .clk(clk), + .rst(rst), + .enable(enable_decoder_in), + .d_in(encoder_o_reg), + .d_out(decoder_o) + ); +endmodule Index: viterb_encoder_and_decoder/trunk/rtl/tbu.v =================================================================== --- viterb_encoder_and_decoder/trunk/rtl/tbu.v (nonexistent) +++ viterb_encoder_and_decoder/trunk/rtl/tbu.v (revision 2) @@ -0,0 +1,224 @@ +module tbu +( + clk, + rst, + enable, + selection, + d_in_0, + d_in_1, + d_o, + wr_en +); + + input clk; + input rst; + input enable; + input selection; + input [7:0] d_in_0; + input [7:0] d_in_1; + output reg d_o; + output reg wr_en; + + + reg d_o_reg; + reg wr_en_reg; + + + reg [2:0] pstate; + reg [2:0] nstate; + + reg selection_buf; + + always @(posedge clk) + begin + selection_buf <= selection; + wr_en <= wr_en_reg; + d_o <= d_o_reg; + end + always @(posedge clk or negedge rst) + begin + if(rst==1'b0) + pstate <= 3'b000; + else if(enable==1'b0) + pstate <= 3'b000; + else if(selection_buf==1'b1 && selection==1'b0) + pstate <= 3'b000; + else + pstate <= nstate; + end + + + always @(*) + begin + case (pstate) + 3'b000: + begin + if(selection==1'b0) + begin + wr_en_reg = 1'b0; + case(d_in_0[0]) + 1'b0: nstate = 3'b000; + 1'b1: nstate = 3'b001; + endcase + end + else + begin + d_o_reg = d_in_1[0]; + wr_en_reg = 1'b1; + case(d_in_1[0]) + 1'b0: nstate = 3'b000; + 1'b1: nstate = 3'b001; + endcase + end + end + + 3'b001: + begin + if(selection==1'b0) + begin + wr_en_reg = 1'b0; + case(d_in_0[1]) + 1'b0: nstate = 3'b011; + 1'b1: nstate = 3'b010; + endcase + end + else + begin + d_o_reg = d_in_1[1]; + wr_en_reg = 1'b1; + case(d_in_1[1]) + 1'b0: nstate = 3'b011; + 1'b1: nstate = 3'b010; + endcase + end + end + + 3'b010: + begin + if(selection==1'b0) + begin + wr_en_reg = 1'b0; + case(d_in_0[2]) + 1'b0: nstate = 3'b100; + 1'b1: nstate = 3'b101; + endcase + end + else + begin + d_o_reg = d_in_1[2]; + wr_en_reg = 1'b1; + case(d_in_1[2]) + 1'b0: nstate = 3'b100; + 1'b1: nstate = 3'b101; + endcase + end + end + + 3'b011: + begin + if(selection==1'b0) + begin + wr_en_reg = 1'b0; + case(d_in_0[3]) + 1'b0: nstate = 3'b111; + 1'b1: nstate = 3'b110; + endcase + end + else + begin + d_o_reg = d_in_1[3]; + wr_en_reg = 1'b1; + case(d_in_1[3]) + 1'b0: nstate = 3'b111; + 1'b1: nstate = 3'b110; + endcase + end + end + + 3'b100: + begin + if(selection==1'b0) + begin + wr_en_reg = 1'b0; + case(d_in_0[4]) + 1'b0: nstate = 3'b001; + 1'b1: nstate = 3'b000; + endcase + end + else + begin + d_o_reg = d_in_1[4]; + wr_en_reg = 1'b1; + case(d_in_1[4]) + 1'b0: nstate = 3'b001; + 1'b1: nstate = 3'b000; + endcase + end + end + + 3'b101: + begin + if(selection==1'b0) + begin + wr_en_reg = 1'b0; + case(d_in_0[5]) + 1'b0: nstate = 3'b010; + 1'b1: nstate = 3'b011; + endcase + end + else + begin + d_o_reg = d_in_1[5]; + wr_en_reg = 1'b1; + case(d_in_1[5]) + 1'b0: nstate = 3'b010; + 1'b1: nstate = 3'b011; + endcase + end + end + + 3'b110: + begin + if(selection==1'b0) + begin + wr_en_reg = 1'b0; + case(d_in_0[6]) + 1'b0: nstate = 3'b101; + 1'b1: nstate = 3'b100; + endcase + end + else + begin + d_o_reg = d_in_1[6]; + wr_en_reg = 1'b1; + case(d_in_1[6]) + 1'b0: nstate = 3'b101; + 1'b1: nstate = 3'b100; + endcase + end + end + + 3'b111: + begin + if(selection==1'b0) + begin + wr_en_reg = 1'b0; + case(d_in_0[7]) + 1'b0: nstate = 3'b110; + 1'b1: nstate = 3'b111; + endcase + end + else + begin + d_o_reg = d_in_1[7]; + wr_en_reg = 1'b1; + case(d_in_1[7]) + 1'b0: nstate = 3'b110; + 1'b1: nstate = 3'b111; + endcase + end + end + endcase + end + +endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.