FPGA — BRAM 队列实践

article/2025/10/9 10:12:18

使用软件: Vivado
开发板: EGO1采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA

BRAM 队列实践

  • 功能描述
  • 功能实现
      • 1. 添加BRAM的IP
      • 2. 数码管显示
      • 3. 时钟分频
      • 4. 按键消抖
      • 5. 顶层设计
  • 结果
  • 遇到问题及解决
      • 仿真测试

功能描述

数码管3位显示数字,可以按键输入在数码管显示,队列结构,当队列满了之后,再按键时,将从队列头开始修改成当前输入的值。
如下图所示:刚开始是0 0 0,
输入4之后变为4 0 0,
再输入3和2变为4 3 2
输入1之后变为 1 3 2
如此循环替换
在这里插入图片描述

功能实现

1. 添加BRAM的IP

采用双端口,从A端口输入数据,B端口读出数据
其设置如下所示:
基础设置:
在这里插入图片描述
端口A设置:
在这里插入图片描述端口B设置:
在这里插入图片描述

2. 数码管显示

采用先前代码,将输入数据位数进行修改,生成IP核以备调用。

3. 时钟分频

采用参数化设计模块,实现代码复用
divclk代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/10/20 19:39:34
// Design Name: 
// Module Name: divclk
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module divclk(clk,reset_n,clk_out);
input clk;
input reset_n;
output clk_out;
reg[31:0] cnt=0;
reg clk_out=0;
parameter CNT=1000000; //周期20ms = 50Hz   cnt=100000000/50/2=1000000
always@(posedge clk or negedge reset_n)
beginif(!reset_n)//复位cnt<=0;else if(cnt==CNT)begincnt<=0;clk_out=~clk_out;endelsecnt=cnt+1'b1;
endendmodule

对其复用:
使用defparam来重新定义divclk中的初始参数CNT,实现代码复用
在这里插入图片描述

4. 按键消抖

使用前面按键消抖模块的代码即可实现

5. 顶层设计

`timescale 1ns / 1ps
//
// Create Date: 2022/10/20 19:37:03
// Revision 0.01 - File Created
// Additional Comments:
// 
//module top_moudle(clk,reset_n,btn,seg,seg1,an,led);
input clk,reset_n;
input[4:0] btn;//按键
output[7:0] seg,seg1,an;
output[4:0] led;
reg[4:0] led;
//时钟分频
wire clk_btn;
wire clk_ms;
divclk uut1(clk,reset_n,clk_btn);
defparam uut1.CNT=1000000;//周期20ms = 50Hz   cnt=100000000/50/2=1000000
divclk uut2(clk,reset_n,clk_ms);
defparam uut2.CNT=50000;//周期:1ms   1000HZ cnt=100000/2=50000//按键例化
wire[4:0] btnout;
reg[4:0] btn_out0,btn_out1,btn_down;
ajxd uut3(clk_btn,btn,btnout);
always@(posedge clk_ms)//将按键上升沿转换为1ms的高电平
beginbtn_out0<=btnout;btn_out1<=btn_out0;btn_down<=btn_out0&(~btn_out1);
end
reg wea=1,web=0;
reg[2:0] addra=0,addrb=1;
reg[3:0] dina,dinb=4'b0000;
wire[3:0] douta,doutb;
reg ena=1;
//bram 例化
ram ram(.clka(clk),.ena(ena),.wea(wea),.addra(addra),.dina(dina),.douta(douta),.clkb(clk),.web(web),.addrb(addrb),.dinb(dinb),.doutb(doutb)
);
//always@(btnout)
//begin
//    led<=btnout;
//    //if(btnout>5'b00000)
//      //  wea<=1;//写使能
//end
reg[3:0] temp;
reg[3:0] i=0;
always@(posedge clk_ms)
beginled<=btn_down;if(|btn_down==0)begintemp=0;ena=0;endelse begin//有按键按下ena=1;           for(i=0;i<5;i=i+1)beginif(btn_down[i]==1)//获取最大键值temp=i;enddina<=temp;if(addra==3)addra<=1;elseaddra=addra+1'b1;end   
end//数码管显示
reg[11:0] show_data=12'b000000000001;
smg uusmg(clk,show_data,seg,seg1,an);
reg[2:0] flag2=0;reg[3:0] doutb0,doutb1,doutb2;
always@(negedge clk_ms)
begin//写入有2个周期的时延doutb0<=doutb;doutb1<=doutb0;doutb2<=doutb1;case(addrb)1:show_data[3:0]<=doutb2;2:show_data[7:4]<=doutb2;3:show_data[11:8]<=doutb2;default:show_data=show_data;endcase if(addrb==3)    addrb<=1;elseaddrb<=addrb+1'b1;
endendmodule

结果

运行结果

遇到问题及解决

addra赋初值为1时,发现第一个按键数值在地址为2的位置显示。
通过仿真发现,dina赋值跟addra+1在同一个上升沿时触发,
在这里插入图片描述

输入的值,直接写进了addra+1的地址,而不是addra, 所以可以看到数值在地址初值的下一个地址的位置。

仿真测试

测试用例:

`timescale 1ns / 1ps
//
// Create Date: 2022/10/25 10:48:58
// Revision 0.01 - File Created
// Additional Comments:
// 
//module bram_test_sim(clk,ena,enb,wea,web,addra,addrb,dina,dinb,douta,doutb);
input clk,ena,enb,wea,web;
input[2:0] addra,addrb;
input[3:0] dina,dinb;
input[3:0] douta,doutb;
ram ram(.clka(clk),.ena(ena),.wea(wea),.addra(addra),.dina(dina),.douta(douta),.clkb(clk),.enb(enb),.web(web),.addrb(addrb),.dinb(dinb),.doutb(doutb)
);endmodule

