x393  1.0
FPGAcodeforElphelNC393camera
level_cross_clocks.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
42  parameter WIDTH = 1,
43  parameter REGISTER = 2, // number of registers (>=12)
44  parameter FAST0 = 1'b0,
45  parameter FAST1 = 1'b0
46 )(
47  input clk,
48  input [WIDTH-1:0] d_in,
49  output [WIDTH-1:0] d_out
50 );
51  generate
52  genvar i;
53  for (i = 0; i < WIDTH ; i = i+1) begin: level_cross_clock_block
54  if (REGISTER <= 1)
55  level_cross_clocks_ff_bit #(.FAST1(FAST1)) level_cross_clocks_single_i ( // just a single ff (if metastability is not a problem)
56  .clk (clk), // input
57  .d_in (d_in[i]), // input
58  .d_out (d_out[i]) // output
59  );
60  else if (REGISTER == 2)
61  level_cross_clocks_sync_bit #(.FAST0(FAST0),.FAST1(FAST1)) level_cross_clocks_sync_i ( // classic 2-register synchronizer
62  .clk (clk), // input
63  .d_in (d_in[i]), // input
64  .d_out (d_out[i]) // output
65  );
66  else
67  level_cross_clocks_single_bit #( // >2 bits (first two only are synchronizer)
69  ) level_cross_clocks_single_i (
70  .clk (clk), // input
71  .d_in (d_in[i]), // input
72  .d_out (d_out[i]) // output
73  );
74  end
75  endgenerate
76 endmodule
77 
79  parameter REGISTER = 3, // number of registers (>=3)
80  parameter FAST0 = 1'b0,
81  parameter FAST1 = 1'b0
82 )(
83  input clk,
84  input d_in,
85  output d_out
86 );
87  reg [REGISTER - 3 : 0] regs = {REGISTER -2 {FAST1}};
88  wire d_sync; // after a 2-bit synchronizer
89  wire [REGISTER - 2 : 0] regs_next = {regs, d_sync};
90  assign d_out = regs[REGISTER -3];
91  always @ (posedge clk) begin
92  if (FAST0) regs <= {REGISTER - 3{d_in}} & regs_next[REGISTER - 3 : 0];
93  else if (FAST1) regs <= {REGISTER - 3{d_in}} | regs_next[REGISTER - 3 : 0];
94  else regs <= regs_next[REGISTER - 3 : 0]; // | d_in complains about widths mismatch
95  end
96  level_cross_clocks_sync_bit #(.FAST0(FAST0),.FAST1(FAST1)) level_cross_clocks_sync_bit_i (
97  .clk (clk), // input
98  .d_in (d_in), // input
99  .d_out (d_sync) // output
100  );
101 endmodule
102 
103 // Classic 2-bit (exactly) synchronizer
105  parameter FAST0 = 1'b0,
106  parameter FAST1 = 1'b0
107 )(
108  input clk,
109  input d_in,
110  output d_out
111 );
112 `ifndef IGNORE_ATTR
113  (* ASYNC_REG = "TRUE" *)
114 `endif
115  reg [1:0] sync_zer;
116  assign d_out = sync_zer [1];
117  always @ (posedge clk) begin
118  if (FAST0) sync_zer <= {sync_zer[0] & d_in, d_in};
119  else if (FAST1) sync_zer <= {sync_zer[0] | d_in, d_in};
120  else sync_zer <= {sync_zer[0],d_in};
121  end
122 endmodule
123 
124 module level_cross_clocks_ff_bit #( // just a single FF if REGISTER == 1 (if metastability is not a problem)
125  parameter FAST1 = 1'b0
126 ) (
127  input clk,
128  input d_in,
129  output d_out
130 );
131  reg d_out_r = FAST1;
132  assign d_out = d_out_r;
133  always @ (posedge clk) begin
134  d_out_r <= d_in;
135  end
136 endmodule
137 
138 
139 
[WIDTH-1:0] 10629d_out
level_cross_clocks_single_i level_cross_clocks_ff_bit[generate]
[WIDTH-1:0] 10628d_in
level_cross_clocks_single_i level_cross_clocks_single_bit[generate]
level_cross_clocks_sync_bit_i level_cross_clocks_sync_bit
level_cross_clocks_sync_i level_cross_clocks_sync_bit[generate]