作者:桂。
时间: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 = ;
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
datout是datin1的修正,可见datin1修正后的结果—>datout 已经与datin2对齐。