惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Vercel News
Vercel News
C
Check Point Blog
G
Google Developers Blog
博客园 - 司徒正美
量子位
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
A
About on SuperTechFans
美团技术团队
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Cloudflare Blog
U
Unit 42

博客园 - 所长

xilinx axi qspi V3.2 slave interrupt lwip 快速 高频 短帧发送 测试 If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED to prevent this code from redefining it. FPGA Verilog 线性反馈移位寄存器(LFSR) Libero FIFO Controller without Memory Software-Defined Radio for Engineers 一 频谱仪 N9020A 操作步骤记录 FPGA-CAN MAC 层 IP 核测试(二) 源码阅读 libero reg 编译时 占用 RAM 资源 而不是 LUT 资源 加扰和解扰 FPGA-CAN MAC 层 IP 核测试(一) 上板实测 Microchip SoftConsole v2022.2-RISC-V-747 polarfire soc 裸机例程中 链接文件 mpfs-envm-lma-scratchpad-vma.ld 分析 FlashPro5 导致 window11 蓝屏 libero verilog 模块例化时,信号不存在 默认是 不连接 A3P250 在线 debug 抓取信号 Identify 在线逻辑分析仪 MPFS250T MSS 引脚 上下拉配置 如何在 libero 中 写一个 axi4 slave 总线的 IP核 可以 和 CoreAXI4Interconnect 连接 (五) 官方参考 verilog 按键消抖模块 如何在 libero 中 写一个 axi4 slave 总线的 IP核 可以 和 CoreAXI4Interconnect 连接 (四) axi-lite 信号抓取 libero Active Probes 如何在 libero 中 写一个 axi4 slave 总线的 IP核 可以 和 CoreAXI4Interconnect 连接 (三) C代码测试 访问卡死 如何在 libero 中 写一个 axi4 slave 总线的 IP核 可以 和 CoreAXI4Interconnect 连接 (二) axi-lite 如何在 libero 中 写一个 axi4 slave 总线的 IP核 可以 和 CoreAXI4Interconnect 连接(一)libero 设置把模块信号变总线方式 libero 2025.2 Macro Library User Guide for SmartFusion 2 and IGLOO 2 FPGAs 如何在 libero 中 写一个 axi4 slave 总线的 IP核 可以 和 CoreAXI4Interconnect 连接 (零) MSS CFG MPFS250T FLASH 只有 128KB 调整代码优化 AD9361 SPI no-os 文件移植 SoftConsole MPFS250T 初学(七) 初始化日志记录 AD9361 SPI no-os 文件移植 SoftConsole MPFS250T 初学(六) 开启 日志打印 Calibration TIMEOUT (0x247, 0x2) AD9361 SPI no-os 文件移植 SoftConsole MPFS250T 初学(五) ad9361_check_cal_done 卡死
libero Simulate - ModelSim ME (三) 实战测试 双端口 RAM ...
所长 · 2026-04-17 · via 博客园 - 所长

libero Simulate - ModelSim ME (一) 新建工程 - 所长 - 博客园

libero Simulate - ModelSim ME (二) 语法分析 - 所长 - 博客园

libero Simulate - ModelSim ME (三) 实战测试 双端口 RAM 读写

1、 IP 版本, RAM -Dual Port v2.2

image

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

image

image

编写 测试文件 步骤:

  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 读取时序 

开始仿真:

image

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

image

///////////////////////////////////////////////////////////////////////////////////////////////////
// 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