x393  1.0
FPGAcodeforElphelNC393camera
huffman_merge_code_literal.v
Go to the documentation of this file.
1 
40 `timescale 1ns/1ps
41 
43  input clk,
44  input in_valid,
45  input [15:0] huff_code,
46  input [ 3:0] huff_code_len, // 0 means 16
47  input [10:0] literal,
48  input [ 3:0] literal_len,
49  output reg out_valid, // latency 5 from input
50  output reg [26:0] out_bits, // latency 5 from input
51  output reg [ 4:0] out_len // latency 5 from input
52 );
53  reg [10:0] lit0;
54  reg [10:0] lit1;
55  reg [10:0] lit2;
56  reg [15:0] huff0; // SR-s will be extracted?
57  reg [15:0] huff1;
58  reg [15:0] huff2;
59  reg [26:0] data3;
60  reg [3:0] llen0;
61  reg [3:0] llen1;
62  reg [3:0] llen2;
63  reg [4:0] olen3;
64  reg [3:0] hlen0;
65  reg [3:0] hlen1;
66  reg [4:0] hlen2;
67  reg [3:0] hlen2m1;
68  reg [1:0] hlen3m1;
69  reg [3:0] valid;
70 
71  always @ (posedge clk) begin
72  // input layer 0
73  lit0 <= literal;
74  llen0 <= literal_len;
75  huff0 <= huff_code;
77  valid[0] <= in_valid;
78  // layer 1
79  casex (llen0[3:2])
80  2'b1x: lit1 <= lit0;
81  2'b01: lit1 <= {lit0[6:0],4'b0};
82  2'b00: lit1 <= {lit0[2:0],8'b0};
83  endcase
84  llen1 <= llen0;
85  huff1 <= huff0;
86  hlen1 <= hlen0;
87  valid[1] <= valid[0];
88  // layer 2
89  case (llen1[1:0])
90  2'b11: lit2 <= lit1;
91  2'b10: lit2 <= {lit1[9:0], 1'b0};
92  2'b01: lit2 <= {lit1[8:0], 2'b0};
93  2'b00: lit2 <= {lit1[7:0], 3'b0};
94  endcase
95  llen2 <= llen1;
96  huff2 <= huff1;
97  hlen2 <= {~(|hlen1),hlen1};
98  hlen2m1 <= hlen1 - 1; // s0
99  valid[2] <= valid[1];
100  // layer 3
101  olen3 <= hlen2 + llen2;
102  case (hlen2m1[3:2])
103  2'b11: data3 <= {huff2[15:0],lit2[10:0]};
104  2'b10: data3 <= {huff2[11:0],lit2[10:0], 4'b0};
105  2'b01: data3 <= {huff2[ 7:0],lit2[10:0], 8'b0};
106  2'b00: data3 <= {huff2[ 3:0],lit2[10:0],12'b0};
107  endcase
108  hlen3m1 <= hlen2m1[1:0];
109  valid[3] <= valid[2];
110  //layer4
111  out_len <= olen3;
112  case (hlen3m1[1:0])
113  2'b11: out_bits <= data3;
114  2'b10: out_bits <= {data3[25:0], 1'b0};
115  2'b01: out_bits <= {data3[24:0], 2'b0};
116  2'b00: out_bits <= {data3[23:0], 3'b0};
117  endcase
118  out_valid <= valid[3];
119  end
120 
121 
122 endmodule
123