仿真代码

`timescale 1ns / 1ps
//
// Create Date: 2022/10/25 10:59:56
// Design Name: 
// Module Name: sim_test
//module sim_test();
reg clk;//时钟输入
reg wea,web;//写使能
reg[2:0] addra=1,addrb=0;//地址输入
reg[3:0] dina,dinb;//数据输入
wire[3:0] douta,doutb;//数据输出
reg[9:0] cnt1,cnt2;
reg ena=1;
initial beginclk=0;wea=1;web=0;cnt1=0;cnt2=0;
end
bram_test_sim uut(//调用被仿真的模块完成内存读写.clk(clk),.ena(ena),.wea(wea),.addra(addra),.dina(dina),.douta(douta),.enb(1),.web(web),.addrb(addrb),.dinb(dinb),.doutb(doutb));always #10 clk=~clk;//周期20ns,模拟50M时钟
initial begin
#90;
ena=1;
dina=4'b0001;
addra=addra+1;
addrb=addrb+1;
#20
ena=1;
dina=4'b0010;
addra=addra+1;
addrb=addrb+1;
#20
ena=1;
dina=4'b0100;
addrb=1;
#20
addrb=1;
#20
addrb=2;endendmodule

仿真结果:
addrb=1的位置输出doutb为X
addrb=2的位置输出doutb为1
在这里插入图片描述


http://chatgpt.dhexx.cn/article/BPeKfG2w.shtml

相关文章

Vivado综合生成BRAM及与LUTRAM的区别

使用vivado中的BRAM可以通过例化Block Memory Generator这一ip并进行相关的设定。 另外可以通过直接编写符合BRAM规范的代码&#xff0c;借助综合工具直接将其综合为BRAM。这时需要通过(*ram_style"block"*)对array进行修饰。 下面给出一种看似可以综合为BRAM的示例…

Xilinx BRAM IP介绍

BRAM IP核介绍 BRAM简介BRAM类型三种读写模式写优先读优先No change 总线支持输出寄存 BRAM简介 BRAM&#xff0c;即Block RAM&#xff0c;是FPGA中一种重要的存储资源&#xff0c;另一种常见的存储资源是DRAM(Distributed RAM)&#xff0c;Distributed RAM 经过综合工具综合&…

vivado中bram简单使用

bram设置为简单双口 建议取消勾选这个&#xff0c;这样读出来的数据是差一个时钟周期的 vivado中的bram&#xff0c;写的时候&#xff0c;写使能&#xff0c;写地址&#xff0c;写数据一起赋值 读的时候&#xff0c;读使能&#xff0c;读地址可以一起赋值&#xff0c;数据为…

使用VIVADO中的MIG控制DDR3(AXI接口)二——用AXI4读写BRAM测试

上篇文章主要讲了一些关于AXI的知识&#xff0c;有了这些理论&#xff0c;让我们进行一些简单的实验测试&#xff0c;加深对AXI协议的理解。本次实验使用的平台是VIVADO2019.1。 1. 首先创建一个工程&#xff0c;名称和路径自己决定。 2.然后按照图中所示&#xff0c;点击新建和…

URAM和BRAM有什么区别

无论是7系列FPGA、UltraScale还是UltraScale Plus系列FPGA&#xff0c;都包含Block RAM&#xff08;BRAM&#xff09;&#xff0c;但只有UltraScale Plus芯片有UltraRAM也就是我们所说的URAM。BRAM和URAM都是重要的片上存储资源&#xff0c;但两者还是有些显著的区别。 容量 B…

【FPGA】AXI4-Lite总线读写BRAM

博主参考和学习的博客 AXI协议基础知识 。这篇博客比较详细地介绍了AXI总线&#xff0c;并且罗列了所有的通道和端口&#xff0c;写代码的时候可以方便地进行查表。AXI总线&#xff0c;AXI_BRAM读写仿真测试 。 这篇文章为代码的书写提供大致的思路&#xff0c;比如状态机和时…

如何对bram/ram进行初始化赋值呢?

1、首先对于常规的情况&#xff0c;即加载.coe文件的方式实现初始化&#xff08;与rom相同&#xff09; 点击load initial file, 在右侧可以直接添加.coe文件&#xff0c;或者选择edit进行手动编辑&#xff08;数据量不大的情况下可选&#xff0c;但是不推荐&#xff09;&#…

vivado中bram的种类与使用

vivado中bram的种类与使用 vivado中bram的分类单端口ram初始化工作时序仿真验证 简化的双端口RAM初始化端口定义仿真结果 双端口RAM初始化端口定义功能仿真单端口读数双端口读数双端口一读一写双端口写数据 vivado中bram的分类 在vivado中打开IP catalog&#xff0c;在其中搜索…

BRAM的使用

使用Block Memory Generator IP核&#xff0c;PL读取BRAM数据 软件环境&#xff1a;Vivado 2018.3 IP核&#xff1a;Block Memory Generator 8.4(Rev.2) 1、点击IP Catalog 2、搜索”Block Memory Generator“双击选择RAMs & ROMs & BRAM下的IP核 3、配置IP核为Si…

FPGA — BRAM学习笔记—读写操作

使用软件&#xff1a; Vivado 开发板&#xff1a; EGO1采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA BRAM笔记 BRAM介绍同步双端口BRAMBRAM读写操作(1)读操作(2)写操作(3)写模式写优先模式读优先模式不变模式 双端口块内存接口BRAM IP的使用及仿真验证IP核使用coe文件将IP核添…

FPGA从入门到精通(8)-BRAM

所使用EDA软件&#xff1a;VIVADO2018.3 FPGA型号&#xff1a;xc7a35tcsg325-2 很久没写了&#xff0c;随便写一篇BRAM的吧。说到BRAM &#xff0c;很多人都喜欢拿它来DRAM比较 &#xff0c;两者都有啥优缺点&#xff0c;其实我也拿不准。不过一般来说&#xff0c;存储较大的数…

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据 一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zyn…

FPGA设计中BRAM(Block RAMs)资源的使用(综合为BRAM)

FPGA设计中BRAM&#xff08;Block RAMs&#xff09;资源的使用 RAM分为BRAM&#xff08;Block RAMs&#xff09;和DRAM&#xff08;Distributed RAM&#xff09;&#xff0c;即块RAM与分布式RAM&#xff0c;这两个差别在于BRAM是FPGA上固有的一些存储资源&#xff08;针对不同型…

web测试与app测试的区别

目录 前言 首先从系统架构来看 专项测试 安装、卸载、更新&#xff1a; 界面操作&#xff1a; 前言 仅仅从功能测试的层面上来讲的话&#xff0c;在流程和功能测试上是没有区别的。那么区别在哪里呢&#xff1f; 我个人觉得就是由于载体不一样&#xff0c;所以系统测试和…

APP测试与WEB测试

APP测试与WEB测试的区别(异同) 相同点&#xff1a; 功能测试层面而言&#xff1a;APP测试和web测试都是使用相同的测试用例测试方法&#xff08;都用到等价类划分、边界值分析、正常和异常情况去考虑测试点&#xff09; UI界面测试&#xff1a;都需要按照原型图和设计图检查UI…

web测试,App测试,小程序测试区别

最近项目真的太忙了&#xff0c;不过&#xff0c;今天无论如何我都要更文章了&#xff0c;谢谢大家的支持&#xff0c;不断努力进步 这篇文章&#xff0c;我就是要梳理一下&#xff0c;web测试&#xff0c;app测试&#xff0c;和小程序的区别 话不多说&#xff0c;上主题 web…

WEB端与移动端测试区别和总结

WEB端与移动端测试区别总结如下&#xff1a; 1、系统架构 WEB端 B/S结构&#xff0c;WEB端的前端一般不做端的区分 WEB端的上线不管是预发布还是N环上线&#xff0c;server上线后&#xff0c;前端同步更新&#xff0c;一般是不存在多个版本的问题; 移动端 C/S结构&#xff0c;移…

Apifox简单了解——WEB端测试的集大成者

文章目录 0 引入1、Postman2、Swagger &#xff08;丝袜哥&#xff09;3、Mock4、JMeter5、Apifox6、引用 0 引入 Apifox Postman Swagger Mock JMeter 1、Postman 1 作用 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件&#xff0c;简单易用的接口测试…

web测试的基本流程

1、web测试流程&#xff1a; (1)web测试 1)参与一个web新项目的测试前&#xff0c;先搜集测试相关的资料&#xff0c;包括原型图、各种需求文档、业务相关等需求相关材料 2)结合第一步搜集到的需求相关资料&#xff0c;自行熟悉系统&#xff0c;同时列出不明白的点&#xff0c;…

Web端测试常用方法

介绍下工作中&#xff0c;Web端测试所涉及到的方法&#xff1a; 前言&#xff1a;Web测试常用的方法&#xff0c;兼容性测试、安全性测试、可用性测试 & 逻辑功能测试 1 > 兼容性测试 先说下兼容性测试&#xff0c;工作中在测试时&#xff0c;一般涉及操作系统测试、浏…