DUAL PORT RAM应用实例

时间:2022-11-13 01:41:23

作者:桂。

时间:2018-05-14  12:11:00

链接:http://www.cnblogs.com/xingshansi/p/9035522.html


前言

主要是Xilinx 常用模块汇总(verilog)【03】中双端口RAM的细节补充,限于篇幅,单独列出。

一、双端口RAM简述

具体细节参考ug473_7Series_Memory_Resources.pdf.

DUAL PORT RAM应用实例

这里直接调用IP核。

二、IP核参数简述

     A-Page1

DUAL PORT RAM应用实例

  • Common Clock:同源时钟
  • Generate adderss..:默认32bit地址,否则根据深度自动调节
  • ECC:纠错
其他略.
     B-Page2
  • Read First Operating Mode is supported when the Common Clock option is selected.

DUAL PORT RAM应用实例

  • no change mode

DUAL PORT RAM应用实例

这里使用,通常选择no change mode。

     C-Page3

DUAL PORT RAM应用实例

Port-A is used for write, and Port-B is used for read.(原语调用需要注意)
(PORT A/B同理):
DUAL PORT RAM应用实例

在输出添加一个锁存器,即多延1拍,保证时序良好

DUAL PORT RAM应用实例

     D-Page4

DUAL PORT RAM应用实例 
其他略。
     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 = ;
parameter start = ;
//port
logic clk,rst;
logic [:] datin1;
logic [:] datin2;
logic [:] datout;
logic [:] addra, addrb, counter, delayest;
logic [:] flag;//FSM
//initial
initial begin
clk = ;
rst = ;
#
rst = ;
#
$stop;
end always # clk = ~clk; always @(posedge clk)
begin
if(rst) begin
datin1 <= ;
datin2 <= ;
counter <= ;
end
else begin
counter <= counter+;
if(counter == start)
begin
datin1 <= {'b1,17'b0};
end
else begin
datin1 <= ;
end
if (counter == (start + delay ))
begin
datin2 <= {'b1,17'b0};
end
else begin
datin2 <= ;
end
end
end //flag control
always @(posedge clk)
begin
if(rst)
begin
delayest <= ;
addra <= ; //for primitive output register
addrb <= ;
flag <= ;
end
else begin
if (flag == 'b00)
begin
if(datout[])
begin
delayest <= ;
flag <= 'b01;
end
end
if (flag == 'b01)
begin
delayest <= delayest + ;
end
if ((flag == 'b01) & datin2[17])
begin
flag <= 'b10;
end
if (flag == 'b10)
begin
addra <= addra + delayest + ;
flag <= 'b11;//next flag state
end
else begin
addra <= addra + ;
end
addrb <= addrb + ;
end
end
//IP
blk_mem_gen_0 uut(
.clka(clk),
.wea('b1),
.addra(addra),
.dina(datin1),
.clkb(clk),
.addrb(addrb),
.doutb(datout)
); endmodule 

DUAL PORT RAM应用实例

datout是datin1的修正,可见datin1修正后的结果—>datout 已经与datin2对齐。