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

Subversion Repositories cavlc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /cavlc
    from Rev 5 to Rev 6
    Reverse comparison

Rev 5 → Rev 6

/trunk/rtl/cavlc_read_total_coeffs.v
0,0 → 1,1161
//2011-8-7 initial creation
//2011-8-9 optimize output mux
//2011-9-10 reduce nC to 5 bits
 
 
`include "defines.v"
 
module cavlc_read_total_coeffs(
clk, rst_n,
ena,
start,
sel,
rbsp, nC,
 
TrailingOnes, TotalCoeff,
TrailingOnes_comb, TotalCoeff_comb,
len_comb
);
//------------------------
//ports
//------------------------
input clk, rst_n;
input ena;
 
input start;
input sel;
 
 
input [0:15] rbsp;
input signed [4:0] nC;
 
output [4:0] TotalCoeff; //range from 0 to 16
output [1:0] TrailingOnes; //range from 0 to 3
output [4:0] TotalCoeff_comb; //unsaved result of TotalCoeff_comb
output [1:0] TrailingOnes_comb; //unsaved result of TrailingOnes_comb
output [4:0] len_comb; //indicate how many rbsp bit consumed, range from 0 to 16
 
 
//------------------------
//regs
//------------------------
reg [4:0] TotalCoeff_comb;
reg [1:0] TrailingOnes_comb;
reg [4:0] len_comb;
 
//for nC >= 0 && nC < 2
reg [4:0] TotalCoeff_1;
reg [1:0] TrailingOnes_1;
reg [4:0] len_1;
 
//for nC >= 2 && nC < 4
reg [4:0] TotalCoeff_2;
reg [1:0] TrailingOnes_2;
reg [4:0] len_2;
 
//for nC >= 4 && nC < 8
reg [4:0] TotalCoeff_3;
reg [1:0] TrailingOnes_3;
reg [4:0] len_3;
 
//for nC >= 8
reg [4:0] TotalCoeff_4;
reg [1:0] TrailingOnes_4;
reg [4:0] len_4;
 
//for nC == -1
reg [4:0] TotalCoeff_5;
reg [1:0] TrailingOnes_5;
reg [4:0] len_5;
 
 
//------------------------
//FFs
//------------------------
//len is not necessary to be saved
//TotalCoeff & TrailingOnes should be valid when cavlc_state == `cavlc_read_total_coeffs_s
//to do that,combinational result "TotalCoeff_comb & TrailingOnes_comb" are outputed
reg [0:15] rbsp_1;
reg [0:13] rbsp_2;
reg [0:9] rbsp_3;
reg [0:5] rbsp_4;
reg [0:7] rbsp_5;
 
reg [4:0] TotalCoeff;
reg [1:0] TrailingOnes;
 
//------------------------
//input mux
//------------------------
wire rbsp_refresh = ena && start;
 
always @(posedge clk or negedge rst_n)
if (!rst_n)
begin
rbsp_1 <= 0;
rbsp_2 <= 0;
rbsp_3 <= 0;
rbsp_4 <= 0;
rbsp_5 <= 0;
 
