x393  1.0
FPGAcodeforElphelNC393camera
csconvert_jp4diff.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
42  clk,
43  scale_diff, // divide differences by 2 (to fit in 8-bit range)
44  hdr, // second green absolute, not difference
45  din,
47  y_out,
48  yaddr,
49  ywe,
51  bayer_phase);
52 // Was s ynthesis attribute shreg_extract of csconvert_jp4diff is yes;
53 
54  input en;
55  input clk; // clock
56  input scale_diff;
57  input hdr;
58  input [7:0] din; // input data in scanline sequence
59  input pre_first_in; // marks the first input pixel
60  output [8:0] y_out; // output Y (16x16) in scanline sequence. Valid if ys active
61  output [7:0] yaddr; // address for the external buffer memory to write 16x16x8bit Y data
62  output ywe; // wrire enable of Y data
63  output pre_first_out;
64  input [1:0] bayer_phase; // selected pixel will be absolute, others - difference
65 
67  reg [2:0] pre2_first_out;
68  reg [8:0] y_out;
69  reg [8:0] pre_y_out;
70  reg [7:0] yaddr_cntr;
71  reg [7:0] pre_yaddr_cntr;
72  reg [7:0] pre2_yaddr_cntr;
73  reg ywe;
74  reg [2:0] pre_ywe;
75  reg [7:0] yaddr;
76  reg dly_1;
77  reg [14:0] dly_16;
78  reg dly_17;
79 // wire start_out=bayer_phase[1]?(bayer_phase[0]?dly_17:dly_16):(bayer_phase[0]?dly_1:pre_first_in);
81  reg [7:0] iadr;
82  reg iadr_run;
83  reg [1:0] mux_plus_sel;
84  reg [2:0] mux_minus_sel;
85  reg hdr_bit;
86  reg [1:0] scale_color;
87  reg [1:0] is_color;
88 
89  reg [7:0] mux_plus;
90  reg [7:0] mux_minus;
91  reg [7:0] dd0;
92  reg [7:0] dd1;
93  wire [7:0] dd16;
94  reg [7:0] dd17;
96  wire [8:0] scaled_pre_y_out= (scale_color[1])? +{pre_y_out[8],pre_y_out[8:1]}: pre_y_out[8:0];
97  assign dd16[7:0]={ddsr7[14],ddsr6[14],ddsr5[14],ddsr4[14],ddsr3[14],ddsr2[14],ddsr1[14],ddsr0[14]};
98  always @ (posedge clk) begin
100  dly_17 <= dly_16[14];
101  dly_16[14:0] <= {dly_16[13:0],dly_1};
102 
103  pre2_first_out[2:0]<= {pre2_first_out[1:0], start_out};
105 
106  iadr_run <= en & (start_out || (iadr_run && (iadr[7:0]!=8'hff)));
107  pre_ywe[2:0] <= {pre_ywe[1:0],iadr_run};
108  ywe <= pre_ywe[2];
109 
110  if (!en || start_out) iadr[7:0] <= 8'h0;
111  else if (iadr_run) iadr[7:0] <= iadr[7:0] + 1;
112  pre2_yaddr_cntr[7:0] <= iadr[7:0];
113  pre_yaddr_cntr [7:0] <= pre2_yaddr_cntr[7:0];
114  yaddr_cntr[7:0] <= pre_yaddr_cntr[7:0];
115  yaddr[7:0] <= {yaddr_cntr[4],yaddr_cntr[7:5],yaddr_cntr[0],yaddr_cntr[3:1]};
116 
117 
118  case ({bayer_phase[1:0],iadr[4],iadr[0]} )
119  4'b0000: begin mux_plus_sel <= 2'h0; mux_minus_sel <= 3'h4; hdr_bit <=1'h0; end
120  4'b0001: begin mux_plus_sel <= 2'h0; mux_minus_sel <= 3'h1; hdr_bit <=1'h0; end
121  4'b0010: begin mux_plus_sel <= 2'h0; mux_minus_sel <= 3'h2; hdr_bit <=1'h0; end
122  4'b0011: begin mux_plus_sel <= 2'h0; mux_minus_sel <= 3'h3; hdr_bit <=1'h1; end
123  4'b0100: begin mux_plus_sel <= 2'h1; mux_minus_sel <= 3'h0; hdr_bit <=1'h0; end
124  4'b0101: begin mux_plus_sel <= 2'h1; mux_minus_sel <= 3'h4; hdr_bit <=1'h0; end
125  4'b0110: begin mux_plus_sel <= 2'h1; mux_minus_sel <= 3'h2; hdr_bit <=1'h1; end
126  4'b0111: begin mux_plus_sel <= 2'h1; mux_minus_sel <= 3'h3; hdr_bit <=1'h0; end
127  4'b1000: begin mux_plus_sel <= 2'h2; mux_minus_sel <= 3'h0; hdr_bit <=1'h0; end
128  4'b1001: begin mux_plus_sel <= 2'h2; mux_minus_sel <= 3'h1; hdr_bit <=1'h1; end
129  4'b1010: begin mux_plus_sel <= 2'h2; mux_minus_sel <= 3'h4; hdr_bit <=1'h0; end
130  4'b1011: begin mux_plus_sel <= 2'h2; mux_minus_sel <= 3'h3; hdr_bit <=1'h0; end
131  4'b1100: begin mux_plus_sel <= 2'h3; mux_minus_sel <= 3'h0; hdr_bit <=1'h1; end
132  4'b1101: begin mux_plus_sel <= 2'h3; mux_minus_sel <= 3'h1; hdr_bit <=1'h0; end
133  4'b1110: begin mux_plus_sel <= 2'h3; mux_minus_sel <= 3'h2; hdr_bit <=1'h0; end
134  4'b1111: begin mux_plus_sel <= 2'h3; mux_minus_sel <= 3'h4; hdr_bit <=1'h0; end
135  endcase
136 
137  if (pre_ywe[0]) case (mux_plus_sel[1:0])
138  2'h0: mux_plus[7:0] <= dd0 [7:0];
139  2'h1: mux_plus[7:0] <= dd1 [7:0];
140  2'h2: mux_plus[7:0] <= dd16[7:0];
141  2'h3: mux_plus[7:0] <= dd17[7:0];
142  endcase
143  if (pre_ywe[0]) casex ({mux_minus_sel[2] | (hdr_bit & hdr), mux_minus_sel[1:0]})
144  3'h0: mux_minus[7:0] <= dd0 [7:0];
145  3'h1: mux_minus[7:0] <= dd1 [7:0];
146  3'h2: mux_minus[7:0] <= dd16[7:0];
147  3'h3: mux_minus[7:0] <= dd17[7:0];
148  3'b1xx: mux_minus[7:0] <= 8'h0;
149  endcase
150 
151  is_color[1:0] <= {is_color[0], ~(mux_minus_sel[2] | (hdr_bit & hdr))}; // 1 for color components (diffs) ([0] valid at pre_ywe[1])
152  scale_color[1:0] <= {scale_color[0], ~(mux_minus_sel[2] | (hdr_bit & hdr)) & scale_diff}; // 1 for color components (diffs) ([0] valid at pre_ywe[1])
153  if (pre_ywe[1]) pre_y_out[8:0] <= {1'b0,mux_plus[7:0]} - {1'b0,mux_minus[7:0]};
154  y_out[8:0] <= scaled_pre_y_out[8:0] - {1'h0, ~is_color[1],7'h0}; // subtract 0x80 from Y components (make them -128+127)
155  dd0[7:0] <= din [7:0];
156  dd1[7:0] <= dd0 [7:0];
157  ddsr0[14:0] <= {ddsr0[13:0],dd1[0]};
158  ddsr1[14:0] <= {ddsr1[13:0],dd1[1]};
159  ddsr2[14:0] <= {ddsr2[13:0],dd1[2]};
160  ddsr3[14:0] <= {ddsr3[13:0],dd1[3]};
161  ddsr4[14:0] <= {ddsr4[13:0],dd1[4]};
162  ddsr5[14:0] <= {ddsr5[13:0],dd1[5]};
163  ddsr6[14:0] <= {ddsr6[13:0],dd1[6]};
164  ddsr7[14:0] <= {ddsr7[13:0],dd1[7]};
165  dd17[7:0] <= dd16 [7:0];
166  end
167 endmodule
2276scaled_pre_y_outwire[8:0]