x393  1.0
FPGAcodeforElphelNC393camera
mult_saxi_wr_inbuf.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
42  parameter MULT_SAXI_HALF_BRAM_IN = 1, // 0 - use full 36Kb BRAM for the buffer, 1 - use just half
43  parameter MULT_SAXI_BSLOG = 4, // number of bits to represent burst size (4 - b.s. = 16, 0 - b.s = 1)
44  parameter MULT_SAXI_WLOG = 4 // number of bits for the input data ( 3 - 8 bit, 4 - 16-bit, 5 - 32-bit
45 )(
46  input mclk, // system clock
47  input en, // enable channel, 0 - reset FIFO @mclk
48 
49  // Input data port. No check on buffer overflow
50  input iclk, // input data clock
51  input [(1 << MULT_SAXI_WLOG) - 1:0] data_in, // @posedge iclk input data
52  input valid, // @posedge iclk input data valid
53 
54  output reg has_burst, // channel has at least 1 burst (should go down immediately after read_burst if no more data)
55  input read_burst, // request to read a burst of data from this channel
56  output [31:0] data_out, // data read from this channel
57  output pre_valid_chn // data valid
58 
59 );
60  localparam INA_WIDTH = (MULT_SAXI_HALF_BRAM_IN ? 14 : 15) - MULT_SAXI_WLOG;
61  localparam OUTA_WIDTH = (MULT_SAXI_HALF_BRAM_IN ? 14 : 15) - 5;
62  localparam INW_CNTR_WIDTH = MULT_SAXI_BSLOG + 5 -MULT_SAXI_WLOG; // width of the input word counter (in a burst)
63  localparam OUTW_CNTR_WIDTH = MULT_SAXI_BSLOG; // width of the output word counter (in a burst)
65 
66  reg en_iclk;
68  reg [BURST_WIDTH-1:0] in_burst;
72 
73  wire [INA_WIDTH-1:0] waddr = {in_burst,inw_cntr};
75 
77  wire wr_last_word = valid && (&inw_cntr);
78 
79  wire re_last_word = buf_re[0] && (&outw_cntr);
80  reg [1:0] buf_re;
81 
82  assign pre_valid_chn = buf_re[1];
83  always @ (posedge iclk) begin
84  en_iclk <= en;
85 
86  if (!en_iclk) inw_cntr <= 0;
87  else if (valid) inw_cntr <= inw_cntr + 1;
88 
89  if (!en_iclk) in_burst <= 0;
90  else if (wr_last_word) in_burst <= in_burst + 1;
91  end
92 
93  always @ (posedge mclk) begin
94  if (!en) buf_re <= 0;
95  else buf_re <= {buf_re[0], read_burst | (buf_re[0] & ~(&outw_cntr))};
96 
97  if (!en) outw_cntr <= 0;
98  else if (buf_re[0]) outw_cntr <= outw_cntr + 1;
99 
100  if (!en) out_burst <= 0;
101  else if (re_last_word) out_burst <= out_burst + 1;
102 
103  if (!en) num_out_bursts <= 0;
106 
107  if (!en) has_burst <= 0;
109 
110  end
111 
112  pulse_cross_clock #(.EXTRA_DLY(1)) put_burst_mclk_i (
113  .rst(!en_iclk),
114  .src_clk(iclk),
115  .dst_clk(mclk),
118  .busy());
119 
120  generate
123  .REGISTERS(1),
124  .LOG2WIDTH_WR(MULT_SAXI_WLOG),
125  .LOG2WIDTH_RD(5),
126  .DUMMY(0)
127  ) ram_var_w_var_r_i (
128  .rclk (mclk), // input
129  .raddr (raddr[8:0]), // input[9:0]
130  .ren (buf_re[0]), // input
131  .regen (buf_re[1]), // input
132  .data_out (data_out), // output[31:0]
133  .wclk (iclk), // input
134  .waddr (waddr[13-MULT_SAXI_WLOG:0]), // input[9:0]
135  .we (valid), // input
136  .web (4'hf), // input[7:0]
137  .data_in (data_in) // input[31:0]
138  );
139  else
141  .REGISTERS(1),
142  .LOG2WIDTH_WR(MULT_SAXI_WLOG),
143  .LOG2WIDTH_RD(5),
144  .DUMMY(0)
145  ) ram_var_w_var_r_i (
146  .rclk (mclk), // input
147  .raddr ({raddr[OUTA_WIDTH-1],raddr[8:0]}), // {buf_ra[BRAM_A_WDTH-1],buf_ra[8:0]}), // input[9:0]
148  .ren (buf_re[0]), // input
149  .regen (buf_re[1]), // input
150  .data_out (data_out), // output[31:0]
151  .wclk (iclk), // input
152  .waddr ({waddr[INA_WIDTH-1],waddr[13-MULT_SAXI_WLOG:0]}), // {buf_wa[BRAM_A_WDTH-1],buf_wa[8:0]}), // input[9:0]
153  .we (valid), // input
154  .web (8'hff), // input[7:0]
155  .data_in (data_in) // input[31:0]
156  );
157  endgenerate
158 
159 
160 endmodule
161 
ram_var_w_var_r_i ram18_var_w_var_r[generate]
[1 << LOG2WIDTH_WR-1:0] 11872data_in
890INA_WIDTH(MULT_SAXI_HALF_BRAM_IN ? 14 : 15) - MULT_SAXI_WLOG
[14-LOG2WIDTH_WR:0] 11869waddr
891OUTA_WIDTH(MULT_SAXI_HALF_BRAM_IN ? 14 : 15) - 5
897in_burstreg[BURST_WIDTH-1:0]
[1 << LOG2WIDTH_WR-1:0] 11597data_in
[1 << LOG2WIDTH_RD-1:0] 11592data_out
[13-LOG2WIDTH_RD:0] 11589raddr
put_burst_mclk_i pulse_cross_clock
896inw_cntrreg[INW_CNTR_WIDTH-1:0]
900num_out_burstsreg[BURST_WIDTH:0]
894BURST_WIDTHOUTA_WIDTH - OUTW_CNTR_WIDTH
901waddrwire[INA_WIDTH-1:0]
898outw_cntrreg[OUTW_CNTR_WIDTH-1:0]
[1 << LOG2WIDTH_RD-1:0] 11867data_out
[1 << MULT_SAXI_WLOG - 1:0] 884data_in
[14-LOG2WIDTH_RD:0] 11864raddr
893OUTW_CNTR_WIDTHMULT_SAXI_BSLOG
[13-LOG2WIDTH_WR:0] 11594waddr
899out_burstreg[BURST_WIDTH-1:0]
902raddrwire[OUTA_WIDTH-1:0]
892INW_CNTR_WIDTHMULT_SAXI_BSLOG + 5 -MULT_SAXI_WLOG
ram_var_w_var_r_i ram_var_w_var_r[generate]