x393  1.0
FPGAcodeforElphelNC393camera
cmd_addr.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 /*
41  Currently ddr3_a, ddr3_ba, ddr_cke and ddr_odt do not change inside a 2-clock command cycle, so half register
42  bits are removed during optimization
43 */
44 module cmd_addr #(
45  parameter IODELAY_GRP = "IODELAY_MEMORY",
46  parameter IOSTANDARD = "SSTL15",
47  parameter SLEW = "SLOW",
48  parameter real REFCLK_FREQUENCY = 300.0,
49  parameter HIGH_PERFORMANCE_MODE = "FALSE",
50  parameter integer ADDRESS_NUMBER= 15
51 )(
52  output [ADDRESS_NUMBER-1:0] ddr3_a, // output address ports (14:0) for 4Gb device
53  output [2:0] ddr3_ba, // output bank address ports
54  output ddr3_we, // output WE port
55  output ddr3_ras, // output RAS port
56  output ddr3_cas, // output CAS port
57  output ddr3_cke, // output Clock Enable port
58  output ddr3_odt, // output ODT port
59  input clk, // free-running system clock, same frequency as iclk (shared for R/W)
60  input clk_div, // free-running half clk frequency, front aligned to clk (shared for R/W)
61  input rst, // reset delays/serdes
62  input [2*ADDRESS_NUMBER-1:0] in_a, // input address, 2 bits per signal (first, second) (29:0) for 4Gb device
63  input [5:0] in_ba, // input bank address, 2 bits per signal (first, second)
64  input [1:0] in_we, // input WE, 2 bits (first, second)
65  input [1:0] in_ras, // input RAS, 2 bits (first, second)
66  input [1:0] in_cas, // input CAS, 2 bits (first, second)
67  input [1:0] in_cke, // input CKE, 2 bits (first, second)
68  input [1:0] in_odt, // input ODT, 2 bits (first, second)
69 // input [1:0] in_tri, // tristate command/address outputs - same timing, but no odelay
70  input in_tri, // tristate command/address outputs - same timing, but no odelay
71  input [7:0] dly_data, // delay value (3 LSB - fine delay)
72  input [4:0] dly_addr, // select which delay to program
73  input ld_delay, // load delay data to selected iodelayl (clk_div synchronous)
74  input set // clk_div synchronous set all delays from previously loaded values
75 );
76 reg [2*ADDRESS_NUMBER-1:0] in_a_r=0;
77 reg [5:0] in_ba_r=0;
78 reg [1:0] in_we_r=2'h3, in_ras_r=2'h3, in_cas_r=2'h3, in_cke_r=2'h3, in_odt_r=2'h0;
79 //reg [1:0] in_tri_r=2'h0; // or tri-state on reset?
80 reg in_tri_r=1'b1; // or tri-state on reset?
81 // Preventing register duplication
82  `ifndef IGNORE_ATTR
83  (* keep = "true" *)
84 `endif
85 reg [7:0] dly_data_r=0;
86 `ifndef IGNORE_ATTR
87  (* keep = "true" *)
88 `endif
89 reg set_r=0;
90 reg [7:0] ld_dly_cmd=8'b0;
92 //wire [ADDRESS_NUMBER-1:0] decode_addr;
93 wire [23:0] decode_addr24;
94 wire [7:0] decode_sel={
95  (dly_addr[2:0]==7)?1'b1:1'b0,
96  (dly_addr[2:0]==6)?1'b1:1'b0,
97  (dly_addr[2:0]==5)?1'b1:1'b0,
98  (dly_addr[2:0]==4)?1'b1:1'b0,
99  (dly_addr[2:0]==3)?1'b1:1'b0,
100  (dly_addr[2:0]==2)?1'b1:1'b0,
101  (dly_addr[2:0]==1)?1'b1:1'b0,
102  (dly_addr[2:0]==0)?1'b1:1'b0};
103 assign decode_addr24={
104  (dly_addr[4:3] == 2'h2)?decode_sel[7:0]:8'h0,
105  (dly_addr[4:3] == 2'h1)?decode_sel[7:0]:8'h0,
106  (dly_addr[4:3] == 2'h0)?decode_sel[7:0]:8'h0};
107 //always @ (posedge clk_div or posedge rst) begin
108 always @ (posedge clk_div) begin
109  if (rst) begin
110  in_a_r <= 0; in_ba_r <= 6'b0;
111  in_we_r <= 2'h3; in_ras_r <= 2'h3; in_cas_r <= 2'h3; in_cke_r <= 2'h3; in_odt_r <= 2'h0;
112  in_tri_r <= 1'b1; // or tri-state on reset?
113  dly_data_r<=8'b0;set_r<=1'b0;
114  ld_dly_cmd <= 8'b0; ld_dly_addr <= 0;
115  end else begin
116  in_a_r <= in_a;
117  in_ba_r <= in_ba;
119  in_tri_r <= in_tri;
121  set_r<=set;
122  ld_dly_cmd <= {8 { dly_addr[4] & dly_addr[3] & ld_delay}} & decode_sel[7:0];
123 // ld_dly_addr <= {(ADDRESS_NUMBER) {ld_delay}} & decode_addr;
125  end
126 end
127 
128 // All addresses
129 generate
130  genvar i;
131  for (i=0; i<ADDRESS_NUMBER; i=i+1) begin: addr_block
132 // assign decode_addr[i]=(ld_dly_addr[4:0] == i)?1'b1:1'b0;
136  .SLEW(SLEW),
139  ) cmda_addr_i (
140  .dq(ddr3_a[i]), // I/O pad (appears on the output 1/2 clk_div earlier, than DDR data)
141  .clk(clk), // free-running system clock, same frequency as iclk (shared for R/W)
142  .clk_div(clk_div), // free-running half clk frequency, front aligned to clk (shared for R/W)
143  .rst(rst),
144  .dly_data(dly_data_r[7:0]), // delay value (3 LSB - fine delay)
145  .din({in_a_r[ADDRESS_NUMBER+i],in_a_r[i]}), // parallel data to be sent out
146 // .tin(in_tri_r[1:0]), // tristate for data out (sent out earlier than data!)
147  .tin(in_tri_r), // tristate for data out (sent out earlier than data!)
148  .set_delay(set_r), // clk_div synchronous load odelay value from dly_data
149  .ld_delay(ld_dly_addr[i]) // clk_div synchronous set odealy value from loaded
150 );
151  end
152 endgenerate
153 // Bank addresses
154 // ba0
158  .SLEW(SLEW),
161  ) cmda_ba0_i (
162  .dq(ddr3_ba[0]),
163  .clk(clk),
164  .clk_div(clk_div),
165  .rst(rst),
166  .dly_data(dly_data_r[7:0]),
167  .din({in_ba_r[3],in_ba_r[0]}),
168 // .tin(in_tri_r[1:0]),
169  .tin(in_tri_r),
170  .set_delay(set_r),
171  .ld_delay(ld_dly_cmd[0]));
172 // ba1
176  .SLEW(SLEW),
179  ) cmda_ba1_i (
180  .dq(ddr3_ba[1]),
181  .clk(clk),
182  .clk_div(clk_div),
183  .rst(rst),
184  .dly_data(dly_data_r[7:0]),
185  .din({in_ba_r[4],in_ba_r[1]}),
186 // .tin(in_tri_r[1:0]),
187  .tin(in_tri_r),
188  .set_delay(set_r),
189  .ld_delay(ld_dly_cmd[1]));
190 // ba2
194  .SLEW(SLEW),
197  ) cmda_ba2_i (
198  .dq(ddr3_ba[2]),
199  .clk(clk),
200  .clk_div(clk_div),
201  .rst(rst),
202  .dly_data(dly_data_r[7:0]),
203  .din({in_ba_r[5],in_ba_r[2]}),
204 // .tin(in_tri_r[1:0]),
205  .tin(in_tri_r),
206  .set_delay(set_r),
207  .ld_delay(ld_dly_cmd[2]));
208 
209 // we
213  .SLEW(SLEW),
216  ) cmda_we_i (
217  .dq(ddr3_we),
218  .clk(clk),
219  .clk_div(clk_div),
220  .rst(rst),
221  .dly_data(dly_data_r[7:0]),
222  .din(in_we_r[1:0]),
223 // .tin(in_tri_r[1:0]),
224  .tin(in_tri_r),
225  .set_delay(set_r),
226  .ld_delay(ld_dly_cmd[3]));
227 
228 // ras
232  .SLEW(SLEW),
235  ) cmda_ras_i (
236  .dq(ddr3_ras),
237  .clk(clk),
238  .clk_div(clk_div),
239  .rst(rst),
240  .dly_data(dly_data_r[7:0]),
241  .din(in_ras_r[1:0]),
242 // .tin(in_tri_r[1:0]),
243  .tin(in_tri_r),
244  .set_delay(set_r),
245  .ld_delay(ld_dly_cmd[4]));
246 
247 // cas
251  .SLEW(SLEW),
254  ) cmda_cas_i(
255  .dq(ddr3_cas),
256  .clk(clk),
257  .clk_div(clk_div),
258  .rst(rst),
259  .dly_data(dly_data_r[7:0]),
260  .din(in_cas_r[1:0]),
261 // .tin(in_tri_r[1:0]),
262  .tin(in_tri_r),
263  .set_delay(set_r),
264  .ld_delay(ld_dly_cmd[5]));
265 
266 // cke
270  .SLEW(SLEW),
273  ) cmda_cke_i (
274  .dq(ddr3_cke),
275  .clk(clk),
276  .clk_div(clk_div),
277  .rst(rst),
278  .dly_data(dly_data_r[7:0]),
279  .din(in_cke_r[1:0]),
280 // .tin(in_tri_r[1:0]),
281  .tin(in_tri_r),
282  .set_delay(set_r),
283  .ld_delay(ld_dly_cmd[6]));
284 
285 // odt
289  .SLEW(SLEW),
292  ) cmda_odt_i (
293  .dq(ddr3_odt),
294  .clk(clk),
295  .clk_div(clk_div),
296  .rst(rst),
297  .dly_data(dly_data_r[7:0]),
298  .din(in_odt_r[1:0]),
299 // .tin(in_tri_r[1:0]),
300  .tin(in_tri_r),
301  .set_delay(set_r),
302  .ld_delay(ld_dly_cmd[7]));
303 
304 endmodule
305 
306 
6065ld_dly_addrreg[ADDRESS_NUMBER-1:0]
Definition: cmd_addr.v:91
6060in_odt_rreg[1:0]
Definition: cmd_addr.v:78
cmda_odt_i cmda_single
Definition: cmd_addr.v:286
[4:0] 6051dly_addr
Definition: cmd_addr.v:72
6040clk_div
Definition: cmd_addr.v:60
6036ddr3_cas
Definition: cmd_addr.v:56
6052ld_delay
Definition: cmd_addr.v:73
6058in_cas_rreg[1:0]
Definition: cmd_addr.v:78
6037ddr3_cke
Definition: cmd_addr.v:57
6030HIGH_PERFORMANCE_MODE"FALSE"
Definition: cmd_addr.v:49
[7:0] 6078dly_data
Definition: cmda_single.v:53
[5:0] 6043in_ba
Definition: cmd_addr.v:63
[1:0] 6046in_cas
Definition: cmd_addr.v:66
6067decode_selwire[7:0]
Definition: cmd_addr.v:94
[2*ADDRESS_NUMBER-1:0] 6042in_a
Definition: cmd_addr.v:62
integer 6031ADDRESS_NUMBER15
Definition: cmd_addr.v:50
6035ddr3_ras
Definition: cmd_addr.v:55
[1:0] 6079din
Definition: cmda_single.v:54
6061in_tri_rreg
Definition: cmd_addr.v:80
6064ld_dly_cmdreg[7:0]
Definition: cmd_addr.v:90
6038ddr3_odt
Definition: cmd_addr.v:58
6056in_we_rreg[1:0]
Definition: cmd_addr.v:78
[1:0] 6048in_odt
Definition: cmd_addr.v:68
6055in_ba_rreg[5:0]
Definition: cmd_addr.v:77
[2:0] 6033ddr3_ba
Definition: cmd_addr.v:53
6054in_a_rreg[2*ADDRESS_NUMBER-1:0]
Definition: cmd_addr.v:76
6028SLEW"SLOW"
Definition: cmd_addr.v:47
6057in_ras_rreg[1:0]
Definition: cmd_addr.v:78
[1:0] 6045in_ras
Definition: cmd_addr.v:65
[1:0] 6044in_we
Definition: cmd_addr.v:64
6059in_cke_rreg[1:0]
Definition: cmd_addr.v:78
[7:0] 6050dly_data
Definition: cmd_addr.v:71
6026IODELAY_GRP"IODELAY_MEMORY"
Definition: cmd_addr.v:45
6062dly_data_rreg[7:0]
Definition: cmd_addr.v:85
real 6029REFCLK_FREQUENCY300.0
Definition: cmd_addr.v:48
6027IOSTANDARD"SSTL15"
Definition: cmd_addr.v:46
[ADDRESS_NUMBER-1:0] 6032ddr3_a
Definition: cmd_addr.v:52
6063set_rreg
Definition: cmd_addr.v:89
[1:0] 6047in_cke
Definition: cmd_addr.v:67
6049in_tri
Definition: cmd_addr.v:70
6034ddr3_we
Definition: cmd_addr.v:54
6066decode_addr24wire[23:0]
Definition: cmd_addr.v:93