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对齐。

posted @ 2018-05-14 14:00  LeeLIn。  阅读(2657)  评论(0编辑  收藏  举报