0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Xilinx FPGA IP之Block Memory Generator仿真

CHANBAEK 来源: FPGA自学笔记分享 作者: FPGA自学笔记分享 2023-11-14 18:24 次阅读

上文对BMG ip的基本情况进行了简单的描述,本文通过例化仿真来实际使用功能一下这个IP。

首先使用简单双端口BRAM实现一个简单的跨时钟域操作:将16bit的a时钟域的数据跨到b时钟域,b时钟频率是a时钟频率的一半,为了操作方便,直接将b数据位宽扩展到32bit(这样就不用增加控制信息,数据流是满的)。BMG IP输入输出位宽比支持:1:32, 1:16, 1:8, 1:4, 1:2, 1:1, 2:1, 4:1, 8:1, 16:1, 32:1.位宽变换时BMG的AB端口数据映射关系如下:

图片

例化一个简单的ip,设置如下。这里选择简单双端口模式的本地接口,采用面积最小原则,端口A为16bit,深度为16,ram大小就是16*16bit,控制信号就使用ENA。对于端口B,将位宽设置为32bit,此时深度自动变换为8,使用写优先模式,同样使能ENB端口作为控制端口。

图片

图片

图片

这里对续写模式再做一个简单的说明,支持WRITE_FIRST, READ_FIRST或NO_CHANGE三种模式,这三种模式的读写时序如下图所示。

图片

图片

图片

WRITE_FIRST模式下,写优先级最高,同一地址,一旦写入,数据直接会透传到输出端。READ_FIRST模式,数据输出端口会锁存输出数据,有数据写入时,输出数据是上一次的数据。NO_CHANGE模式下,在写使能拉高后,输出将保持开始拉高时刻的数据,保持不变。注意这三种模式针对的是单端口,即端口A或者B。

编写一个简单的仿真测试代码如下:

// ============================================================
// File Name: tb_blk_mem_gen_sdp
// VERSION  : V1.0
// DATA     : 2023/8/5
// Author   : FPGA干货分享
// ============================================================
// 功能:xilinx blk_mem_gen_sdp ip 代码仿真
//       使用简单双端口实现一个简单的跨时钟域
// delay : 
// ============================================================




