x393  1.0
FPGAcodeforElphelNC393camera
buf_xclk_mclk16_393.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
42  input mclk, // system clock, posedge
43  input xclk, // half frequency (80 MHz nominal)
44  input rst, // @posedge xclk reset module
45  input [15:0] din,
46  input din_stb,
47  output reg [15:0] dout,
48  output reg dout_stb);
49 
50  reg [1:0] wa;
51  reg [1:0] wa_mclk;
52  reg [1:0] wa_mclk_d;
53  reg rst_mclk;
54  reg [1:0] ra;
55  reg [1:0] ra_next;
56  reg inc_ra;
57  wire [15:0] pre_dout;
58 
59  always @ (posedge xclk) begin
60  if (rst) wa[1:0] <= 2'h0;
61  else if (din_stb) wa[1:0] <={wa[0],~wa[1]};
62  end
63 
64  always @ (posedge mclk) begin
65  wa_mclk[1:0] <= wa[1:0];
66  wa_mclk_d[1:0] <= wa_mclk[1:0];
67  rst_mclk<= rst;
68  if (rst_mclk) ra[1:0] <= 2'h0;
69  else ra[1:0] <= inc_ra?{ra[0],~ra[1]}:{ra[1],ra[0]};
70 
71  if (rst_mclk) ra_next[1:0] <= 2'h1;
72  else ra_next[1:0] <= inc_ra?{~ra[1],~ra[0]}:{ra[0],~ra[1]};
73 
74  inc_ra <= !rst && (ra[1:0]!=wa_mclk_d[1:0]) && (!inc_ra || (ra_next[1:0]!=wa_mclk_d[1:0]));
75  dout_stb <= inc_ra;
76  if (inc_ra) dout[15:0] <= pre_dout[15:0];
77  end
78 
79  reg [15:0] fifo_4x16_ram[0:3];
80  always @ (posedge xclk) if (din_stb) fifo_4x16_ram[wa[1:0]] <= din[15:0];
81  assign pre_dout[15:0] = fifo_4x16_ram[ra[1:0]];
82 
83 endmodule
84 
[0:3] 3418fifo_4x16_ramreg[15:0]