FPGA开源工作室将通过五篇文章来给大家讲解xilinx FPGA 使用mig IP对DDR3的读写控制,旨在让大家更快的学习和应用DDR3。

本实验和工程基于Digilent的Arty Artix-35T FPGA开发板完成。

软件使用Vivado 2018.1。

参考工程:ddr3_test。

第一篇:DDR3和mig的介绍

第二篇:mig IP的创建

第三篇:mig IP用户读写时序

第四篇:mig IP的仿真

 第五篇:mig读写时序下板实现

1顶层文件和约束文件

ddr3_test.v

  1. `timescale 1ns / 1ps
  2. `define CMD_WR 3'b000
  3. `define CMD_RD 3'b001
  4. module ddr3_test(
  5. input clk,//100MHZ
  6. input reset,
  7. output init_calib_complete,
  8. //DDR3 Interface
  9. // Inouts
  10. inout [15:0]        ddr3_dq,
  11. inout [1:0]         ddr3_dqs_n,
  12. inout [1:0]         ddr3_dqs_p,
  13. // Outputs
  14. output [13:0]       ddr3_addr,
  15. output [2:0]        ddr3_ba,
  16. output              ddr3_ras_n,
  17. output              ddr3_cas_n,
  18. output              ddr3_we_n,
  19. output              ddr3_reset_n,
  20. output [0:0]        ddr3_ck_p,
  21. output [0:0]        ddr3_ck_n,
  22. output [0:0]        ddr3_cke,
  23. output [0:0]        ddr3_cs_n,
  24. output [1:0]        ddr3_dm,
  25. output [0:0]         ddr3_odt
  26. );
  27. //***************************************************************************
  28. parameter IDLE  = 5'd0,
  29. WR1   = 5'd1,
  30. WR2   = 5'd2,
  31. WR3   = 5'd3,
  32. WR4   = 5'd4,
  33. WR5   = 5'd5,
  34. WR6   = 5'd6,
  35. WR7   = 5'd7,
  36. WR8   = 5'd8,
  37. RD1   = 5'd9,
  38. RD2   = 5'd10,
  39. RD3   = 5'd11,
  40. RD4   = 5'd12,
  41. RD5   = 5'd13,
  42. RD6   = 5'd14,
  43. RD7   = 5'd15,
  44. RD8   = 5'd16,
  45. DONE  = 5'd17;
  46. //
  47. // Single-ended system clock
  48. wire                                       sys_clk_i;//166.667MHZ
  49. // Single-ended iodelayctrl clk (reference clock)
  50. wire                                        clk_ref_i;//200MHZ
  51. // user interface signals
  52. wire [27:0]        app_addr;//i
  53. reg [2:0]         app_cmd;//i
  54. wire               app_en;//i
  55. reg [127:0]       app_wdf_data;//i
  56. wire               app_wdf_end;//i
  57. wire [15:0]        app_wdf_mask;//i
  58. wire              app_wdf_wren;//i
  59. wire [127:0]       app_rd_data;
  60. wire               app_rd_data_end;
  61. wire               app_rd_data_valid;
  62. wire               app_rdy;
  63. wire               app_wdf_rdy;
  64. wire               app_sr_req;//i
  65. wire               app_ref_req;//i
  66. wire               app_zq_req;//i
  67. wire               app_sr_active;
  68. wire               app_ref_ack;
  69. wire               app_zq_ack;
  70. wire               ui_clk;
  71. wire               ui_clk_sync_rst;
  72. //wire               init_calib_complete;
  73. wire                sys_rst_n;
  74. wire                sys_rst;
  75. assign sys_rst =    sys_rst_n;
  76. reg [4:0] cstate,nstate;
  77. //wire [27:0]        wr_addr;//i  bank row column [2:0] [13:0] [9:0]
  78. //wire [27:0]        rd_addr;//i  bank row column [2:0] [13:0] [9:0]
  79. wire wr1_done;
  80. wire wr2_done;
  81. wire wr3_done;
  82. wire wr4_done;
  83. wire wr5_done;
  84. wire wr6_done;
  85. wire wr7_done;
  86. wire wr8_done;
  87. wire rd1_done;
  88. wire rd2_done;
  89. wire rd3_done;
  90. wire rd4_done;
  91. wire rd5_done;
  92. wire rd6_done;
  93. wire rd7_done;
  94. wire rd8_done;
  95. reg [2:0] bank;
  96. //reg [13:0] row;
  97. //reg [9:0] column;
  98. reg [23:0] addr;
  99. //assign  wr_addr =(cstate == WR1 ||cstate == WR2 ||cstate == WR3 ||cstate == WR4 ||cstate == WR5 ||cstate == WR6 ||cstate == WR7 ||cstate == WR8)?{1'b0,bank,addr}:28'b0;
  100. //assign  wr_addr =(cstate == RD1 ||cstate == RD2 ||cstate == RD3 ||cstate == RD4 ||cstate == RD5 ||cstate == RD6 ||cstate == RD7 ||cstate == RD8)?{1'b0,bank,addr}:28'b0;
  101. assign app_addr ={1'b0,bank,addr};
  102. assign  app_sr_req = 1'b0;
  103. assign app_ref_req = 1'b0;
  104. assign app_zq_req  = 1'b0;
  105. //assign app_addr = (app_cmd ==`CMD_WR && app_en == 1'b1)?wr_addr:rd_addr;
  106. assign app_wdf_mask = 16'h0000;
  107. assign app_wdf_end = app_wdf_wren;
  108. assign wr1_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b000) ? 1'b1:1'b0;
  109. assign wr2_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b001) ? 1'b1:1'b0;
  110. assign wr3_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b010) ? 1'b1:1'b0;
  111. assign wr4_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b011) ? 1'b1:1'b0;
  112. assign wr5_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b100) ? 1'b1:1'b0;
  113. assign wr6_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b101) ? 1'b1:1'b0;
  114. assign wr7_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b110) ? 1'b1:1'b0;
  115. assign wr8_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b111) ? 1'b1:1'b0;
  116. assign rd1_done = (cstate == RD1 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;
  117. assign rd2_done = (cstate == RD2 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;
  118. assign rd3_done = (cstate == RD3 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;
  119. assign rd4_done = (cstate == RD4 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;
  120. assign rd5_done = (cstate == RD5 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;
  121. assign rd6_done = (cstate == RD6 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;
  122. assign rd7_done = (cstate == RD7 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;
  123. assign rd8_done = (cstate == RD8 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;
  124. assign done_flag = (cstate == DONE)?1'b1:1'b0;
  125. assign app_en =(((cstate == WR1 ||cstate == WR2 ||cstate == WR3 ||cstate == WR4 ||cstate == WR5 ||cstate == WR6 ||cstate == WR7 ||cstate == WR8)&& app_wdf_rdy == 1'b1&&app_rdy == 1'b1)||((cstate == RD1 ||cstate == RD2 ||cstate == RD3 ||cstate == RD4 ||cstate == RD5 ||cstate == RD6 ||cstate == RD7 ||cstate == RD8)&& app_rdy == 1'b1)&&((!wr1_done)||(!wr2_done)||(!wr3_done)||(!wr4_done)||(!wr5_done)||(!wr6_done)||(!wr7_done)||(!wr8_done)||(!rd1_done)||(!rd2_done)||(!rd3_done)||(!rd4_done)||(!rd5_done)||(!rd6_done)||(!rd7_done)||(!rd8_done)))?1'b1:1'b0;
  126. assign app_wdf_wren =(((cstate == WR1 ||cstate == WR2 ||cstate == WR3 ||cstate == WR4 ||cstate == WR5 ||cstate == WR6 ||cstate == WR7 ||cstate == WR8) && app_wdf_rdy == 1'b1&&app_rdy == 1'b1)&&((!wr1_done)||(!wr2_done)||(!wr3_done)||(!wr4_done)||(!wr5_done)||(!wr6_done)||(!wr7_done)||(!wr8_done)))?1'b1:1'b0;
  127. always @(posedge ui_clk or posedge ui_clk_sync_rst) begin
  128. if(ui_clk_sync_rst == 1'b1)
  129. cstate <= IDLE;
  130. else
  131. cstate <= nstate;
  132. end
  133. always @(*) begin
  134. nstate = IDLE;
  135. case(cstate)
  136. IDLE:begin
  137. if(init_calib_complete == 1'b1)
  138. nstate = WR1;
  139. else
  140. nstate = IDLE;
  141. end
  142. WR1:begin
  143. if(wr1_done == 1'b1)
  144. nstate = WR2;
  145. else
  146. nstate = WR1;
  147. end
  148. WR2:begin
  149. if(wr2_done == 1'b1)
  150. nstate = WR3;
  151. else
  152. nstate = WR2;
  153. end
  154. WR3:begin
  155. if(wr3_done == 1'b1)
  156. nstate = WR4;
  157. else
  158. nstate = WR3;
  159. end
  160. WR4:begin
  161. if(wr4_done == 1'b1)
  162. nstate = WR5;
  163. else
  164. nstate = WR4;
  165. end
  166. WR5:begin
  167. if(wr5_done == 1'b1)
  168. nstate = WR6;
  169. else
  170. nstate = WR5;
  171. end
  172. WR6:begin
  173. if(wr6_done == 1'b1)
  174. nstate = WR7;
  175. else
  176. nstate = WR6;
  177. end
  178. WR7:begin
  179. if(wr7_done == 1'b1)
  180. nstate = WR8;
  181. else
  182. nstate = WR7;
  183. end
  184. WR8:begin
  185. if(wr8_done == 1'b1)
  186. nstate = RD1;
  187. else
  188. nstate = WR8;
  189. end
  190. RD1:begin
  191. if(rd1_done == 1'b1)
  192. nstate = RD2;
  193. else
  194. nstate = RD1;
  195. end
  196. RD2:begin
  197. if(rd2_done == 1'b1)
  198. nstate = RD3;
  199. else
  200. nstate = RD2;
  201. end
  202. RD3:begin
  203. if(rd3_done == 1'b1)
  204. nstate = RD4;
  205. else
  206. nstate = RD3;
  207. end
  208. RD4:begin
  209. if(rd4_done == 1'b1)
  210. nstate = RD5;
  211. else
  212. nstate = RD4;
  213. end
  214. RD5:begin
  215. if(rd5_done == 1'b1)
  216. nstate = RD6;
  217. else
  218. nstate = RD5;
  219. end
  220. RD6:begin
  221. if(rd6_done == 1'b1)
  222. nstate = RD7;
  223. else
  224. nstate = RD6;
  225. end
  226. RD7:begin
  227. if(rd7_done == 1'b1)
  228. nstate = RD8;
  229. else
  230. nstate = RD7;
  231. end
  232. RD8:begin
  233. if(rd8_done == 1'b1)
  234. nstate = DONE;
  235. else
  236. nstate = RD8;
  237. end
  238. DONE:begin
  239. nstate = WR1;
  240. end
  241. endcase
  242. end
  243. always @(posedge ui_clk or posedge ui_clk_sync_rst) begin
  244. if(ui_clk_sync_rst == 1'b1) begin
  245. //wr_addr <= 28'd0; //bank [] row [] col []
  246. //rd_addr <= 28'b0;
  247. app_cmd <= `CMD_WR;
  248. app_wdf_data <= 128'b0;
  249. bank <= 3'b000;
  250. //row  <= 14'b0;
  251. //column <= 10'b0;
  252. addr <=24'b0;
  253. end
  254. else
  255. case(cstate)
  256. WR1:begin
  257. app_cmd <= `CMD_WR;
  258. bank <= 3'b000;
  259. if(wr1_done == 1'b1) begin
  260. addr <=24'b0;
  261. app_wdf_data <= 128'b0;
  262. end
  263. else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin
  264. //wr_addr <= wr_addr + 8;
  265. //row  <= 14'b0;
  266. //column <= column+8;
  267. addr <= addr +8;
  268. app_wdf_data <= app_wdf_data +1;
  269. end
  270. else begin
  271. addr <= addr;
  272. app_wdf_data <= app_wdf_data;
  273. end
  274. end
  275. WR2:begin
  276. app_cmd <= `CMD_WR;
  277. bank <= 3'b001;
  278. if(wr2_done == 1'b1) begin
  279. addr <=24'b0;
  280. app_wdf_data <= 128'b0;
  281. end
  282. else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin
  283. //wr_addr <= wr_addr + 8;
  284. //row  <= 14'b0;
  285. //column <= column+8;
  286. addr <= addr +8;
  287. app_wdf_data <= app_wdf_data +1;
  288. end
  289. else begin
  290. addr <= addr;
  291. app_wdf_data <= app_wdf_data;
  292. end
  293. end
  294. WR3:begin
  295. app_cmd <= `CMD_WR;
  296. bank <= 3'b010;
  297. if(wr3_done == 1'b1) begin
  298. addr <=24'b0;
  299. app_wdf_data <= 128'b0;
  300. end
  301. else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin
  302. //wr_addr <= wr_addr + 8;
  303. //row  <= 14'b0;
  304. //column <= column+8;
  305. addr <= addr +8;
  306. app_wdf_data <= app_wdf_data +1;
  307. end
  308. else begin
  309. addr <= addr;
  310. app_wdf_data <= app_wdf_data;
  311. end
  312. end
  313. WR4:begin
  314. app_cmd <= `CMD_WR;
  315. bank <= 3'b011;
  316. if(wr4_done == 1'b1) begin
  317. addr <=24'b0;
  318. app_wdf_data <= 128'b0;
  319. end
  320. else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin
  321. //wr_addr <= wr_addr + 8;
  322. //row  <= 14'b0;
  323. //column <= column+8;
  324. addr <= addr +8;
  325. app_wdf_data <= app_wdf_data +1;
  326. end
  327. else begin
  328. addr <= addr;
  329. app_wdf_data <= app_wdf_data;
  330. end
  331. end
  332. WR5:begin
  333. app_cmd <= `CMD_WR;
  334. bank <= 3'b100;
  335. if(wr5_done == 1'b1) begin
  336. addr <=24'b0;
  337. app_wdf_data <= 128'b0;
  338. end
  339. else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin
  340. //wr_addr <= wr_addr + 8;
  341. //row  <= 14'b0;
  342. //column <= column+8;
  343. addr <= addr +8;
  344. app_wdf_data <= app_wdf_data +1;
  345. end
  346. else begin
  347. addr <= addr;
  348. app_wdf_data <= app_wdf_data;
  349. end
  350. end
  351. WR6:begin
  352. app_cmd <= `CMD_WR;
  353. bank <= 3'b101;
  354. if(wr6_done == 1'b1) begin
  355. addr <=24'b0;
  356. app_wdf_data <= 128'b0;
  357. end
  358. else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin
  359. //wr_addr <= wr_addr + 8;
  360. //row  <= 14'b0;
  361. //column <= column+8;
  362. addr <= addr +8;
  363. app_wdf_data <= app_wdf_data +1;
  364. end
  365. else begin
  366. addr <= addr;
  367. app_wdf_data <= app_wdf_data;
  368. end
  369. end
  370. WR7:begin
  371. app_cmd <= `CMD_WR;
  372. bank <= 3'b110;
  373. if(wr7_done == 1'b1) begin
  374. addr <=24'b0;
  375. app_wdf_data <= 128'b0;
  376. end
  377. else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin
  378. //wr_addr <= wr_addr + 8;
  379. //row  <= 14'b0;
  380. //column <= column+8;
  381. addr <= addr +8;
  382. app_wdf_data <= app_wdf_data +1;
  383. end
  384. else begin
  385. addr <= addr;
  386. app_wdf_data <= app_wdf_data;
  387. end
  388. end
  389. WR8:begin
  390. app_cmd <= `CMD_WR;
  391. bank <= 3'b111;
  392. if(wr8_done == 1'b1) begin
  393. addr <=24'b0;
  394. app_wdf_data <= 128'b0;
  395. end
  396. else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin
  397. //wr_addr <= wr_addr + 8;
  398. //row  <= 14'b0;
  399. //column <= column+8;
  400. addr <= addr +8;
  401. app_wdf_data <= app_wdf_data +1;
  402. end
  403. else begin
  404. addr <= addr;
  405. app_wdf_data <= app_wdf_data;
  406. end
  407. end
  408. RD1:begin
  409. app_cmd <= `CMD_RD;
  410. bank <= 3'b000;
  411. if(rd1_done == 1'b1) begin
  412. addr <= 24'b0;
  413. end
  414. else if(app_rdy == 1'b1)begin
  415. addr <= addr+8;
  416. end
  417. else begin
  418. addr <= addr;
  419. end
  420. end
  421. RD2:begin
  422. app_cmd <= `CMD_RD;
  423. bank <= 3'b001;
  424. if(rd2_done == 1'b1) begin
  425. addr <= 24'b0;
  426. end
  427. else if(app_rdy == 1'b1)begin
  428. addr <= addr+8;
  429. end
  430. else begin
  431. addr <= addr;
  432. end
  433. end
  434. RD3:begin
  435. app_cmd <= `CMD_RD;
  436. bank <= 3'b010;
  437. if(rd3_done == 1'b1) begin
  438. addr <= 24'b0;
  439. end
  440. else if(app_rdy == 1'b1)begin
  441. addr <= addr+8;
  442. end
  443. else begin
  444. addr <= addr;
  445. end
  446. end
  447. RD4:begin
  448. app_cmd <= `CMD_RD;
  449. bank <= 3'b011;
  450. if(rd4_done == 1'b1) begin
  451. addr <= 24'b0;
  452. end
  453. else if(app_rdy == 1'b1)begin
  454. addr <= addr+8;
  455. end
  456. else begin
  457. addr <= addr;
  458. end
  459. end
  460. RD5:begin
  461. app_cmd <= `CMD_RD;
  462. bank <= 3'b100;
  463. if(rd5_done == 1'b1) begin
  464. addr <= 24'b0;
  465. end
  466. else if(app_rdy == 1'b1)begin
  467. addr <= addr+8;
  468. end
  469. else begin
  470. addr <= addr;
  471. end
  472. end
  473. RD6:begin
  474. app_cmd <= `CMD_RD;
  475. bank <= 3'b101;
  476. if(rd6_done == 1'b1) begin
  477. addr <= 24'b0;
  478. end
  479. else if(app_rdy == 1'b1)begin
  480. addr <= addr+8;
  481. end
  482. else begin
  483. addr <= addr;
  484. end
  485. end
  486. RD7:begin
  487. app_cmd <= `CMD_RD;
  488. bank <= 3'b110;
  489. if(rd7_done == 1'b1) begin
  490. addr <= 24'b0;
  491. end
  492. else if(app_rdy == 1'b1)begin
  493. addr <= addr+8;
  494. end
  495. else begin
  496. addr <= addr;
  497. end
  498. end
  499. RD8:begin
  500. app_cmd <= `CMD_RD;
  501. bank <= 3'b111;
  502. if(rd8_done == 1'b1) begin
  503. addr <= 24'b0;
  504. end
  505. else if(app_rdy == 1'b1)begin
  506. addr <= addr+8;
  507. end
  508. else begin
  509. addr <= addr;
  510. end
  511. end
  512. DONE:begin
  513. //wr_addr <= 28'd0; //bank [] row [] col []
  514. //rd_addr <= 28'b0;
  515. bank <= 3'b000;
  516. //row  <= 14'b0;
  517. //column <= 10'b0;
  518. addr <=24'b0;
  519. app_cmd <= `CMD_WR;
  520. app_wdf_data <= 128'b0;
  521. end
  522. endcase
  523. end
  524. clk_wiz_0  U_clk_wiz_0(
  525. // Clock in ports
  526. .clk_in1(clk),
  527. // Clock out ports
  528. .clk_out1(sys_clk_i),
  529. .clk_out2(clk_ref_i),
  530. // Status and control signals
  531. .reset(reset),
  532. .locked(sys_rst_n)
  533. );
  534. //***************************************************************************
  535. ddr3_ip u_ddr3_ip
  536. (
  537. // Memory interface ports
  538. .ddr3_addr                      (ddr3_addr),
  539. .ddr3_ba                        (ddr3_ba),
  540. .ddr3_cas_n                     (ddr3_cas_n),
  541. .ddr3_ck_n                      (ddr3_ck_n),
  542. .ddr3_ck_p                      (ddr3_ck_p),
  543. .ddr3_cke                       (ddr3_cke),
  544. .ddr3_ras_n                     (ddr3_ras_n),
  545. .ddr3_we_n                      (ddr3_we_n),
  546. .ddr3_dq                        (ddr3_dq),
  547. .ddr3_dqs_n                     (ddr3_dqs_n),
  548. .ddr3_dqs_p                     (ddr3_dqs_p),
  549. .ddr3_reset_n                   (ddr3_reset_n),
  550. .init_calib_complete            (init_calib_complete),
  551. .ddr3_cs_n                      (ddr3_cs_n),
  552. .ddr3_dm                        (ddr3_dm),
  553. .ddr3_odt                       (ddr3_odt),
  554. // Application interface ports
  555. .app_addr                       (app_addr),
  556. .app_cmd                        (app_cmd),
  557. .app_en                         (app_en),
  558. .app_wdf_data                   (app_wdf_data),
  559. .app_wdf_end                    (app_wdf_end),
  560. .app_wdf_wren                   (app_wdf_wren),
  561. .app_rd_data                    (app_rd_data),
  562. .app_rd_data_end                (app_rd_data_end),
  563. .app_rd_data_valid              (app_rd_data_valid),
  564. .app_rdy                        (app_rdy),
  565. .app_wdf_rdy                    (app_wdf_rdy),
  566. .app_sr_req                     (app_sr_req),
  567. .app_ref_req                    (app_ref_req),
  568. .app_zq_req                     (app_zq_req),
  569. .app_sr_active                  (app_sr_active),
  570. .app_ref_ack                    (app_ref_ack),
  571. .app_zq_ack                     (app_zq_ack),
  572. .ui_clk                         (ui_clk),
  573. .ui_clk_sync_rst                (ui_clk_sync_rst),
  574. .app_wdf_mask                   (app_wdf_mask),
  575. // System Clock Ports
  576. .sys_clk_i                       (sys_clk_i),
  577. // Reference Clock Ports
  578. .clk_ref_i                      (clk_ref_i),
  579. .sys_rst                        (sys_rst)
  580. );
  581. ila_0 U_ila(
  582. .clk(ui_clk),
  583. .probe0(app_addr),
  584. .probe1(app_cmd),
  585. .probe2(app_en),
  586. .probe3(app_wdf_data),
  587. .probe4(app_wdf_end),
  588. .probe5(app_wdf_mask),
  589. .probe6(app_wdf_wren),
  590. .probe7(app_rd_data),
  591. .probe8(app_rd_data_end),
  592. .probe9(app_rd_data_valid),
  593. .probe10(app_rdy),
  594. .probe11(app_wdf_rdy),
  595. .probe12(app_sr_req),
  596. .probe13(app_ref_req),
  597. .probe14(app_zq_req),
  598. .probe15(app_sr_active)
  599. );
  600. endmodule

ddr3.xdc

  1. set_property PACKAGE_PIN E3 [get_ports clk]
  2. set_property IOSTANDARD LVCMOS33 [get_ports clk]
  3. set_property PACKAGE_PIN D9 [get_ports reset]
  4. set_property PACKAGE_PIN E1 [get_ports init_calib_complete]
  5. set_property IOSTANDARD LVCMOS33 [get_ports init_calib_complete]
  6. set_property IOSTANDARD LVCMOS33 [get_ports reset]

2 下板实现读写时序

1>①完成综合和实现

2>下载bit文件和debug文件。

3>下载完成,查看波形。

4>将app_wdf_data数据格式改为Unsigned Decimal。

5>查看写时序。

6>查看读时序。

基于xilinx mig ip对ddr3读写的验证完成。学会ddr3接口的读写控制是每个FPGA工程师必须掌握的技能(几乎所有的公司都会要求),暂时没时间学习的同学可以在FPGA开源工作室(微信公众号)下回复“DDR3”获取xilinx mig ip使用的五篇pdf文档,以备不时之需。

第五篇:mig读写时序下板实现相关推荐

  1. 第三篇:mig IP用户读写时序

    FPGA开源工作室将通过五篇文章来给大家讲解xilinx FPGA 使用mig IP对DDR3的读写控制,旨在让大家更快的学习和应用DDR3. 本实验和工程基于Digilent的Arty Artix- ...

  2. Xilinx FPGA平台DDR3设计保姆式教程(3)MIG IP核使用教程及DDR读写时序

    干货来了,用DDR搬砖,只需要会用IP就好,Xilinx官方YYDS! ---------------------------------------------------------------- ...

  3. 【OpenCV入门指南】第五篇轮廓检测 下

    上一篇<[OpenCV入门指南]第五篇轮廓检测上>介绍了cvFindContours函数和cvDrawContours函数,并作了一个简单的使用示范.本篇将展示一个实例,让大家对轮廓检测有 ...

  4. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  5. MyCat 学习笔记 第十五篇 . 数据分片后的迁移验证

    本篇前言 前面几篇把 mycat 分片.批量压力测试的功能都验证了一把,这回体验下系统上线前做数据分片规划,上线后若服务器压力过大时做数据迁移的过程. 其实做起来还是比较简单的验证,就是把之前几篇和d ...

  6. 转载 解密蓝牙mesh系列 | 第五篇 【好友(Friend)和低功耗节点(LPN)】【友谊(Friendship)参数】【友谊建立】【友谊(Friendship)消息传送】【安全性】【友谊终止】

    YD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了B ...

  7. Asp.net 处理程序(第五篇)

    Asp.net 处理程序(第五篇) HttpApplication有19个标准事件,当到达第8个事件PostMapRequestHandler触发的时候,标志着已经获取到了处理请求的处理程序对象,在第 ...

  8. 类的继承python事例_【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸...

    作者:白宁超 2016年10月10日22:36:57 摘要:继一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc入门资料包含了基本要点.本文是对文档常用核心要点进行梳理,简 ...

  9. Python之路【第五篇】:面向对象及相关

    Python之路[第五篇]:面向对象及相关 Python之路[第五篇]:面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance ...

最新文章

  1. Ajax Upload多文件上传插件翻译及中文演示
  2. node更新到最新版本_win10怎么更新flash到最新版本「系统天地」
  3. 《微软的软件测试之道》读书笔记 之 结构测试技术
  4. 二维数组和指针(包含交换二维数组行列)
  5. 安卓平台有哪些好的时间管理软件
  6. 5分钟latex 使用入门写llncs论文
  7. 记一次namenode关机导致的问题
  8. 通俗的解释云计算 公有云 私有云 混合云
  9. Spark集群环境搭建+Maven、SBT编译部署+IDEA开发(一)
  10. 推荐一款linux下流程图绘制工具-yEd Graph Editor
  11. 【CSDN问答】关于CSDN问答社区的那些事儿
  12. VisualStudio 如何使用UML呢?(转自简书雨落随风)
  13. WIN10中IE双击没有反应打不开要右键以管理员身份才能运行
  14. Flutter 插件开发:iOS篇
  15. Run-down Protection
  16. java通过framer生成word_DSO Framer Control Object 操作word文件
  17. 一套.Net Core学校管理系统源码
  18. 根据不同的厂商,分析师和IT用户对云计算的看法,云计算应该这样细分
  19. 产品原则和产品评审团
  20. 未能检测服务器连接失败,被控链接失败处理检查方法

热门文章

  1. Sqlserver 英文月份格式时间字符串转换为数字型日期
  2. 什么是pptp,什么是vps?两者有何区别?
  3. excel使用教程_汉字资料如何进行数据分析?Excel中医学汉字资料转化为数字资料视频教程——If/Iserror/Find函数的结合使用...
  4. kdj超卖_最全的KDJ(超买超卖)指标实用技巧(图解)
  5. 关于跨境电商你了解多少!我们应该怎么做跨境电商?(中)
  6. 建设一个SaaS平台需要知道什么,做什么
  7. 2022年虚拟电厂行业研究报
  8. 前端小练习:纯css菜单栏
  9. 软件发明专利实例_软件发明专利思路
  10. 靠着游戏收入支撑打造众多口碑产品的网易,下一个20年会如何走