x393  1.0
FPGAcodeforElphelNC393camera
sensor_membuf.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
41 module sensor_membuf #(
42  parameter WADDR_WIDTH=9 // for 36Kb RAM
43 )(
44  input pclk,
45  input prst, // reset @ posedge pclk
46  input mrst, // reset @ posedge mclk
47  input frame_run_mclk, // @mclk - memory channel is ready to accept data from the sensor
48  input [15:0] px_data, // @posedge pclk pixel (pixel pair) data from the sensor channel
49  input px_valid, // px_data valid
50  input last_in_line, // valid with px_valid - last px_data in line
51 
52  input mclk, // memory interface clock
53  input rpage_set, // set internal read page to rpage_in (reset pointers)
54  input rpage_next, // advance to next page (and reset lower bits to 0)
55  input buf_rd, // read buffer to memory, increment read address (register enable will be delayed)
56  output [63:0] buf_dout, // data out
57  output page_written // buffer page (full or partial) is written to the memory buffer
58 `ifdef DEBUG_SENS_MEM_PAGES
59  ,output [1:0] dbg_rpage
60  ,output [1:0] dbg_wpage
61 `endif
62 
63 );
64 
65  reg [1:0] wpage;
66  reg [WADDR_WIDTH-1:0] waddr;
67 
68 // reg sim_rst = 1; // just for simulation - reset from system reset to the first rpage_set
69  reg [2:0] rst_pntr;
71  wire rst_wpntr;
73  wire px_use = frame_run_pclk && px_valid; // px valid and enabled by memory controller
74 
75 
76 `ifdef DEBUG_SENS_MEM_PAGES
77  assign dbg_wpage = dbg_wpage;
78 `endif
79 
80  assign inc_wpage_w = px_use && (last_in_line || (&waddr));
81  always @ (posedge mclk) begin
82  rst_pntr <= {rst_pntr[1] &~rst_pntr[0], rst_pntr[0], rpage_set};
83 // if (rpage_set) sim_rst <= 0;
84  end
85 
86  always @ (posedge pclk) begin
87  if (prst || rst_wpntr || (px_use && last_in_line)) waddr <= 0;
88  else if (px_use) waddr <= waddr + 1;
89 
90  if (prst || rst_wpntr) wpage <= 0;
91  else if (inc_wpage_w) wpage <= wpage + 1;
92 
94  end
95 
96  pulse_cross_clock rst_wpntr_i (
97  .rst (mrst), // sim_rst),
98  .src_clk (mclk),
99  .dst_clk (pclk),
100  .in_pulse (rst_pntr[2]),
101  .out_pulse (rst_wpntr),
102  .busy ()
103  );
104 
105  pulse_cross_clock page_written_i (
106  .rst (prst), // sim_rst || rpage_set),
107  .src_clk (pclk),
108  .dst_clk (mclk),
111  .busy ()
112  );
114 
115  mcntrl_buf_wr #(
116  .LOG2WIDTH_WR(4) // 64 bit external interface
117  ) chn1wr_buf_i (
118  .ext_clk (pclk), // input
119  .ext_waddr ({wpage, waddr}), // input[9:0]
120  .ext_we (px_use), // input
121  .ext_data_in (px_data), // input[15:0] buf_wdata - from AXI
122  .rclk (mclk), // input
123  .rpage_in (2'b0), // input[1:0]
124  .rpage_set (rpage_set), // input @ posedge mclk
125  .page_next (rpage_next), // input
126 `ifdef DEBUG_SENS_MEM_PAGES
127  .page (dbg_rpage), // output[1:0]
128 `else
129  .page (), // output[1:0]
130 `endif
131  .rd (buf_rd), // input
132  .data_out (buf_dout) // output[63:0]
133  );
134 
135 
136 endmodule
137 
138 
[63:0] 8447buf_dout
Definition: sensor_membuf.v:56
[1:0] 5204rpage_in
Definition: mcntrl_buf_wr.v:51
8450waddrreg[WADDR_WIDTH-1:0]
Definition: sensor_membuf.v:65
[15:0] 8440px_data
Definition: sensor_membuf.v:48
page_written_i pulse_cross_clock
[63:0] 5209data_out
Definition: mcntrl_buf_wr.v:56
8451rst_pntrreg[2:0]
Definition: sensor_membuf.v:68
8449wpagereg[1:0]
Definition: sensor_membuf.v:64
[1:0] 5207page
Definition: mcntrl_buf_wr.v:54
[1 << LOG2WIDTH_WR-1:0] 5202ext_data_in
Definition: mcntrl_buf_wr.v:48
chn1wr_buf_i mcntrl_buf_wr
[14-LOG2WIDTH_WR:0] 5200ext_waddr
Definition: mcntrl_buf_wr.v:46