`timescale 1ns/100ps
module tb_blk_mem_gen_sdp ;


reg             clka   = 'd0 ;
reg             ena    = 'd1 ; 
reg  [0 : 0]    wea    = 'd1 ; 
reg  [3 : 0]    addra  = 'd0 ;
reg  [15 : 0]   dina   = 'd0 ;
reg             clkb   = 'd0 ;
reg             enb    = 'd1 ; 
reg  [2 : 0]    addrb  = 'd0 ;
wire [31 : 0]   doutb        ;




reg [2:0]   S_addr_a_flag   ='d0 ;
reg         S_a_flag        ='d0 ;
reg [2:0]   S_a_flag_2_b    ='d0 ;
reg         S_b_flag        ='d0 ;


reg [2:0]   S_clk_cnt8      ='d3   ;


always #1 clka = ~clka;
always #2 clkb = ~clkb;




//----------- clk_a  ---// 
always @(posedge clka)
    if(ena && wea)
        begin
            addra <= addra + 'd1;
            dina  <= dina + 'd1;
        end


always @(posedge clka)
    S_addr_a_flag[0] <= (addra == 4'd10);

always @(posedge clka)
    S_addr_a_flag[2:1] <= S_addr_a_flag[1:0] ; 


always @(posedge clka)
    S_a_flag <= |S_addr_a_flag ;


//----------- clk_b  ---// 
always @(posedge clkb)
    S_a_flag_2_b <= {S_a_flag_2_b[1:0],S_a_flag} ;


always @(posedge clkb)
    S_b_flag <= (!S_a_flag_2_b[2])&& S_a_flag_2_b[1] ;

always @(posedge clkb)
    if((S_clk_cnt8 > 3'd2)&&S_b_flag)
        S_clk_cnt8 <= 3'd2;
    else 
        S_clk_cnt8 <= S_clk_cnt8 + 'd1;




always @(posedge clkb)
    if(S_clk_cnt8 == 3'd1)
        addrb <= 'd0;
    else 
        addrb <= addrb + 'd1;




//----------- Begin Cut here for INSTANTIATION Template ---// 
blk_mem_gen_sdp blk_mem_gen_sdp (
  .clka     (clka       ), // input wire clka   
  .ena      (ena        ), // input wire ena     
  .wea      (wea        ), // input wire [0 : 0] wea     
  .addra    (addra      ), // input wire [3 : 0] addra 
  .dina     (dina       ), // input wire [15 : 0] dina   
  .clkb     (clkb       ), // input wire clkb   
  .enb      (enb        ), // input wire enb     
  .addrb    (addrb      ), // input wire [2 : 0] addrb 
  .doutb    (doutb      )  // output wire [31 : 0] doutb 
);


endmodule

仿真结果如下:clkb时钟频率是clka时钟频率的一半,dataa数据位宽16bit,datab数据位宽32bit,输入输出均为满速率,同时在代码中增加了防抖保护措施,防止跨时钟域中因为出现时钟抖动而产生的数据异常问题。

图片

以上就是Xilinx Block Memory Generator(BMG) IP的仿真。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593193
  • Xilinx
    +关注

    关注

    70

    文章

    2121

    浏览量

    119373
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132158
  • 时钟
    +关注

    关注

    10

    文章

    1479

    浏览量

    130306
收藏 人收藏

    评论

    相关推荐

    Xilinx FPGA IPBlock Memory Generator功能概述

    Xilinx Block Memory Generator(BMG)是一个先进的内存构造器,它使用Xilinx
    的头像 发表于 11-14 17:49 951次阅读
    <b class='flag-5'>Xilinx</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b>之<b class='flag-5'>Block</b> <b class='flag-5'>Memory</b> <b class='flag-5'>Generator</b>功能概述

    Xilinx FPGA IPBlock Memory Generator AXI接口说明

    之前的文章对Block Memory Generator的原生接口做了说明和仿真,本文对AXI接口进行说明。
    的头像 发表于 11-14 18:25 800次阅读
    <b class='flag-5'>Xilinx</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b>之<b class='flag-5'>Block</b> <b class='flag-5'>Memory</b> <b class='flag-5'>Generator</b> AXI接口说明

    Distributed Memory Generator IP核简介

    Distributed Memory Generator IP 核采用 LUT RAM 资源创建各种不同的存储器结构。IP可用来创建只读存储器 (ROM)、单端口随机存取存储器 (RA
    的头像 发表于 11-17 17:00 870次阅读
    Distributed <b class='flag-5'>Memory</b> <b class='flag-5'>Generator</b> <b class='flag-5'>IP</b>核简介

    XILINX FPGA IP之AXI Traffic Generator

    AXI Traffic Generator IP 用于在AXI4和AXI4-Stream互连以及其他AXI4系统外设上生成特定序列(流量)。它根据IP的编程和选择的操作模式生成各种类型的AXI事务。是一个比较好用的AXI4协议测
    的头像 发表于 11-23 16:03 827次阅读
    <b class='flag-5'>XILINX</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b>之AXI Traffic <b class='flag-5'>Generator</b>

    【参考书籍】Xilinx FPGA开发实用教程——田耘,徐文波著

    的时钟设计方案10.3.5 Rocket I/O的开发要素10.3.6 Rocket I/O IP Core的使用10.4 基于Xilinx FPGA的千兆以太网控制器的开发10.4.1 千兆以太网
    发表于 04-24 09:23

    Xilinx FPGA无痛入门,海量教程免费下载

    -- 波形发生器IP核CORDIC(正弦波)仿真Lesson77 特权Xilinx FPGA SF-SP6入门指南 -- 波形发生器
    发表于 07-22 11:49

    Xilinx FPGA入门连载44:FPGA片内ROM实例ROM配置

    `Xilinx FPGA入门连载44:FPGA片内ROM实例ROM配置特权同学,版权所有配套例程和更多资料下载链接:http://pan.baidu.com/s/1jGjAhEm 1
    发表于 01-08 13:12

    Xilinx FPGA入门连载48:FPGA片内RAM实例RAM配置

    `Xilinx FPGA入门连载48:FPGA片内RAM实例RAM配置特权同学,版权所有配套例程和更多资料下载链接:http://pan.baidu.com/s/1jGjAhEm 1
    发表于 01-22 13:39

    Xilinx FPGA入门连载74:波形发生器IP核CORDIC(正弦波)功能仿真

    `Xilinx FPGA入门连载74:波形发生器IP核CORDIC(正弦波)功能仿真特权同学,版权所有配套例程和更多资料下载链接:http
    发表于 04-25 08:33

    xilinx FPGA的FFT IP核的调用

    有没有大神可以提供xilinx FPGA的FFT IP核的调用的verilog 的参考程序,最近在学习FFT的IP核的使用,但是仿真结果有问
    发表于 12-25 17:05

    ARM embedded memory ip的产生,couldn't run spreadsheet generator to fetch results

    如题,在Linux下,产生memory,使用的是ARM的 memory IP 工具,无法产生,提示:couldn't run spreadsheet generator to fetc
    发表于 08-15 15:56

    Xilinx FPGA片内ROM实例ROM配置

    Xilinx FPGA入门连载44:FPGA片内ROM实例ROM配置特权同学,版权所有配套例程和更多资料下载链接:http://pan.baidu.com/s/1jGjAhEm 1
    发表于 01-09 16:02

    创建Block RAM IP不起作用

    在我的一个FPGA类中,我被要求使用coregen创建一个blcok ram(8dx16w),单端口ram IP。我在Windows XP,Service Pack 3上使用Xilinx ISE
    发表于 06-05 13:39

    Vivado中xilinx_BRAM IP核使用

    Vivado2017.2 中BRAM版本为 Block Memory Generator Specific Features 8.3。BRAM IP核包括有5种类型:Single-p
    发表于 03-10 06:15 19次下载
    Vivado中<b class='flag-5'>xilinx</b>_BRAM <b class='flag-5'>IP</b>核使用

    XILINX FPGA IP之FIFO Generator例化仿真

    上文XILINX FPGA IP之FIFO对XILINX FIFO Generator IP的特
    的头像 发表于 09-07 18:31 903次阅读
    <b class='flag-5'>XILINX</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b>之FIFO <b class='flag-5'>Generator</b>例化<b class='flag-5'>仿真</b>