DUAL PORT RAM應用實例


作者:桂。

時間: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對齊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM