FPGA — BRAM 队列实践

2023-10-30

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

功能描述

数码管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)
begin
    if(!reset_n)//复位
        cnt<=0;
    else if(cnt==CNT)
    begin
        cnt<=0;
        clk_out=~clk_out;
    end
    else
        cnt=cnt+1'b1;
end

endmodule

对其复用:
使用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的高电平
begin
    btn_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)
begin
    led<=btn_down;
    if(|btn_down==0)
    begin
        temp=0;
        ena=0;
    end
    else begin//有按键按下
        ena=1;           
        for(i=0;i<5;i=i+1)
        begin
            if(btn_down[i]==1)//获取最大键值
                temp=i;
        end
        dina<=temp;
        if(addra==3)
            addra<=1;
        else
            addra=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;
    else
        addrb<=addrb+1'b1;
end

endmodule

结果

运行结果

遇到问题及解决

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 begin
    clk=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;

end

endmodule


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA — BRAM 队列实践 的相关文章

  • libero-soc许可证申请和环境配置

    环境 64位机 在哪台电脑上安装libero soc 就用哪台电脑申请许可证 1 注册 https www microsemi co 在官网注册 之后申请的许可证会发到注册时填写的邮箱 2 申请许可证 https www microsemi
  • PAJ7620U2手势识别——配置0x00寄存器(3)

    文章目录 前言 一 为啥要配置0x00寄存器 二 配置步骤 1 单个读操作步骤图 2 模块状态转移图绘制 3 模块波形图绘制 4 上板验证 5 参考代码 总结 前言 在前面的教程中 小编带领各位读者学习了如何通过I2C协议去唤醒PAJ762
  • Java 实现令牌桶限流算法 原生极简实现 包括单机和多线程版本

    文章目录 令牌桶算法简介 令牌桶算法限流范围 单机版实现 多线程版实现 令牌桶算法简介 令牌桶是指一个限流容器 容器有最大容量 每秒或每100ms产生一个令牌 具体取决于机器每秒处理的请求数 当容量中令牌数量达到最大容量时 令牌数量也不会改
  • ALLEGRO等长时如何将PIN DELAY和VIA长度计算在内

    在PCB设计中 对于时序要求严格的线路 Via和IC pin delay的长度必须得到重视 通过下面的操作 可将Via和Pin delay加入到线路长度的计算中 1st 计算Pin delay 打开Constraint Manager 选择
  • Queue队列简介说明

    转自 Queue队列简介说明 下文笔者讲述Queue队列的简介说明 如下所示 Queue队列简介 Queue也是Java集合框架中定义的一种接口 直接继承自 Collection 接口 除了基本的Collection接口规定测操作外 Que
  • 64 位 ALU 输出在 TestBench 波上显示高阻抗

    我必须制作一个 64 位 ALU 它接受 A 和 B 64 位输入 进位输入输入并输出 64 位结果以及 1 位进位输出 还有一个 5 位功能选择 FS 其中 FS 0 控制 B 是否反转 使用 2to1 多路复用器 F 1 对 A 执行相
  • 用python接收高速率的UDP数据包

    我正在使用 python 来从 FPGA 接收 UDP 数据包流 并尝试丢失尽可能少的数据包 数据包速率从大约 5kHz 到一些 MHz 我们希望在特定时间窗口 代码中的 acq time 内获取数据 我们现在有这样的代码 BUFSIZE
  • VHDL——连接开关和LED

    我有 Xilinx Spartan6 和下一个 VHDL 代码 library ieee use ieee std logic 1164 all use ieee numeric std all entity Switches Leds i
  • 无线网络管理系统与无线路由器的区别

    第5章 波形发生器软件设计 本章我们将介绍系统的软件设计 系统中控制软件占有很重要的地位 它不仅要产生波形数据 控制波形的发生 还要控制显示电路和键盘电路 因此系统软件的好坏直接决定着系统的功能和稳定 5 1软件的总体结构 在本系统中 由于
  • 面对内卷严重的2023年,测试人员该怎样修炼?

    这几天马上就要双12大促 相信大家都准备花了不少钱吧 其实在每一次大促的背后各大电商平台还在遭受一次又一次的的黑产攻击 拿阿里巴巴去年双十一举例 2684 亿交易额的背后 有一天内 22 亿次的黑产攻击 近几年网络安全事件层出不穷 相信大家
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • 计算机提示vcruntime140.dll丢失的解决方法,多种修复教程分享

    vcruntime140 dll是一个非常重要的动态链接库文件 它包含了许多运行时的函数和类 然而 有时候我们可能会遇到vcruntime140 dll无法继续执行代码的问题 这会给我们带来很大的困扰 那么 这个问题是什么原因导致的呢 又应
  • 用于 Verilog 或 SystemVerilog 的 TAP(测试任何协议)模块

    是否有 TAP 测试任何协议 http testanything org Verilog 的实现 那就太好了 因为这样我就可以使用证明来自动检查我的结果 更新 10 9 09 有人问为什么不使用断言 部分 TAP 为我提供了一些很好的报告
  • 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

    以下 verilog 源代码和 或测试平台可以很好地工作商业模拟器 iverilog https www edaplayground com x 3TuQ也形式化验证工具 yosys smtbmc https gist github com
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • 如何使用 Verilog 和 FPGA 计算一系列组合电路的传播延迟?

    我是 FPGA 和 HDL 的新手 但我正在尝试学习 但无法弄清楚这一点 如何通过多个级别的组合逻辑来计算或估计传播延迟 我可以仅凭经验确定这一点 还是可以在设计时弄清楚 在这种情况下 我使用 FPGA 来实现奇偶校验设置和检查电路 该电路
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更

随机推荐

  • web服务器压力测试工具---ab

    文章目录 写在前面 1 吞吐率 Requests per second 2 并发连接数 The number of concurrent connections 3 并发用户数 The number of concurrent users
  • C++之虚函数

    都说面向对象的三大特性是封装 继承 多态 C 作为一门面向对象编程语言 肯定也是具备了面向对象的三大特性 那么在C 中是如何实现多态的呢 在C 中是通过虚函数动态绑定的方式实现多态的 虚函数与纯虚函数 首先我们来回顾一下虚函数 在C 中是使
  • Vue3 defineProp传参以及defineEmits事件传递详细解释

    defineProp父子组件传参 vue3中引用另一个组件非常简单 不再需要设置各个组件的name 直接import导入即可 下方代码 父组件为PropSuper vue 子组件为PropBase vue
  • [关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

    本文主要讲解Gephi绘制作者间的关系图谱 该软件可以广泛应用于社交网络 知识图谱分析 推荐读者使用 这是非常基础的一篇文章 重点讲解Gephi使用方法 希望对大家有所帮助 推荐前文 python数据挖掘课程 十七 社交网络Networkx
  • 算法知识点

    维生素C吃多了会上火 个人CSDN博文目录 2022蓝桥杯 目录 语法 基础算法 提升算法 语法 指针 标准输入输出 队列 结构体 c STL 基础算法 排序算法 树 二叉树 提升算法
  • Ping工具ICMP报文学习

    首先 这里有一个很好的博客 入口 先说个结论 Ping是通过IP ICMP协议发出去的 这跟我们传统UDP和TCP不一样 其通过创建套接字直接从IP层接受数据 具体可以参照上述文档 为什么ICMP的ping和tracert不经过tcp或ud
  • 面向对象编程的三大特性

    面向对象编程主要体现为三个特性 1 封装性 面向对象编程的核心思想之一就是将数据和对数据的操作封装在一起 通过抽象 即从 具体的实例中抽取出共同的性质形成一般的概念 例如类的概念 Java 中属性的封装 无特殊情况都是用的 private
  • InputAction的使用

    感觉Unity中InputAction的使用 步步都是坑 需求点介绍 当用户长按0 5s 键盘X或者VR left controller primaryButton 即X键 时 显示下一个图片 步骤总览 创建InputAction资产 将该
  • 数据库杂谈(三)——关系代数

    3 形式化关系查询语言 摘要 关系代数是一种抽象的查询语言 用对关系的运算来表达查询 作为研究关系数据语言的数学工具 在本文中 我们不仅谈论关系代数的知识点 而且还配备了对应的练习题 文章目录 3 形式化关系查询语言 3 1 关系代数 3
  • 【笔记】C++笔记

    1 书写HelloWorld include
  • ICML 2015压轴讨论总结:6大神畅谈深度学习的未来

    原文地址 http www csdn net article 1970 01 01 2825290
  • Error during WebSocket handshake: Unexpected response code: 404,springboot整合websocket出错

    Error during WebSocket handshake Unexpected response code 404 浏览器访问websocket出现错误 一 运行环境 二 需要引入的包 三 项目路径 四 工具类 五 静态页面以及js
  • CPU一级缓存L1 D-cache\L1 I-cache与二级缓存L2 cache深度分析

    CPU缓存 通过优化的的读取机制 可以使CPU读取缓存的命中率非常高 大多数CPU可达90 左右 也就是说CPU下一次要读取的数据90 都在缓存 SRAM 中 只有大约10 需要从内存 DRAM DDR等 读取 这大大节省了CPU直接读取内
  • 算法篇:贪心算法解决田忌赛马问题

    田忌赛马 贪心算法 问题分析 这是一道很经典的贪心算法入门题 这道题贪心的思想是 要把每一匹马的作用发挥到最大 把已 方赢的概率增加到最大 我是从双方慢马的角度来分析的 其实快马和慢马的思路差不多 用田忌最慢的马与王最慢的马相比较 1 如果
  • Spring 中如何为Bean注入集合呢?

    转自 Spring 中如何为Bean注入集合呢 下文讲述Spring中为Bean注入集合的方法分享 如下所示 常见的集合类型有 List Set Map 和 properties 标签 集合名称 说明
  • DC-DC电源转换电路设计

    第1条 搞懂DC DC电源怎么回事 DC DC电源电路 又称为DC DC转换电路 其主要功能就是进行输入输出电压转换 一般我们把输入电源电压在72V以内的电压变换过程称为DC DC转换 常见的电源主要分为车载与通讯系列和通用工业与消费系列
  • 【ES】多字段聚合分析

    public static Map
  • Vscode python配置了numpy包之后无法调用

    如果之前已经在vscode中配置好了numpy等其他库并且运行成功了 突然换了一个文件打开 如果发现找不到numpy库 很大可能是vscode将你的python解释器给更换了 如上所示 除了自己安装的python解释器之外 还有内置的和其他
  • 《QDebug 2023年6月》

    一 Qt Widgets 问题交流 二 Qt Quick 问题交流 1 Qt5 的 QML Settings 没有设置编码的接口 Qt6 虽然移除了 QSettings 的 setIniCodec 接口 默认为 utf8 但是 Qt5 这个
  • FPGA — BRAM 队列实践

    使用软件 Vivado 开发板 EGO1采用Xilinx Artix 7系列XC7A35T 1CSG324C FPGA BRAM 队列实践 功能描述 功能实现 1 添加BRAM的IP 2 数码管显示 3 时钟分频 4 按键消抖 5 顶层设计