























libero Simulate - ModelSim ME (一) 新建工程 - 所长 - 博客园
libero Simulate - ModelSim ME (二) 语法分析 - 所长 - 博客园
libero Simulate - ModelSim ME (三) 实战测试 双端口 RAM 读写
1、 IP 版本, RAM -Dual Port v2.2

2、IP 参数配置, 单位 8bit , 一个字节, 深度 512 ,表示 512字节的 RAM , 双端口 公用一个时钟 , 使能 仿真初始化 RAM 接口


编写 测试文件 步骤:
1、设置 时钟基准
parameter SYSCLK_PERIOD = 100;// 10MHZ
// 定义 时钟信号和复位信号
reg SYSCLK;
reg NSYSRESET;
2、产生时钟信号
always @(SYSCLK) begin
#(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;
end
3、产生复位信号
initial
begin
#(SYSCLK_PERIOD * 10 )
NSYSRESET = 1'b1;
end
3、 例化 RAM 模块
4、 编写 RAM 写入 时序
5、编写 RAM 读取时序
开始仿真:

读取端口使能,地址设为1 , 写入地址设为1 , 写入端口使能和写入数据0x78. 下个时钟周期 写入端口 使能关闭, 再过2个时钟周期后, 端口B 输出数据

/////////////////////////////////////////////////////////////////////////////////////////////////// // Company: <Name> // // File: testbench_ram.v // File history: // <Revision number>: <Date>: <Comments> // <Revision number>: <Date>: <Comments> // <Revision number>: <Date>: <Comments> // // Description: // // <Description here> // // Targeted device: <Family::ProASIC3> <Die::A3P1000> <Package::144 FBGA> // Author: <Name> // /////////////////////////////////////////////////////////////////////////////////////////////////// `timescale 1ns/100ps module testbench_ram(); // 设置时钟基准 parameter SYSCLK_PERIOD = 100;// 10MHZ // 定义 时钟信号和复位信号 reg SYSCLK; reg NSYSRESET; initial begin SYSCLK = 1'b0; NSYSRESET = 1'b0; end ////////////////////////////////////////////////////////////////////// // Reset Pulse ////////////////////////////////////////////////////////////////////// initial begin #(SYSCLK_PERIOD * 1 ) NSYSRESET = 1'b1; end ////////////////////////////////////////////////////////////////////// // Clock Driver ////////////////////////////////////////////////////////////////////// always @(SYSCLK) begin #(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK; end // RAM 读使能 对应 RW信号 高电平 parameter RAM_RW_READ_ENABLE = 1'b1; // RAM 写使能 对应 RW信号 低电平 parameter RAM_RW_WRITE_ENABLE = 1'b0; // BLK 信号使能 parameter RAM_BLK_ENABLE = 1'b0; parameter RAM_BLK_DISABLE = 1'b1; // 例化 双端口 模块 reg [8:0] ram_addr_a; reg [8:0] ram_addr_b; reg ram_blk_a; reg ram_blk_b; reg [7:0] ram_din_a; //wire [7:0] ram_dout_a; wire [7:0] ram_dout_b; ram_buff ram_0( // 512字节 读写同时钟 双端口 RAM .ADDRA(ram_addr_a), .ADDRB(ram_addr_b), .BLKA(ram_blk_a), .BLKB(ram_blk_b), .CLKAB(SYSCLK), .DINA(ram_din_a), .DINB(8'd0), .RESET(NSYSRESET), .RWA(RAM_RW_WRITE_ENABLE), .RWB(RAM_RW_READ_ENABLE), // Outputs // .DOUTA(ram_dout_a), .DOUTB(ram_dout_b) ); // 将 0x12345678 按顺序 写入 RAM // 写完成 读取 RAM reg [7:0] byte1 = 8'h78; reg [7:0] byte2 = 8'h56; reg [7:0] byte3 = 8'h34; reg [7:0] byte4 = 8'h12; reg [8:0] byte_cnt = 0; always @(posedge SYSCLK or negedge NSYSRESET) begin if( !NSYSRESET ) begin byte_cnt <= 32'b0; ram_blk_b <= RAM_BLK_ENABLE; ram_addr_b <= 9'b1; end else begin byte_cnt <= byte_cnt + 1; case(byte_cnt) 0: begin ram_addr_a <= 9'b1; ram_blk_a <= RAM_BLK_ENABLE; ram_din_a <= byte1; end default: begin ram_blk_a <= RAM_BLK_DISABLE; end endcase end end endmodule
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。