end
else if (rbsp_refresh)
begin
if (nC[4])
rbsp_5 <= rbsp[0:7];
else if (nC[3])
rbsp_4 <= rbsp[0:5];
else if (nC[2])
rbsp_3 <= rbsp[0:9];
else if (nC[1])
rbsp_2 <= rbsp[0:13];
else
rbsp_1 <= rbsp;
end
//------------------------
//nC >= 0 && nC < 2
//------------------------
always @(rbsp_1)
case (1'b1)
rbsp_1[0] : begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 0;
len_1 <= 1;
end
rbsp_1[1] : begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 1;
len_1 <= 2;
end
rbsp_1[2] : begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 2;
len_1 <= 3;
end
rbsp_1[3] : begin
if (rbsp_1[4] == 'b1) begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 3;
len_1 <= 5;
end
else if (rbsp_1[5] == 'b1) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 1;
len_1 <= 6;
end
else begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 2;
len_1 <= 6;
end
end
rbsp_1[4] : begin
if (rbsp_1[5] == 'b1) begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 4;
len_1 <= 6;
end
else if (rbsp_1[6] == 'b1) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 3;
len_1 <= 7;
end
else begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 5;
len_1 <= 7;
end
end
rbsp_1[5] : begin
len_1 <= 8;
if (rbsp_1[6:7] == 'b11) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 2;
end
else if (rbsp_1[6:7] == 'b10) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 3;
end
else if (rbsp_1[6:7] == 'b01) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 4;
end
else begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 6;
end
end
rbsp_1[6] : begin
len_1 <= 9;
if (rbsp_1[7:8] == 2'b11) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 3;
end
else if (rbsp_1[7:8] == 2'b10) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 4;
end
else if (rbsp_1[7:8] == 2'b01) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 5;
end
else begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 7;
end
end
rbsp_1[7] : begin
len_1 <= 10;
if (rbsp_1[8:9] == 2'b11) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 4;
end
else if (rbsp_1[8:9] == 2'b10) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 5;
end
else if (rbsp_1[8:9] == 2'b01) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 6;
end
else begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 8;
end
end
rbsp_1[8] : begin
len_1 <= 11;
if (rbsp_1[9:10] == 2'b11) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 5;
end
else if (rbsp_1[9:10] == 2'b10) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 6;
end
else if (rbsp_1[9:10] == 2'b01) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 7;
end
else begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 9;
end
end
rbsp_1[9] : begin
len_1 <= 13;
if (rbsp_1[10:12] == 3'b111) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 6;
end
else if (rbsp_1[10:12] == 3'b011) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 7;
end
else if (rbsp_1[10:12] == 3'b110) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 7;
end
else if (rbsp_1[10:12] == 3'b000) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 8;
end
else if (rbsp_1[10:12] == 3'b010) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 8;
end
else if (rbsp_1[10:12] == 3'b101) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 8;
end
else if (rbsp_1[10:12] == 3'b001) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 9;
end
else begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 10;
end
end
rbsp_1[10] : begin
len_1 <= 14;
if (rbsp_1[11:13] == 3'b111) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 9;
end
else if (rbsp_1[11:13] == 3'b110) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 9;
end
else if (rbsp_1[11:13] == 3'b011) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 10;
end
else if (rbsp_1[11:13] == 3'b010) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 10;
end
else if (rbsp_1[11:13] == 3'b101) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 10;
end
else if (rbsp_1[11:13] == 3'b001) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 11;
end
else if (rbsp_1[11:13] == 3'b100) begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 11;
end
else begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 12;
end
end
rbsp_1[11] : begin
len_1 <= 15;
if (rbsp_1[12:14] == 3'b111) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 11;
end
else if (rbsp_1[12:14] == 3'b110) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 11;
end
else if (rbsp_1[12:14] == 3'b011) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 12;
end
else if (rbsp_1[12:14] == 3'b010) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 12;
end
else if (rbsp_1[12:14] == 3'b101) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 12;
end
else if (rbsp_1[12:14] == 3'b001) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 13;
end
else if (rbsp_1[12:14] == 3'b100) begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 13;
end
else begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 14;
end
end
rbsp_1[12] : begin
len_1 <= 16;
if (rbsp_1[13:15] == 3'b111) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 13;
end
else if (rbsp_1[13:15] == 3'b011) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 14;
end
else if (rbsp_1[13:15] == 3'b110) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 14;
end
else if (rbsp_1[13:15] == 3'b101) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 14;
end
else if (rbsp_1[13:15] == 3'b010) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 15;
end
else if (rbsp_1[13:15] == 3'b001) begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 15;
end
else if (rbsp_1[13:15] == 3'b100) begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 15;
end
else begin
TrailingOnes_1 <= 3;
TotalCoeff_1 <= 16;
end
end
rbsp_1[13] : begin
len_1 <= 16;
if (rbsp_1[14:15] == 2'b11) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 15;
end
else if (rbsp_1[14:15] == 2'b00) begin
TrailingOnes_1 <= 0;
TotalCoeff_1 <= 16;
end
else if (rbsp_1[14:15] == 2'b10) begin
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 16;
end
else begin
TrailingOnes_1 <= 2;
TotalCoeff_1 <= 16;
end
end
default : begin
len_1 <= 15;
TrailingOnes_1 <= 1;
TotalCoeff_1 <= 13;
end
endcase
 
//------------------------
//nC >= 2 && nC < 4
//------------------------
always @(rbsp_2)
case (1'b1)
rbsp_2[0] : begin
len_2 <= 2;
if (rbsp_2[1] == 'b1) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 0;
end
else begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 1;
end
end
rbsp_2[1] : begin
if (rbsp_2[2] == 'b1) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 2;
len_2 <= 3;
end
else if (rbsp_2[3] == 'b1) begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 3;
len_2 <= 4;
end
else begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 4;
len_2 <= 4;
end
end
rbsp_2[2] : begin
if (rbsp_2[3:4] == 'b11) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 2;
len_2 <= 5;
end
else if (rbsp_2[3:4] == 'b10) begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 5;
len_2 <= 5;
end
else if (rbsp_2[4:5] == 'b11) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 1;
len_2 <= 6;
end
else if (rbsp_2[4:5] == 'b10) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 3;
len_2 <= 6;
end
else if (rbsp_2[4:5] == 'b01) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 3;
len_2 <= 6;
end
else begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 6;
len_2 <= 6;
end
end
rbsp_2[3] : begin
len_2 <= 6;
if (rbsp_2[4:5] == 'b11) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 2;
end
else if (rbsp_2[4:5] == 'b10) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 4;
end
else if (rbsp_2[4:5] == 'b01) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 4;
end
else begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 7;
end
end
rbsp_2[4] : begin
len_2 <= 7;
if (rbsp_2[5:6] == 'b11) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 3;
end
else if (rbsp_2[5:6] == 'b10) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 5;
end
else if (rbsp_2[5:6] == 'b01) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 5;
end
else begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 8;
end
end
rbsp_2[5] : begin
len_2 <= 8;
if (rbsp_2[6:7] == 'b11) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 4;
end
else if (rbsp_2[6:7] == 'b00) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 5;
end
else if (rbsp_2[6:7] == 'b10) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 6;
end
else begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 6;
end
end
rbsp_2[6] : begin
len_2 <= 9;
if (rbsp_2[7:8] == 'b11) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 6;
end
else if (rbsp_2[7:8] == 'b10) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 7;
end
else if (rbsp_2[7:8] == 'b01) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 7;
end
else begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 9;
end
end
rbsp_2[7] : begin
len_2 <= 11;
if (rbsp_2[8:10] == 'b111) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 7;
end
else if (rbsp_2[8:10] == 'b011) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 8;
end
else if (rbsp_2[8:10] == 'b110) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 8;
end
else if (rbsp_2[8:10] == 'b101) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 8;
end
else if (rbsp_2[8:10] == 'b010) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 9;
end
else if (rbsp_2[8:10] == 'b001) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 9;
end
else if (rbsp_2[8:10] == 'b100) begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 10;
end
else begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 11;
end
end
rbsp_2[8] : begin
len_2 <= 12;
if (rbsp_2[9:11] == 'b111) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 9;
end
else if (rbsp_2[9:11] == 'b011) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 10;
end
else if (rbsp_2[9:11] == 'b110) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 10;
end
else if (rbsp_2[9:11] == 'b101) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 10;
end
else if (rbsp_2[9:11] == 'b000) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 11;
end
else if (rbsp_2[9:11] == 'b010) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 11;
end
else if (rbsp_2[9:11] == 'b001) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 11;
end
else begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 12;
end
end
rbsp_2[9] : begin
len_2 <= 13;
if (rbsp_2[10:12] == 'b111) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 12;
end
else if (rbsp_2[10:12] == 'b110) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 12;
end
else if (rbsp_2[10:12] == 'b101) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 12;
end
else if (rbsp_2[10:12] == 'b011) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 13;
end
else if (rbsp_2[10:12] == 'b010) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 13;
end
else if (rbsp_2[10:12] == 'b001) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 13;
end
else if (rbsp_2[10:12] == 'b100) begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 13;
end
else begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 14;
end
end
rbsp_2[10] : begin
if (rbsp_2[11:12] == 'b11) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 14;
len_2 <= 13;
end
else if (rbsp_2[11:12] == 'b10) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 14;
len_2 <= 13;
end
else if (rbsp_2[12:13] == 'b11) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 14;
len_2 <= 14;
end
else if (rbsp_2[12:13] == 'b01) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 15;
len_2 <= 14;
end
else if (rbsp_2[12:13] == 'b00) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 15;
len_2 <= 14;
end
else begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 15;
len_2 <= 14;
end
end
rbsp_2[11] : begin
len_2 <= 14;
if (rbsp_2[12:13] == 'b11) begin
TrailingOnes_2 <= 0;
TotalCoeff_2 <= 16;
end
else if (rbsp_2[12:13] == 'b10) begin
TrailingOnes_2 <= 1;
TotalCoeff_2 <= 16;
end
else if (rbsp_2[12:13] == 'b01) begin
TrailingOnes_2 <= 2;
TotalCoeff_2 <= 16;
end
else begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 16;
end
end
default : begin
TrailingOnes_2 <= 3;
TotalCoeff_2 <= 15;
len_2 <= 13;
end
endcase
 
//------------------------
// nC >= 4 && nC < 8
//------------------------
always @(rbsp_3)
case (1'b1)
rbsp_3[0] : begin
len_3 <= 4;
case (rbsp_3[1:3])
'b111 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 0;
end
'b110 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 1;
end
'b101 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 2;
end
'b100 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 3;
end
'b011 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 4;
end
'b010 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 5;
end
'b001 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 6;
end
'b000 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 7;
end
endcase
end
rbsp_3[1] : begin
len_3 <= 5;
case (rbsp_3[2:4])
'b111 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 2;
end
'b100 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 3;
end
'b110 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 3;
end
'b010 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 4;
end
'b011 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 4;
end
'b000 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 5;
end
'b001 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 5;
end
'b101 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 8;
end
endcase
end
rbsp_3[2] : begin
len_3 <= 6;
case (rbsp_3[3:5])
3'b111 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 1;
end
3'b011 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 2;
end
3'b000 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 3;
end
3'b110 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 6;
end
3'b101 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 6;
end
3'b010 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 7;
end
3'b001 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 7;
end
3'b100 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 9;
end
endcase
end
rbsp_3[3] : begin
len_3 <= 7;
case (rbsp_3[4:6])
'b111 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 4;
end
'b011 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 5;
end
'b001 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 6;
end
'b000 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 7;
end
'b110 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 8;
end
'b101 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 8;
end
 
'b010 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 9;
end
'b100 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 10;
end
endcase
end
rbsp_3[4] : begin
len_3 <= 8;
case (rbsp_3[5:7])
'b111 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 8;
end
'b011 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 9;
end
'b110 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 9;
end
'b010 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 10;
end
'b101 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 10;
end
'b001 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 11;
end
'b100 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 11;
end
'b000 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 12;
end
endcase
end
rbsp_3[5] : begin
len_3 <= 9;
case (rbsp_3[6:8])
'b111 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 10;
end
'b011 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 11;
end
'b110 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 11;
end
'b000 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 12;
end
'b010 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 12;
end
'b101 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 12;
end
'b001 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 13;
end
'b100 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 13;
end
endcase
end
rbsp_3[6] : begin
if (rbsp_3[7:8] == 'b11)begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 13;
len_3 <= 9;
end
else if (rbsp_3[7:9] == 'b101)begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 13;
len_3 <= 10;
end
else if (rbsp_3[7:9] == 'b001)begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 14;
len_3 <= 10;
end
else if (rbsp_3[7:9] == 'b100)begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 14;
len_3 <= 10;
end
else if (rbsp_3[7:9] == 'b011)begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 14;
len_3 <= 10;
end
else if (rbsp_3[7:9] == 'b010)begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 14;
len_3 <= 10;
end
else begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 15;
len_3 <= 10;
end
end
rbsp_3[7] : begin
len_3 <= 10;
case (rbsp_3[8:9])
'b01 : begin
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 15;
end
'b11 : begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 15;
end
'b10 : begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 15;
end
'b00 : begin
TrailingOnes_3 <= 1;
TotalCoeff_3 <= 16;
end
endcase
end
rbsp_3[8] : begin
len_3 <= 10;
if (rbsp_3[9] == 'b1)begin
TrailingOnes_3 <= 2;
TotalCoeff_3 <= 16;
end
else begin
TrailingOnes_3 <= 3;
TotalCoeff_3 <= 16;
end
end
default : begin
len_3 <= 10;
TrailingOnes_3 <= 0;
TotalCoeff_3 <= 16;
end
endcase
 
//------------------ Colum 4 : nC >= 8---------------------
always @(rbsp_4)
begin
len_4 <= 6;
if (rbsp_4[0:4] == 5'b00001) begin
TrailingOnes_4 <= 0;
TotalCoeff_4 <= 0;
end
else begin
TrailingOnes_4 <= rbsp_4[4:5];
TotalCoeff_4 <= rbsp_4[0:3] + 1'b1;
end
end
 
//------------------------
// nC == -1
//------------------------
always @(rbsp_5)
case (1'b1)
rbsp_5[0] : begin
TrailingOnes_5 <= 1;
TotalCoeff_5 <= 1;
len_5 <= 1;
end
rbsp_5[1] : begin
TrailingOnes_5 <= 0;
TotalCoeff_5 <= 0;
len_5 <= 2;
end
rbsp_5[2] : begin
TrailingOnes_5 <= 2;
TotalCoeff_5 <= 2;
len_5 <= 3;
end
rbsp_5[3] : begin
len_5 <= 6;
if (rbsp_5[4:5] == 'b11) begin
TrailingOnes_5 <= 0;
TotalCoeff_5 <= 1;
end
else if (rbsp_5[4:5] == 'b00) begin
TrailingOnes_5 <= 0;
TotalCoeff_5 <= 2;
end
else if (rbsp_5[4:5] == 'b10) begin
TrailingOnes_5 <= 1;
TotalCoeff_5 <= 2;
end
else begin
TrailingOnes_5 <= 3;
TotalCoeff_5 <= 3;
end
end
rbsp_5[4] : begin
len_5 <= 6;
if (rbsp_5[5] == 'b1) begin
TrailingOnes_5 <= 0;
TotalCoeff_5 <= 3;
end
else begin
TrailingOnes_5 <= 0;
TotalCoeff_5 <= 4;
end
end
rbsp_5[5] : begin
len_5 <= 7;
if (rbsp_5[6] == 'b1) begin
TrailingOnes_5 <= 1;
TotalCoeff_5 <= 3;
end
else begin
TrailingOnes_5 <= 2;
TotalCoeff_5 <= 3;
end
end
rbsp_5[6] : begin
len_5 <= 8;
if (rbsp_5[7] == 'b1) begin
TrailingOnes_5 <= 1;
TotalCoeff_5 <= 4;
end
else begin
TrailingOnes_5 <= 2;
TotalCoeff_5 <= 4;
end
end
default : begin
len_5 <= 7;
TrailingOnes_5 <= 3;
TotalCoeff_5 <= 4;
end
endcase
 
//------------------------
//output mux
//------------------------
//startect a colum according to nC
always @(*)
begin
if (nC == -1) begin
TrailingOnes_comb <= TrailingOnes_5;
TotalCoeff_comb <= TotalCoeff_5;
len_comb <= len_5;
end
else if (nC[3]) begin
TrailingOnes_comb <= TrailingOnes_4;
TotalCoeff_comb <= TotalCoeff_4;
len_comb <= len_4;
end
else if (nC[2]) begin
TrailingOnes_comb <= TrailingOnes_3;
TotalCoeff_comb <= TotalCoeff_3;
len_comb <= len_3;
end
else if (nC[1]) begin
TrailingOnes_comb <= TrailingOnes_2;
TotalCoeff_comb <= TotalCoeff_2;
len_comb <= len_2;
end
else begin
TrailingOnes_comb <= TrailingOnes_1;
TotalCoeff_comb <= TotalCoeff_1;
len_comb <= len_1;
end
end
//------------------------
//TrailingOnes & TotalCoeff
//------------------------
wire output_refresh = ena && sel;
 
always @(posedge clk or negedge rst_n)
if (~rst_n) begin
TrailingOnes <= 0;
TotalCoeff <= 0;
end
else if (output_refresh) begin
TrailingOnes <= TrailingOnes_comb;
TotalCoeff <= TotalCoeff_comb;
end
 
endmodule
 
/trunk/rtl/cavlc_read_run_befores.v
0,0 → 1,330
//2011-8-16 initiial revision
 
`include "defines.v"
 
module cavlc_read_run_befores(
clk,
rst_n,
ena,
sel,
clr,
ZeroLeft_init,
rbsp,
i,
TotalZeros_comb,
level_0,
level_1,
level_2,
level_3,
level_4,
level_5,
level_6,
level_7,
level_8,
level_9,
level_10,
level_11,
level_12,
level_13,
level_14,
level_15,
coeff_0,
coeff_1,
coeff_2,
coeff_3,
coeff_4,
coeff_5,
coeff_6,
coeff_7,
coeff_8,
coeff_9,
coeff_10,
coeff_11,
coeff_12,
coeff_13,
coeff_14,
coeff_15,
ZeroLeft,
len_comb
);
//----------------------
//ports
//----------------------
input clk;
input rst_n;
input ena;
input sel;
input clr;
input ZeroLeft_init;
 
input [0:10] rbsp;
input [3:0] i; //range from TotalCoeff-1 to 0
input [3:0] TotalZeros_comb;
 
input [8:0] level_0;
input [8:0] level_1;
input [8:0] level_2;
input [8:0] level_3;
input [8:0] level_4;
input [8:0] level_5;
input [8:0] level_6;
input [8:0] level_7;
input [8:0] level_8;
input [8:0] level_9;
input [8:0] level_10;
input [8:0] level_11;
input [8:0] level_12;
input [8:0] level_13;
input [8:0] level_14;
input [8:0] level_15;
 
output [8:0] coeff_0;
output [8:0] coeff_1;
output [8:0] coeff_2;
output [8:0] coeff_3;
output [8:0] coeff_4;
output [8:0] coeff_5;
output [8:0] coeff_6;
output [8:0] coeff_7;
output [8:0] coeff_8;
output [8:0] coeff_9;
output [8:0] coeff_10;
output [8:0] coeff_11;
output [8:0] coeff_12;
output [8:0] coeff_13;
output [8:0] coeff_14;
output [8:0] coeff_15;
 
output [3:0] ZeroLeft;
 
output [3:0] len_comb;
 
//----------------------
//regs
//----------------------
reg [3:0] run;
reg [3:0] len;
reg [8:0] coeff;
 
 
reg [3:0] len_comb;
 
//----------------------
//FFs
//----------------------
reg [3:0] ZeroLeft;
 
reg [8:0] coeff_0;
reg [8:0] coeff_1;
reg [8:0] coeff_2;
reg [8:0] coeff_3;
reg [8:0] coeff_4;
reg [8:0] coeff_5;
reg [8:0] coeff_6;
reg [8:0] coeff_7;
reg [8:0] coeff_8;
reg [8:0] coeff_9;
reg [8:0] coeff_10;
reg [8:0] coeff_11;
reg [8:0] coeff_12;
reg [8:0] coeff_13;
reg [8:0] coeff_14;
reg [8:0] coeff_15;
 
//----------------------
//run & len
//----------------------
always @(rbsp or ZeroLeft or ena or sel)
if (ena && sel)
case(ZeroLeft)
0 : begin len <= 0; run <= 0; end
1 : begin len <= 1; run <= rbsp[0]? 0:1; end
2 : begin if (rbsp[0]) begin
run <= 0;
len <= 1;
end
else if (rbsp[1]) begin
run <= 1;
len <= 2;
end
else begin
run <= 2;
len <= 2;
end
end
3 : begin
run <= 3 - rbsp[0:1];
len <= 2;
end
4 : begin
if (rbsp[0:1] != 0) begin
run <= 3 - rbsp[0:1];
len <= 2;
end
else begin
run <= rbsp[2]? 3:4;
len <= 3;
end
end
5 : begin
if (rbsp[0]) begin
run <= rbsp[1]? 0:1;
len <= 2;
end
else if (rbsp[1]) begin
run <= rbsp[2]? 2:3;
len <= 3;
end
else begin
run <= rbsp[2]? 4:5;
len <= 3;
end
end
6 : begin
if (rbsp[0:1] == 2'b11) begin
run <= 0;
len <= 2;
end
else begin
len <= 3;
case(rbsp[0:2])
3'b000 : run <= 1;
3'b001 : run <= 2;
3'b011 : run <= 3;
3'b010 : run <= 4;
3'b101 : run <= 5;
default: run <= 6;
endcase
end
end
default : begin
if (rbsp[0:2] != 0) begin
run <= 7 - rbsp[0:2];
len <= 3;
end
else begin
case (1'b1)
rbsp[3] : begin run <= 7; len <= 4; end
rbsp[4] : begin run <= 8; len <= 5; end
rbsp[5] : begin run <= 9; len <= 6; end
rbsp[6] : begin run <= 10; len <= 7; end
rbsp[7] : begin run <= 11; len <= 8; end
rbsp[8] : begin run <= 12; len <= 9; end
rbsp[9] : begin run <= 13; len <= 10;end
rbsp[10]: begin run <= 14; len <= 11;end
default : begin run <= 'bx; len <='bx;end
endcase
end
end
endcase
else begin
len <= 0;
run <= 0;
end
 
//----------------------
//len_comb
//----------------------
always @(*)
if (i > 0)
len_comb <= len;
else
len_comb <= 0;
//----------------------
//ZeroLeft
//----------------------
always @(posedge clk or negedge rst_n)
if (!rst_n)
ZeroLeft <= 0;
else if (ena && clr) //in case TotalCoeff >= max_coeff_num
ZeroLeft <= 0;
else if (ena && ZeroLeft_init)
ZeroLeft <= TotalZeros_comb;
else if (ena && sel )//if ZeroLeft == 0, run will be 0
ZeroLeft <= ZeroLeft - run;
//----------------------
//coeff
//----------------------
always @(*)
if (ena && sel)
case (i)
0 :coeff <= level_0;
1 :coeff <= level_1;
2 :coeff <= level_2;
3 :coeff <= level_3;
4 :coeff <= level_4;
5 :coeff <= level_5;
6 :coeff <= level_6;
7 :coeff <= level_7;
8 :coeff <= level_8;
9 :coeff <= level_9;
10:coeff <= level_10;
11:coeff <= level_11;
12:coeff <= level_12;
13:coeff <= level_13;
14:coeff <= level_14;
15:coeff <= level_15;
endcase
else
coeff <= 0;
 
//----------------------
//coeff_0 to coeff_15
//----------------------
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
coeff_0 <= 0; coeff_1 <= 0; coeff_2 <= 0; coeff_3 <= 0;
coeff_4 <= 0; coeff_5 <= 0; coeff_6 <= 0; coeff_7 <= 0;
coeff_8 <= 0; coeff_9 <= 0; coeff_10<= 0; coeff_11<= 0;
coeff_12<= 0; coeff_13<= 0; coeff_14<= 0; coeff_15<= 0;
end
else if (ena && clr) begin
coeff_0 <= 0; coeff_1 <= 0; coeff_2 <= 0; coeff_3 <= 0;
coeff_4 <= 0; coeff_5 <= 0; coeff_6 <= 0; coeff_7 <= 0;
coeff_8 <= 0; coeff_9 <= 0; coeff_10<= 0; coeff_11<= 0;
coeff_12<= 0; coeff_13<= 0; coeff_14<= 0; coeff_15<= 0;
end
else if (ena && sel && ZeroLeft > 0)
case (ZeroLeft+i)
1 :coeff_1 <= coeff;
2 :coeff_2 <= coeff;
3 :coeff_3 <= coeff;
4 :coeff_4 <= coeff;
5 :coeff_5 <= coeff;
6 :coeff_6 <= coeff;
7 :coeff_7 <= coeff;
8 :coeff_8 <= coeff;
9 :coeff_9 <= coeff;
10:coeff_10 <= coeff;
11:coeff_11 <= coeff;
12:coeff_12 <= coeff;
13:coeff_13 <= coeff;
14:coeff_14 <= coeff;
default:
coeff_15 <= coeff;
endcase
else if (ena && sel) begin
if (i >= 0) coeff_0 <= level_0;
if (i >= 1) coeff_1 <= level_1;
if (i >= 2) coeff_2 <= level_2;
if (i >= 3) coeff_3 <= level_3;
if (i >= 4) coeff_4 <= level_4;
if (i >= 5) coeff_5 <= level_5;
if (i >= 6) coeff_6 <= level_6;
if (i >= 7) coeff_7 <= level_7;
if (i >= 8) coeff_8 <= level_8;
if (i >= 9) coeff_9 <= level_9;
if (i >= 10)coeff_10 <= level_10;
if (i >= 11)coeff_11 <= level_11;
if (i >= 12)coeff_12 <= level_12;
if (i >= 13)coeff_13 <= level_13;
if (i >= 14)coeff_14 <= level_14;
if (i == 15)coeff_15 <= level_15;
end
endmodule
/trunk/rtl/cavlc_fsm.v
0,0 → 1,125
//2011-8-7 18:57 initial revision
 
`include "defines.v"
 
module cavlc_fsm
(
clk,
rst_n,
ena,
start,
max_coeff_num,
TotalCoeff,
TotalCoeff_comb,
TrailingOnes,
TrailingOnes_comb,
ZeroLeft,
state,
i,
idle,
valid
);
//------------------------
//ports
//------------------------
input clk;
input rst_n;
input ena;
input start;
 
input [4:0] max_coeff_num;
input [4:0] TotalCoeff;
input [4:0] TotalCoeff_comb;
input [1:0] TrailingOnes;
input [1:0] TrailingOnes_comb;
input [3:0] ZeroLeft;
 
output [7:0] state;
output [3:0] i;
output idle;
output valid;
 
//------------------------
//FFs
//------------------------
reg [7:0] state;
reg [3:0] i;
reg valid;
 
//------------------------
//state & i & valid
//------------------------
always @(posedge clk or negedge rst_n)
if (~rst_n) begin
state <= `cavlc_idle_s;
i <= 0;
valid <= 0;
end
else if (ena)
case(state)
`cavlc_idle_s : begin
if (start) begin
state <= `cavlc_read_total_coeffs_s;
valid <= 0;
end
else begin
state <= `cavlc_idle_s;
end
end
`cavlc_read_total_coeffs_s : begin
i <= TotalCoeff_comb -1;
if (TrailingOnes_comb > 0 && TotalCoeff_comb > 0)
state <= `cavlc_read_t1s_flags_s;
else if (TotalCoeff_comb > 0)
state <= `cavlc_read_level_prefix_s;
else begin
state <= `cavlc_idle_s;
valid <= 1;
end
end
`cavlc_read_t1s_flags_s : begin
if (TrailingOnes == TotalCoeff) //TotalCoeff should not be larger than max_coeff_num
state <= `cavlc_read_total_zeros_s;
else begin
state <= `cavlc_read_level_prefix_s;
i <= i - TrailingOnes;
end
end
`cavlc_read_level_prefix_s : begin
state <= `cavlc_read_level_suffix_s;
end
`cavlc_read_level_suffix_s : begin
state <= `cavlc_calc_level_s;
end
`cavlc_calc_level_s : begin
if ( i == 0 && TotalCoeff < max_coeff_num)
state <= `cavlc_read_total_zeros_s;
else if (i == 0) begin
state <= `cavlc_read_run_befores_s;
i <= TotalCoeff - 1;
end
else begin
state <= `cavlc_read_level_prefix_s;
i <= i - 1;
end
end
`cavlc_read_total_zeros_s : begin
state <= `cavlc_read_run_befores_s;
i <= TotalCoeff - 1;
end
`cavlc_read_run_befores_s : begin
if (i == 0 || ZeroLeft == 0) begin
state <= `cavlc_idle_s;
valid <= 1;
end
else begin
state <= `cavlc_read_run_befores_s;
i <= i - 1;
end
end
endcase
 
assign idle = state[`cavlc_idle_bit];
 
endmodule
 
/trunk/rtl/cavlc_read_levels.v
0,0 → 1,353
//2011-8-6 initiial revision
//2011-8-19 reverse the order of level
 
// include TrailingOnes
 
`include "defines.v"
 
module cavlc_read_levels (
clk,
rst_n,
ena,
t1s_sel,
prefix_sel,
suffix_sel,
calc_sel,
TrailingOnes,
TotalCoeff,
rbsp,
i,
level_0, level_1, level_2, level_3, level_4, level_5, level_6, level_7,
level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15,
len_comb
);
//------------------------
// ports
//------------------------
input clk;
input rst_n;
 
input ena;
input t1s_sel;
input prefix_sel;
input suffix_sel;
input calc_sel;
 
input [1:0] TrailingOnes;
input [4:0] TotalCoeff;
input [0:15] rbsp;
input [3:0] i;
 
output [8:0] level_0, level_1, level_2, level_3, level_4, level_5, level_6, level_7;
output [8:0] level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15;
output [4:0] len_comb;
 
//------------------------
// regs
//------------------------
reg [0:15] rbsp_prefix; //for level_prefix_comb
reg [3:0] level_prefix_comb;
reg [8:0] level_suffix;
reg [4:0] len_comb;
 
//------------------------
// FFs
//------------------------
reg [3:0] level_prefix;
reg [2:0] suffixLength; // range from 0 to 6
reg [8:0] level;
reg [8:0] level_abs;
reg [8:0] level_code_tmp;
reg [8:0] level_0, level_1, level_2, level_3, level_4, level_5, level_6, level_7;
reg [8:0] level_8, level_9, level_10, level_11, level_12, level_13, level_14, level_15;
 
//------------------------
// level_prefix_comb
//------------------------
wire level_prefix_refresh;
assign level_prefix_refresh = (prefix_sel && ena);
 
always @(level_prefix_refresh or rbsp)
if (level_prefix_refresh)
rbsp_prefix <= rbsp;
else
rbsp_prefix <= 'hffff;
always @(*)
if (rbsp_prefix[0]) level_prefix_comb <= 0;
else if (rbsp_prefix[1]) level_prefix_comb <= 1;
else if (rbsp_prefix[2]) level_prefix_comb <= 2;
else if (rbsp_prefix[3]) level_prefix_comb <= 3;
else if (rbsp_prefix[4]) level_prefix_comb <= 4;
else if (rbsp_prefix[5]) level_prefix_comb <= 5;
else if (rbsp_prefix[6]) level_prefix_comb <= 6;
else if (rbsp_prefix[7]) level_prefix_comb <= 7;
else if (rbsp_prefix[8]) level_prefix_comb <= 8;
else if (rbsp_prefix[9]) level_prefix_comb <= 9;
else if (rbsp_prefix[10]) level_prefix_comb <= 10;
else if (rbsp_prefix[11]) level_prefix_comb <= 11;
else if (rbsp_prefix[12]) level_prefix_comb <= 12;
else if (rbsp_prefix[13]) level_prefix_comb <= 13;
else if (rbsp_prefix[14]) level_prefix_comb <= 14;
else if (rbsp_prefix[15]) level_prefix_comb <= 15;
else level_prefix_comb <= 'bx;
 
//------------------------
// level_prefix
//------------------------
always @(posedge clk or negedge rst_n)
if (~rst_n)
level_prefix <= 0;
else if (level_prefix_refresh) begin
level_prefix <= level_prefix_comb;
end
 
//------------------------
// suffixLength
//------------------------
wire first_level;
assign first_level = (i == TotalCoeff - TrailingOnes - 1);
 
wire suffixLength_refresh;
assign suffixLength_refresh = prefix_sel && ena;
 
always @(posedge clk or negedge rst_n)
if (~rst_n) begin
suffixLength <= 0;
end
else if (suffixLength_refresh) begin
if (TotalCoeff > 10 && TrailingOnes < 3 && first_level ) //initialize suffixLength before proceeding first level_suffix
suffixLength <= 1;
else if (first_level)
suffixLength <= 0;
else if (suffixLength == 0 && level_abs > 2'd3)
suffixLength <= 2;
else if (suffixLength == 0)
suffixLength <= 1;
else if ( level_abs > (2'd3 << (suffixLength - 1'b1) ) && suffixLength < 6)
suffixLength <= suffixLength + 1'b1;
end
 
 
//------------------------
// level_suffix
//------------------------
wire level_suffix_refresh;
assign level_suffix_refresh = suffix_sel && ena;
 
always @(*)
if (level_suffix_refresh) begin
if (suffixLength > 0 && level_prefix <= 14) begin
level_suffix <= {3'b0, rbsp[0:5] >> (3'd6 - suffixLength)};
end
else if (level_prefix == 14) begin //level_prefix == 14 && suffixLength == 0
level_suffix <= {3'b0, rbsp[0:3] };
end
else if (level_prefix == 15) begin
level_suffix <= rbsp[3:11];
end
else begin
level_suffix <= 0;
end
end
else begin
level_suffix <= 0;
end
 
//------------------------
// level_code_tmp
//------------------------
always @(posedge clk or negedge rst_n)
if (~rst_n) begin
level_code_tmp <= 0;
end
else if (level_suffix_refresh) begin
level_code_tmp <= (level_prefix << suffixLength) + level_suffix +
((suffixLength == 0 && level_prefix == 15) ? 4'd15 : 0);
end
 
 
//------------------------
// level
//------------------------
wire [2:0] tmp1;
 
assign tmp1 = (first_level && TrailingOnes < 3)? 2'd2 : 2'd0;
 
always @(*)
begin
if (level_code_tmp % 2 == 0) begin
level <= ( level_code_tmp + tmp1 + 2 ) >> 1;
end
else begin
level <= (-level_code_tmp - tmp1 - 1 ) >> 1;
end
end
 
//------------------------
// level_abs
//------------------------
wire level_abs_refresh;
assign level_abs_refresh = calc_sel && ena;
 
always @(posedge clk or negedge rst_n)
if (~rst_n) begin
level_abs <= 0;
end
else if (level_abs_refresh) begin
level_abs <= level[8] ? -level : level;
end
 
//------------------------
// level regfile
//------------------------
always @ (posedge clk or negedge rst_n)
if (!rst_n) begin
level_0 <= 0; level_1 <= 0; level_2 <= 0; level_3 <= 0;
level_4 <= 0; level_5 <= 0; level_6 <= 0; level_7 <= 0;
level_8 <= 0; level_9 <= 0; level_10<= 0; level_11<= 0;
level_12<= 0; level_13<= 0; level_14<= 0; level_15<= 0;
end
else if (t1s_sel && ena)
case (i)
0 : level_0 <= rbsp[0]? -1 : 1;
1 : begin
level_1 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_0 <= rbsp[1]? -1 : 1;
end
2 : begin
level_2 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_1 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_0 <= rbsp[2]? -1 : 1;
end
3 : begin
level_3 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_2 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_1 <= rbsp[2]? -1 : 1;
end
4 : begin
level_4 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_3 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_2 <= rbsp[2]? -1 : 1;
end
5 : begin
level_5 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_4 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_3 <= rbsp[2]? -1 : 1;
end
6 : begin
level_6 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_5 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_4 <= rbsp[2]? -1 : 1;
end
7 : begin
level_7 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_6 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_5 <= rbsp[2]? -1 : 1;
end
8 : begin
level_8 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_7 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_6 <= rbsp[2]? -1 : 1;
end
9 : begin
level_9 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_8 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_7 <= rbsp[2]? -1 : 1;
end
10: begin
level_10 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_9 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_8 <= rbsp[2]? -1 : 1;
end
11: begin
level_11 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_10 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_9 <= rbsp[2]? -1 : 1;
end
12: begin
level_12 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_11 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_10 <= rbsp[2]? -1 : 1;
end
13: begin
level_13 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_12 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_11 <= rbsp[2]? -1 : 1;
end
14: begin
level_14 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_13 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_12 <= rbsp[2]? -1 : 1;
end
15: begin
level_15 <= rbsp[0]? -1 : 1;
if (TrailingOnes[1])
level_14 <= rbsp[1]? -1 : 1;
if (TrailingOnes == 3)
level_13 <= rbsp[2]? -1 : 1;
end
endcase
else if (calc_sel && ena)
case (i)
0 :level_0 <= level;
1 :level_1 <= level;
2 :level_2 <= level;
3 :level_3 <= level;
4 :level_4 <= level;
5 :level_5 <= level;
6 :level_6 <= level;
7 :level_7 <= level;
8 :level_8 <= level;
9 :level_9 <= level;
10:level_10<= level;
11:level_11<= level;
12:level_12<= level;
13:level_13<= level;
14:level_14<= level;
15:level_15<= level;
endcase
 
always @(*)
if(t1s_sel)
len_comb <= TrailingOnes;
else if(prefix_sel)
len_comb <= level_prefix_comb + 1;
else if(suffix_sel && suffixLength > 0 && level_prefix <= 14)
len_comb <= suffixLength;
else if(suffix_sel && level_prefix == 14)
len_comb <= 4;
else if(suffix_sel && level_prefix == 15)
len_comb <= 12;
else
len_comb <= 0;
 
endmodule
/trunk/rtl/defines.v
0,0 → 1,22
`timescale 1ns / 1ns
 
`define cavlc_idle_bit 0
`define cavlc_read_total_coeffs_bit 1
`define cavlc_read_t1s_flags_bit 2
`define cavlc_read_level_prefix_bit 3
`define cavlc_read_level_suffix_bit 4
`define cavlc_calc_level_bit 5
`define cavlc_read_total_zeros_bit 6
`define cavlc_read_run_befores_bit 7
 
`define cavlc_idle_s 8'b00000001
`define cavlc_read_total_coeffs_s 8'b00000010
`define cavlc_read_t1s_flags_s 8'b00000100
`define cavlc_read_level_prefix_s 8'b00001000
`define cavlc_read_level_suffix_s 8'b00010000
`define cavlc_calc_level_s 8'b00100000
`define cavlc_read_total_zeros_s 8'b01000000
`define cavlc_read_run_befores_s 8'b10000000
 
 
 
/trunk/rtl/cavlc_len_gen.v
0,0 → 1,46
//2011-8-7 20:19 initial revision
 
`include "defines.v"
 
module cavlc_len_gen (
cavlc_state,
len_read_total_coeffs_comb,
len_read_levels_comb,
len_read_total_zeros_comb,
len_read_run_befores_comb,
len_comb
);
//------------------------
// ports
//------------------------
input [7:0] cavlc_state;
input [4:0] len_read_total_coeffs_comb;
input [4:0] len_read_levels_comb;
input [3:0] len_read_total_zeros_comb;
input [3:0] len_read_run_befores_comb;
 
output [4:0] len_comb;
 
//------------------------
// regs
//------------------------
reg [4:0] len_comb; //number of bits comsumed by cavlc in a cycle
 
//------------------------
// len_comb
//------------------------
always @ (*)
case (1'b1) //synthesis parallel_case
cavlc_state[`cavlc_read_total_coeffs_bit] : len_comb <= len_read_total_coeffs_comb;
cavlc_state[`cavlc_read_t1s_flags_bit],
cavlc_state[`cavlc_read_level_prefix_bit],
cavlc_state[`cavlc_read_level_suffix_bit] : len_comb <= len_read_levels_comb;
cavlc_state[`cavlc_read_total_zeros_bit] : len_comb <= len_read_total_zeros_comb;
cavlc_state[`cavlc_read_run_befores_bit] : len_comb <= len_read_run_befores_comb;
cavlc_state[`cavlc_calc_level_bit],
cavlc_state[`cavlc_idle_bit] : len_comb <= 0;
default : len_comb <= 'bx;
endcase
 
endmodule
 
/trunk/rtl/cavlc_read_total_zeros.v
0,0 → 1,678
//2011-8-14 initial version
 
`include "defines.v"
 
module cavlc_read_total_zeros(
ena,
sel,
chroma_DC_sel,
rbsp,
TotalCoeff,
TotalZeros_comb,
len_comb
);
//------------------------
//ports
//------------------------
input ena;
input sel;
input chroma_DC_sel;
input [0:8] rbsp;
input [3:0] TotalCoeff;
 
output [3:0] TotalZeros_comb;
output [3:0] len_comb;
 
//-------------------------
//rregs
//-------------------------
reg [3:0] TotalZeros_comb; //TotalZeros will be saved as ZeroLeft in module cavlc_read_run_befores
reg [3:0] len_comb;
 
 
//for chroma_DC
reg [0:2] rbsp_chroma_DC;
reg [1:0] TotalZeros_chroma_DC;
reg [1:0] len_chroma_DC;
 
//for TotalCoeff <= 3
reg [0:8] rbsp_LE3;
reg [3:0] TotalZeros_LE3;
reg [3:0] len_LE3;
 
//for TotalCoeff > 3
reg [0:5] rbsp_G3;
reg [3:0] TotalZeros_G3;
reg [2:0] len_G3;
 
 
//----------------------------------------
//input mux
//----------------------------------------
always @(*)
if (ena && sel && chroma_DC_sel) begin
rbsp_chroma_DC <= rbsp[0:2];
rbsp_LE3 <= 'hffff;
rbsp_G3 <= 'hffff;
end
else if (ena && sel && TotalCoeff[3:2] == 2'b00) begin
rbsp_chroma_DC <= 'hffff;
rbsp_LE3 <= rbsp[0:8];
rbsp_G3 <= 'hffff;
end
else if (ena && sel)begin
rbsp_chroma_DC <= 'hffff;
rbsp_LE3 <= 'hffff;
rbsp_G3 <= rbsp[0:5];
end
else begin
rbsp_chroma_DC <= 'hffff;
rbsp_LE3 <= 'hffff;
rbsp_G3 <= 'hffff;
end
 
//----------------------------------------
//TotalZeros_chroma_DC & len_chroma_DC
//----------------------------------------
always @(*)
if ( TotalCoeff == 1 && rbsp_chroma_DC[0] ) begin
TotalZeros_chroma_DC <= 0;
len_chroma_DC <= 1;
end
else if ( TotalCoeff == 1 && rbsp_chroma_DC[1] ) begin
TotalZeros_chroma_DC <= 1;
len_chroma_DC <= 2;
end
else if ( TotalCoeff == 1 && rbsp_chroma_DC[2] ) begin
TotalZeros_chroma_DC <= 2;
len_chroma_DC <= 3;
end
else if ( TotalCoeff == 1 ) begin
TotalZeros_chroma_DC <= 3;
len_chroma_DC <= 3;
end
else if ( TotalCoeff == 2 && rbsp_chroma_DC[0] ) begin
TotalZeros_chroma_DC <= 0;
len_chroma_DC <= 1;
end
else if ( TotalCoeff == 2 && rbsp_chroma_DC[1] ) begin
TotalZeros_chroma_DC <= 1;
len_chroma_DC <= 2;
end
else if ( TotalCoeff == 2 ) begin
TotalZeros_chroma_DC <= 2;
len_chroma_DC <= 2;
end
else if ( rbsp_chroma_DC[0] ) begin
TotalZeros_chroma_DC <= 0;
len_chroma_DC <= 1;
end
else begin
TotalZeros_chroma_DC <= 1;
len_chroma_DC <= 1;
end
 
 
//---------------------------------
//TotalZeros_LE3 & len_LE3
//---------------------------------
always @(rbsp_LE3 or TotalCoeff)
case (TotalCoeff[1:0])
1 :begin
case(1'b1)
rbsp_LE3[0] : begin
TotalZeros_LE3 <= 0;
len_LE3 <= 1;
end
rbsp_LE3[1] : begin
len_LE3 <= 3;
if (rbsp_LE3[2])
TotalZeros_LE3 <= 1;
else
TotalZeros_LE3 <= 2;
end
rbsp_LE3[2] : begin
len_LE3 <= 4;
if (rbsp_LE3[3])
TotalZeros_LE3 <= 3;
else
TotalZeros_LE3 <= 4;
end
rbsp_LE3[3] : begin
len_LE3 <= 5;
if (rbsp_LE3[4])
TotalZeros_LE3 <= 5;
else
TotalZeros_LE3 <= 6;
end
rbsp_LE3[4] : begin
len_LE3 <= 6;
if (rbsp_LE3[5])
TotalZeros_LE3 <= 7;
else
TotalZeros_LE3 <= 8;
end
rbsp_LE3[5] : begin
len_LE3 <= 7;
if (rbsp_LE3[6])
TotalZeros_LE3 <= 9;
else
TotalZeros_LE3 <= 10;
end
rbsp_LE3[6] : begin
len_LE3 <= 8;
if (rbsp_LE3[7])
TotalZeros_LE3 <= 11;
else
TotalZeros_LE3 <= 12;
end
rbsp_LE3[7] : begin
len_LE3 <= 9;
if (rbsp_LE3[8])
TotalZeros_LE3 <= 13;
else
TotalZeros_LE3 <= 14;
end
default : begin
len_LE3 <= 9;
TotalZeros_LE3 <= 15;
end
endcase
end
2 : begin
case(1'b1)
rbsp_LE3[0] : begin
len_LE3 <= 3;
case(rbsp_LE3[1:2])
'b11 : TotalZeros_LE3 <= 0;
'b10 : TotalZeros_LE3 <= 1;
'b01 : TotalZeros_LE3 <= 2;
'b00 : TotalZeros_LE3 <= 3;
endcase
end
rbsp_LE3[1] : begin
if (rbsp_LE3[2]) begin
TotalZeros_LE3 <= 4;
len_LE3 <= 3;
end
else begin
len_LE3 <= 4;
if (rbsp_LE3[3])
TotalZeros_LE3 <= 5;
else
TotalZeros_LE3 <= 6;
end
end
rbsp_LE3[2] : begin
len_LE3 <= 4;
if (rbsp_LE3[3])
TotalZeros_LE3 <= 7;
else
TotalZeros_LE3 <= 8;
end
rbsp_LE3[3] : begin
len_LE3 <= 5;
if (rbsp_LE3[4])
TotalZeros_LE3 <= 9;
else
TotalZeros_LE3 <= 10;
end
default : begin
len_LE3 <= 6;
case(rbsp_LE3[4:5])
'b11 : TotalZeros_LE3 <= 11;
'b10 : TotalZeros_LE3 <= 12;
'b01 : TotalZeros_LE3 <= 13;
'b00 : TotalZeros_LE3 <= 14;
endcase
end
endcase
end
3 : begin
case(1'b1)
rbsp_LE3[0] : begin
len_LE3 <= 3;
case(rbsp_LE3[1:2])
'b11 : TotalZeros_LE3 <= 1;
'b10 : TotalZeros_LE3 <= 2;
'b01 : TotalZeros_LE3 <= 3;
'b00 : TotalZeros_LE3 <= 6;
endcase
end
rbsp_LE3[1] : begin
if (rbsp_LE3[2]) begin
TotalZeros_LE3 <= 7;
len_LE3 <= 3;
end
else begin
len_LE3 <= 4;
if (rbsp_LE3[3])
TotalZeros_LE3 <= 0;
else
TotalZeros_LE3 <= 4;
end
end
rbsp_LE3[2] : begin
len_LE3 <= 4;
if (rbsp_LE3[3])
TotalZeros_LE3 <= 5;
else
TotalZeros_LE3 <= 8;
end
rbsp_LE3[3] : begin
len_LE3 <= 5;
if (rbsp_LE3[4])
TotalZeros_LE3 <= 9;
else
TotalZeros_LE3 <= 10;
end
rbsp_LE3[4] : begin
len_LE3 <= 5;
TotalZeros_LE3 <= 12;
end
default : begin
len_LE3 <= 6;
if(rbsp_LE3[5])
TotalZeros_LE3 <= 11;
else
TotalZeros_LE3 <= 13;
end
endcase
end
default : begin
len_LE3 <= 'bx;
TotalZeros_LE3 <= 'bx;
end
endcase
 
//---------------------------------
//TotalZeros_G3 & len_G3
//---------------------------------
always @(rbsp_G3 or TotalCoeff)
case (TotalCoeff)
4 : begin
case(1'b1)
rbsp_G3[0] : begin
len_G3 <= 3;
case(rbsp_G3[1:2])
'b11 : TotalZeros_G3 <= 1;
'b10 : TotalZeros_G3 <= 4;
'b01 : TotalZeros_G3 <= 5;
'b00 : TotalZeros_G3 <= 6;
endcase
end
rbsp_G3[1] : begin
if (rbsp_G3[2]) begin
TotalZeros_G3 <= 8;
len_G3 <= 3;
end
else begin
len_G3 <= 4;
if (rbsp_G3[3])
TotalZeros_G3 <= 2;
else
TotalZeros_G3 <= 3;
end
end
rbsp_G3[2] : begin
len_G3 <= 4;
if (rbsp_G3[3])
TotalZeros_G3 <= 7;
else
TotalZeros_G3 <= 9;
end
default : begin
len_G3 <= 5;
case(rbsp_G3[3:4])
'b11 : TotalZeros_G3 <= 0;
'b10 : TotalZeros_G3 <= 10;
'b01 : TotalZeros_G3 <= 11;
'b00 : TotalZeros_G3 <= 12;
endcase
end
endcase
end
5 :begin
case(1'b1)
rbsp_G3[0] : begin
len_G3 <= 3;
case(rbsp_G3[1:2])
'b11 : TotalZeros_G3 <= 3;
'b10 : TotalZeros_G3 <= 4;
'b01 : TotalZeros_G3 <= 5;
'b00 : TotalZeros_G3 <= 6;
endcase
end
rbsp_G3[1] : begin
if (rbsp_G3[2]) begin
TotalZeros_G3 <= 7;
len_G3 <= 3;
end
else begin
len_G3 <= 4;
if (rbsp_G3[3])
TotalZeros_G3 <= 0;
else
TotalZeros_G3 <= 1;
end
end
rbsp_G3[2] : begin
len_G3 <= 4;
if (rbsp_G3[3])
TotalZeros_G3 <= 2;
else
TotalZeros_G3 <= 8;
end
rbsp_G3[3] : begin
len_G3 <= 4;
TotalZeros_G3 <= 10;
end
default : begin
len_G3 <= 5;
if (rbsp_G3[4])
TotalZeros_G3 <= 9;
else
TotalZeros_G3 <= 11;
end
endcase
end
6 : begin
case(1'b1)
rbsp_G3[0] : begin
len_G3 <= 3;
case(rbsp_G3[1:2])
'b11 : TotalZeros_G3 <= 2;
'b10 : TotalZeros_G3 <= 3;
'b01 : TotalZeros_G3 <= 4;
'b00 : TotalZeros_G3 <= 5;
endcase
end
rbsp_G3[1] : begin
len_G3 <= 3;
if (rbsp_G3[2])
TotalZeros_G3 <= 6;
else
TotalZeros_G3 <= 7;
end
rbsp_G3[2] : begin
len_G3 <= 3;
TotalZeros_G3 <= 9;
end
rbsp_G3[3] : begin
len_G3 <= 4;
TotalZeros_G3 <= 8;
end
rbsp_G3[4] : begin
len_G3 <= 5;
TotalZeros_G3 <= 1;
end
default : begin
len_G3 <= 6;
if (rbsp_G3[5])
TotalZeros_G3 <= 0;
else
TotalZeros_G3 <= 10;
end
endcase
end
7 :begin
case(1'b1)
rbsp_G3[0] : begin
if (rbsp_G3[1]) begin
TotalZeros_G3 <= 5;
len_G3 <= 2;
end
else begin
len_G3 <= 3;
if (rbsp_G3[2])
TotalZeros_G3 <= 2;
else
TotalZeros_G3 <= 3;
end
end
rbsp_G3[1] : begin
len_G3 <= 3;
if (rbsp_G3[2])
TotalZeros_G3 <= 4;
else
TotalZeros_G3 <= 6;
end
rbsp_G3[2] : begin
len_G3 <= 3;
TotalZeros_G3 <= 8;
end
rbsp_G3[3] : begin
len_G3 <= 4;
TotalZeros_G3 <= 7;
end
rbsp_G3[4] : begin
len_G3 <= 5;
TotalZeros_G3 <= 1;
end
default : begin
len_G3 <= 6;
if (rbsp_G3[5])
TotalZeros_G3 <= 0;
else
TotalZeros_G3 <= 9;
end
endcase
end
8 :begin
case(1'b1)
rbsp_G3[0] : begin
len_G3 <= 2;
if (rbsp_G3[1])
TotalZeros_G3 <= 4;
else
TotalZeros_G3 <= 5;
end
rbsp_G3[1] : begin
len_G3 <= 3;
if (rbsp_G3[2])
TotalZeros_G3 <= 3;
else
TotalZeros_G3 <= 6;
end
rbsp_G3[2] : begin
len_G3 <= 3;
TotalZeros_G3 <= 7;
end
rbsp_G3[3] : begin
len_G3 <= 4;
TotalZeros_G3 <= 1;
end
rbsp_G3[4] : begin
len_G3 <= 5;
TotalZeros_G3 <= 2;
end
default : begin
len_G3 <= 6;
if (rbsp_G3[5])
TotalZeros_G3 <= 0;
else
TotalZeros_G3 <= 8;
end
endcase
end
9 : begin
case(1'b1)
rbsp_G3[0] : begin
len_G3 <= 2;
if (rbsp_G3[1])
TotalZeros_G3 <= 3;
else
TotalZeros_G3 <= 4;
end
rbsp_G3[1] : begin
len_G3 <= 2;
TotalZeros_G3 <= 6;
end
rbsp_G3[2] : begin
len_G3 <= 3;
TotalZeros_G3 <= 5;
end
rbsp_G3[3] : begin
len_G3 <= 4;
TotalZeros_G3 <= 2;
end
rbsp_G3[4] : begin
len_G3 <= 5;
TotalZeros_G3 <= 7;
end
default : begin
len_G3 <= 6;
if (rbsp_G3[5])
TotalZeros_G3 <= 0;
else
TotalZeros_G3 <= 1;
end
endcase
end
10 : begin
case(1'b1)
rbsp_G3[0] : begin
len_G3 <= 2;
if (rbsp_G3[1])
TotalZeros_G3 <= 3;
else
TotalZeros_G3 <= 4;
end
rbsp_G3[1] : begin
len_G3 <= 2;
TotalZeros_G3 <= 5;
end
rbsp_G3[2] : begin
len_G3 <= 3;
TotalZeros_G3 <= 2;
end
rbsp_G3[3] : begin
len_G3 <= 4;
TotalZeros_G3 <= 6;
end
default : begin
len_G3 <= 5;
if (rbsp_G3[4])
TotalZeros_G3 <= 0;
else
TotalZeros_G3 <= 1;
end
endcase
end
11 : begin
case(1'b1)
rbsp_G3[0] : begin
len_G3 <= 1;
TotalZeros_G3 <= 4;
end
rbsp_G3[1] : begin
len_G3 <= 3;
if (rbsp_G3[2])
TotalZeros_G3 <= 5;
else
TotalZeros_G3 <= 3;
end
rbsp_G3[2] : begin
len_G3 <= 3;
TotalZeros_G3 <= 2;
end
default : begin
len_G3 <= 4;
if (rbsp_G3[3])
TotalZeros_G3 <= 1;
else
TotalZeros_G3 <= 0;
end
endcase
end
12 : begin
case(1'b1)
rbsp_G3[0] : begin
len_G3 <= 1;
TotalZeros_G3 <= 3;
end
rbsp_G3[1] : begin
len_G3 <= 2;
TotalZeros_G3 <= 2;
end
rbsp_G3[2] : begin
len_G3 <= 3;
TotalZeros_G3 <= 4;
end
default : begin
len_G3 <= 4;
if (rbsp_G3[3])
TotalZeros_G3 <= 1;
else
TotalZeros_G3 <= 0;
end
endcase
end
13 :begin
if (rbsp_G3[0]) begin
TotalZeros_G3 <= 2;
len_G3 <= 1;
end
else if (rbsp_G3[1]) begin
TotalZeros_G3 <= 3;
len_G3 <= 2;
end
else if (rbsp_G3[2]) begin
TotalZeros_G3 <= 1;
len_G3 <= 3;
end
else begin
TotalZeros_G3 <= 0;
len_G3 <= 3;
end
end
14 : begin
if (rbsp_G3[0]) begin
TotalZeros_G3 <= 2;
len_G3 <= 1;
end
else if (rbsp_G3[1]) begin
TotalZeros_G3 <= 1;
len_G3 <= 2;
end
else begin
TotalZeros_G3 <= 0;
len_G3 <= 2;
end
end
15 : begin
len_G3 <= 1;
if (rbsp_G3[0])
TotalZeros_G3 <= 1;
else
TotalZeros_G3 <= 0;
end
default : begin
len_G3 <= 'bx;
TotalZeros_G3 <= 'bx;
end
endcase
 
//---------------------------------
//TotalZeros_comb & len_comb
//---------------------------------
always @(*)
if (ena && sel && chroma_DC_sel) begin
TotalZeros_comb <= TotalZeros_chroma_DC;
len_comb <= len_chroma_DC;
end
else if (ena && sel && TotalCoeff[3:2] == 2'b00) begin
TotalZeros_comb <= TotalZeros_LE3;
len_comb <= len_LE3;
end
else if (ena && sel)begin
TotalZeros_comb <= TotalZeros_G3;
len_comb <= len_G3;
end
else begin
TotalZeros_comb <= 0;
len_comb <= 0;
end
 
 
endmodule
/trunk/rtl/cavlc_top.v
0,0 → 1,256
//2011-8-7 initial version
 
`include "defines.v"
 
module cavlc_top(
clk,
rst_n,
ena,
start,
rbsp,
nC,
max_coeff_num,
 
coeff_0,
coeff_1,
coeff_2,
coeff_3,
coeff_4,
coeff_5,
coeff_6,
coeff_7,
coeff_8,
coeff_9,
coeff_10,
coeff_11,
coeff_12,
coeff_13,
coeff_14,
coeff_15,
TotalCoeff,
len_comb,
idle,
valid
);
//------------------------
// ports
//------------------------
input clk, rst_n;
input ena;
input start;
input [0:15] rbsp;
input [4:0] nC;
input [4:0] max_coeff_num;
 
output [8:0] coeff_0;
output [8:0] coeff_1;
output [8:0] coeff_2;
output [8:0] coeff_3;
output [8:0] coeff_4;
output [8:0] coeff_5;
output [8:0] coeff_6;
output [8:0] coeff_7;
output [8:0] coeff_8;
output [8:0] coeff_9;
output [8:0] coeff_10;
output [8:0] coeff_11;
output [8:0] coeff_12;
output [8:0] coeff_13;
output [8:0] coeff_14;
output [8:0] coeff_15;
output [4:0] TotalCoeff;
output [4:0] len_comb;
output idle;
output valid;
 
//------------------------
// cavlc_read_total_coeffs
//------------------------
wire [1:0] TrailingOnes;
wire [4:0] TotalCoeff;
wire [1:0] TrailingOnes_comb;
wire [4:0] TotalCoeff_comb;
wire [4:0] len_read_total_coeffs_comb;
wire [7:0] cavlc_state;
 
cavlc_read_total_coeffs cavlc_read_total_coeffs(
.clk(clk),
.rst_n(rst_n),
.ena(ena),
.start(start),
.sel(cavlc_state[`cavlc_read_total_coeffs_bit]),
.rbsp(rbsp),
.nC(nC),
.TrailingOnes(TrailingOnes),
.TotalCoeff(TotalCoeff),
 
.TrailingOnes_comb(TrailingOnes_comb),
.TotalCoeff_comb(TotalCoeff_comb),
 
.len_comb(len_read_total_coeffs_comb)
);
 
//------------------------
// cavlc_read_levels
//------------------------
wire [4:0] len_read_levels_comb;
wire [3:0] i;
 
wire [8:0] level_0;
wire [8:0] level_1;
wire [8:0] level_2;
wire [8:0] level_3;
wire [8:0] level_4;
wire [8:0] level_5;
wire [8:0] level_6;
wire [8:0] level_7;
wire [8:0] level_8;
wire [8:0] level_9;
wire [8:0] level_10;
wire [8:0] level_11;
wire [8:0] level_12;
wire [8:0] level_13;
wire [8:0] level_14;
wire [8:0] level_15;
 
cavlc_read_levels cavlc_read_levels(
.clk(clk),
.rst_n(rst_n),
.ena(ena),
.t1s_sel(cavlc_state[`cavlc_read_t1s_flags_bit]),
.prefix_sel(cavlc_state[`cavlc_read_level_prefix_bit]),
.suffix_sel(cavlc_state[`cavlc_read_level_suffix_bit]),
.calc_sel(cavlc_state[`cavlc_calc_level_bit]),
.TrailingOnes(TrailingOnes),
.TotalCoeff(TotalCoeff),
.i(i),
.rbsp(rbsp),
.level_0(level_0),
.level_1(level_1),
.level_2(level_2),
.level_3(level_3),
.level_4(level_4),
.level_5(level_5),
.level_6(level_6),
.level_7(level_7),
.level_8(level_8),
.level_9(level_9),
.level_10(level_10),
.level_11(level_11),
.level_12(level_12),
.level_13(level_13),
.level_14(level_14),
.level_15(level_15),
.len_comb(len_read_levels_comb)
);
 
//------------------------
// cavlc_read_total_zeros
//------------------------
wire [3:0] TotalZeros_comb;
wire [3:0] len_read_total_zeros_comb;
 
cavlc_read_total_zeros cavlc_read_total_zeros(
.ena(ena),
.sel(cavlc_state[`cavlc_read_total_zeros_bit]),
.chroma_DC_sel(nC[4]),
.rbsp(rbsp[0:8]),
.TotalCoeff(TotalCoeff[3:0]),
.TotalZeros_comb(TotalZeros_comb),
.len_comb(len_read_total_zeros_comb)
);
 
//------------------------
// read_run_before
//------------------------
wire [3:0] ZeroLeft;
wire [3:0] len_read_run_befores_comb;
 
cavlc_read_run_befores cavlc_read_run_befores(
.clk(clk),
.rst_n(rst_n),
.ena(ena),
.clr(cavlc_state[`cavlc_read_total_coeffs_bit]),
.sel(cavlc_state[`cavlc_read_run_befores_bit]),
.ZeroLeft_init(cavlc_state[`cavlc_read_total_zeros_bit]),
.rbsp(rbsp[0:10]),
.i(i),
.TotalZeros_comb(TotalZeros_comb),
.level_0(level_0),
.level_1(level_1),
.level_2(level_2),
.level_3(level_3),
.level_4(level_4),
.level_5(level_5),
.level_6(level_6),
.level_7(level_7),
.level_8(level_8),
.level_9(level_9),
.level_10(level_10),
.level_11(level_11),
.level_12(level_12),
.level_13(level_13),
.level_14(level_14),
.level_15(level_15),
.coeff_0(coeff_0),
.coeff_1(coeff_1),
.coeff_2(coeff_2),
.coeff_3(coeff_3),
.coeff_4(coeff_4),
.coeff_5(coeff_5),
.coeff_6(coeff_6),
.coeff_7(coeff_7),
.coeff_8(coeff_8),
.coeff_9(coeff_9),
.coeff_10(coeff_10),
.coeff_11(coeff_11),
.coeff_12(coeff_12),
.coeff_13(coeff_13),
.coeff_14(coeff_14),
.coeff_15(coeff_15),
.ZeroLeft(ZeroLeft),
.len_comb(len_read_run_befores_comb)
);
 
//------------------------
// cavlc_len_gen
//------------------------
wire [4:0] len_comb;
 
cavlc_len_gen cavlc_len_gen(
.cavlc_state(cavlc_state),
.len_read_total_coeffs_comb(len_read_total_coeffs_comb),
.len_read_levels_comb(len_read_levels_comb),
.len_read_total_zeros_comb(len_read_total_zeros_comb),
.len_read_run_befores_comb(len_read_run_befores_comb),
.len_comb(len_comb)
);
 
//------------------------
// fsm
//------------------------
cavlc_fsm cavlc_fsm(
.clk(clk),
.rst_n(rst_n),
.ena(ena),
.start(start),
.max_coeff_num(max_coeff_num),
.TotalCoeff(TotalCoeff),
.TotalCoeff_comb(TotalCoeff_comb),
.TrailingOnes(TrailingOnes),
.TrailingOnes_comb(TrailingOnes_comb),
.ZeroLeft(ZeroLeft),
.state(cavlc_state),
.i(i),
.idle(idle),
.valid(valid)
);
 
endmodule

powered by: WebSVN 2.1.0

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