作者:桂。
時間:2018-05-14 12:11:00
鏈接:http://www.cnblogs.com/xingshansi/p/9035522.html
前言
主要是Xilinx 常用模塊匯總(verilog)【03】中雙端口RAM的細節補充,限於篇幅,單獨列出。
一、雙端口RAM簡述
具體細節參考ug473_7Series_Memory_Resources.pdf.
這里直接調用IP核。
二、IP核參數簡述
A-Page1
- Common Clock:同源時鍾
- Generate adderss..:默認32bit地址,否則根據深度自動調節
- ECC:糾錯
其他略.
B-Page2
- Read First Operating Mode is supported when the Common Clock option is selected.
- no change mode
這里使用,通常選擇no change mode。
C-Page3
Port-A is used for write, and Port-B is used for read.(原語調用需要注意)
(PORT A/B同理):

在輸出添加一個鎖存器,即多延1拍,保證時序良好。
D-Page4

其他略。
E-Page5
略。
三、仿真驗證
任務要求【簡化】:
兩路周期為64clocks【對應最大延遲數】的數據鏈,相差delay clocks,現在需要用DUAL PORT RAM進行對齊處理。
思路分析:
1)選1路為參考,一路進入DUAL PORT RAM修正;
2)修正思路:對於脈沖信號,信號高為有效->判斷延拍數—>根據延拍數進行地址偏移->輸出對齊的數據。
Testbench:
`timescale 1ns / 1ps /* Function: DPRAM for data aligned Author: Gui. Data: 2018年5月14日12:49:07 */ module dpram_tb; //parameter //parameter datwidth = 18; parameter delay = 16; parameter start = 2; //port logic clk,rst; logic [17:0] datin1; logic [17:0] datin2; logic [17:0] datout; logic [5:0] addra, addrb, counter, delayest; logic [1:0] flag;//FSM //initial initial begin clk = 0; rst = 1; #8 rst = 0; #2000 $stop; end always #2 clk = ~clk; always @(posedge clk) begin if(rst) begin datin1 <= 0; datin2 <= 0; counter <= 0; end else begin counter <= counter+1; if(counter == start) begin datin1 <= {1'b1,17'b0}; end else begin datin1 <= 0; end if (counter == (start + delay )) begin datin2 <= {1'b1,17'b0}; end else begin datin2 <= 0; end end end //flag control always @(posedge clk) begin if(rst) begin delayest <= 0; addra <= 1; //for primitive output register addrb <= 0; flag <= 0; end else begin if (flag == 2'b00) begin if(datout[17]) begin delayest <= 0; flag <= 2'b01; end end if (flag == 2'b01) begin delayest <= delayest + 1; end if ((flag == 2'b01) & datin2[17]) begin flag <= 2'b10; end if (flag == 2'b10) begin addra <= addra + delayest + 1; flag <= 2'b11;//next flag state end else begin addra <= addra + 1; end addrb <= addrb + 1; end end //IP blk_mem_gen_0 uut( .clka(clk), .wea(1'b1), .addra(addra), .dina(datin1), .clkb(clk), .addrb(addrb), .doutb(datout) ); endmodule
datout是datin1的修正,可見datin1修正后的結果—>datout 已經與datin2對齊。