【【萌新的FPGA学习之水 一水到底 】】

news2024/11/19 18:33:51

萌新的FPGA学习之水 一水到底

重读实验给我印象最深的2点是我们面对的设计需要使得时序自动切换
那么我们将切换时序的时钟装入另一个每隔0.5s变换一次的参数上
下附上代码

 module key_led(
 input sys_clk , //系统时钟
 input sys_rst_n , //系统复位,低电平有效
input [1:0] key , //按键
 output reg [1:0] led //LED 灯
 );
 
 //parameter define
 parameter CNT_MAX = 25'd2500_0000; //LED 灯闪烁频率

 //reg define
 reg [24:0] cnt; //计数器
 reg led_flag; //LED 控制信号

 //*****************************************************
 //** main code
 //*****************************************************

 //计数器计时 0.5s
 always @(posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
 cnt <= 25'd0;
 else if(cnt < (CNT_MAX - 25'd1))
 cnt <= cnt + 25'd1;
 else
 cnt <= 25'd0;
 end

 //每隔 500ms 就更改 LED 的闪烁状态
 always @ (posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
 led_flag <= 1'b0;
 else if(cnt == (CNT_MAX - 25'd1))
 led_flag <= ~led_flag;
 end

 //根据按键的状态以及 LED 的闪烁状态来赋值 LED
 always @ (posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
 led <= 2'b00;
 else case(key)
 2'b10 : //如果按键 0 被按下,则两个 LED 交替闪烁
 if(led_flag == 1'b0)
 led <= 2'b01;
else
 led <= 2'b10;
 2'b01 : //如果按键 1 被按下,则两个 LED 同时亮灭交替
 if(led_flag == 1'b0)
 led <= 2'b11;
 else
 led <= 2'b00;
 2'b11 : //如果两个按键都未被按下,则两个 LED 都保持常灭
 led <= 2'b00;
 default: ;
 endcase
 end

 endmodule

下面讲述程序固化的方法
在这里插入图片描述

双击打开“ZYNQ 纯 PL 端固化脚本”文件夹

在这里插入图片描述

其中 bootbin.bif 是引导镜像文件,用
于指定使用哪些文件来生成 BOOT.bin(固化的镜像文件);
create_bootbin.bat 是一个批量处理文件,用于
生成 BOOT.bin,并将其烧写到 ZYNQ 开发板的 flash 芯片中;
zynq_fsbl.elf 是固化的初始化文件
看完了脚本文件夹中必要的基础文件后,我们来讲解下该如何使用这些文件完成 PL 端的程序固化。首先,我们使用文本编辑器(例如 Notepad++)打开 create_bootbin.bat 文件,如下图所示:
在这里插入图片描述

create_bootbin.bat 会调用 Vitis 的生成镜像(bootgen)功能和下载(program_flash)功能,所以我们需要给出这两个功能所在的安装路径,即找到 Vitis 安装路径下的 bin 文件夹,复制其路径,并替换图 19.6.3中红框内的路径,替换完成后保存即可。
接着我们找到工程的比特流文件,在没有人为干扰 Vivado 工程内部文件分布的情况下,其所在路径如下:
在这里插入图片描述

找到工程中的比特流文件后,我们将其复制到“ZYNQ 纯 PL 端固化脚本”文件夹中,如下图所示:

然后我们使用文本编辑器打开 bootbin.bif 文件,如下图所示:
在这里插入图片描述

bootbin.bif 文件中的第 4 行代码用于指定生成镜像文件时所需的比特流文件的来源,因为我们已经将所需的所有文件都存放在同一个文件夹下了,所以这里我们无需指定文件的绝对路径,直接输入比特流文件的完整文件名(包含尾缀)即可。修改完成后我们点击保存。接着我们连接开发板的电源和下载器,将领航者开发板上的启动模式开关 BOOT_CFG 拨到 JTAG 模式(即 1 和 2 都拨到 ON),如下图所示:
在这里插入图片描述

最后打开电源开关并双击运行 create_bootbin.bat
在这里插入图片描述
在这里插入图片描述

当运行界面显示“Bootimage generated successfully”时,说明 BOOT.bin 文件生成成功,此时我们可以
在“ZYNQ 纯 PL 端固化脚本”文件夹中看到生成的 BOOT.bin 文件,如图 19.6.9 所示。需要注意的是,
此时 create_bootbin.bat 还在进行程序的固化,所以不要关闭运行界面,如果在运行界面显示“Flash
Operation Successful”前在某一处卡顿的时间过长(一两分钟了都没有更新进度)的话,大家可以按一下
键盘上的回车键来手动让界面继续运行下去。
在这里插入图片描述

打开电源开关后,底板上的两个 PL LED 处于常灭状态。当我们按下 PL_KEY0 时,可以看到两个 PL
LED 交替闪烁;按下 PL_KEY1 时,可以看到两个 PL 的 LED 同时闪烁。此时就说明我们的程序成功固化
在 flash 器件中了。

小水之 按键蜂鸣器实验
key 值为高电平则按键被释放,key 值为低电平则按键被按下。所以我们消抖的过程就是滤除按键值保持时间小于 20ms 的值,那么我们需要做的就是在按键被按下或者被释放导致按键值产生变化时,从 20ms 开始倒计时,如果 20ms 的倒计时还没有完成按键值就再次产生变化,此时需要从头开始 20ms 倒计时,前一次导致按键值变化的操作视为无效操作,将该次变化视为按键抖动消除;如果计完 20ms 按键状态一直没有改变,说明此次按键被按下或者被释放是有效操作,将此次按键第二次的打拍的值赋值给按键消抖后的信号 key_filter。

记得一个转化 1s = 1000 ms

小水之 触摸按键控制LED 实验
本节的实验任务是使用触摸按键控制 LED 灯的亮灭,开发板上电后 LED 为点亮状态,手指触摸后LED 熄灭;当再次触摸时,LED 点亮。

小水之 呼吸灯实验
方便大家理解呼吸灯的实现过程,我们将呼吸灯两个组成部分开说,这里我们先详细说明呼吸灯由暗到亮的渐变过程(由亮到暗的过程与由亮到暗的过程刚好相反)。本实验中我们将由暗到亮的渐变过程定义为 2s,接下来我们将这 2s 分成 1000 份,就是由暗到亮的渐变过程中有 1000 个亮度过渡,每一份过渡时间为 2ms;接下开我们再将每一份过渡时间 2ms 均分为 1000份,每份时间为 2us,我们以 2us 为单位递减 2ms 中的高电平的占空比,随着高电平占空比的不断减少,led灯的亮度不断变暗。接下来我们定义一个计数器 cnt_2us,用来产生 2us 的时间;再定义一个计数 cnt_2ms,在 2us 的计数基础上进行 2ms 计数;最后定义一个计数器 cnt_2s,在 2ms 的计数基础上进行 2s 的计数。由上面的功能分析可知,呼吸灯实验中共有 5 个模块,分别是 2us 计数模块、2ms 计数模块、2s 计数模块、产生“呼吸”切换信号模块以及输出 led 灯信号模块。
接下来我们定义一个计数器 cnt_2us,用来产生 2us 的时间;再定义一个计数 cnt_2ms,在 2us 的计数基
础上进行 2ms 计数;最后定义一个计数器 cnt_2s,在 2ms 的计数基础上进行 2s 的计数。
20ns的100倍是 2us 我们以2us 作为最小间隔 1000倍就是2ms 再 1000倍就是 2s 2s是整个呼吸灯的时间
我们会惊奇的通过设计控制了 cnt_2ms 和 cnt_2s 都是1000个 我们这样就可以在后续的比较中这么设定
既然 1ms=1000us 那么 cnt_2us 计数从0到999然后把ms+1 诸如此类 接下来 0到999个ms 就计数1s
我们把cnt_2s分段成1000个阶段 既然cnt_ms也是从0转到999才使得cnt_2s +1 那么我们能不能这么设计 假定0是渐亮
那么一开始cnt_2s=0 cnt_2ms从0转到999 1转的时间是2us 那么这一轮 一次都不亮
接下来cnt_2s=1 接下来cnt_2ms 从0转到999 就会有1下的时间小于cnt_2s 那么就会亮2us
以此类推 当cnt_2s=999 cnt_2ms 从0到999 都会小于cnt_2s 就会一直常亮

 module breath_led(
input sys_clk , //系统时钟 50MHz
 input sys_rst_n , //系统复位,低电平有效
output reg led //LED 灯
 );
 
 //parameter define
 parameter CNT_2US_MAX = 7'd100; 
 parameter CNT_2MS_MAX = 10'd1000;
 parameter CNT_2S_MAX = 10'd1000;

 //reg define
 reg [6:0] cnt_2us;
 reg [9:0] cnt_2ms; 
 reg [9:0] cnt_2s; 
 reg inc_dec_flag; //亮度递增/递减 0:递增 1:递减

 //*****************************************************
 //** main code
 //*****************************************************

 //cnt_2us:计数 2us
 always@(posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
 cnt_2us <= 7'b0;
 else if(cnt_2us == (CNT_2US_MAX - 7'b1 ))
 cnt_2us <= 7'b0;
 else
 cnt_2us <= cnt_2us + 7'b1;
 end

 //cnt_2ms:计数 2ms
 always@(posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
 cnt_2ms <= 10'b0;
 else if(cnt_2ms == (CNT_2MS_MAX - 10'b1)
 && cnt_2us == (CNT_2US_MAX - 7'b1))
 cnt_2ms <= 10'b0;
 else if(cnt_2us == CNT_2US_MAX - 7'b1)
 cnt_2ms <= cnt_2ms + 10'b1;
 else
 cnt_2ms <= cnt_2ms;
 end
//cnt_2s:计数 2s
 always@(posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
 cnt_2s <= 10'b0;
 else if(cnt_2s == (CNT_2S_MAX - 10'b1)
 && cnt_2ms == (CNT_2MS_MAX - 10'b1)
 && cnt_2us == (CNT_2US_MAX - 7'b1))
 cnt_2s <= 10'b0;
 else if(cnt_2ms == (CNT_2MS_MAX - 10'b1)
 && cnt_2us == (CNT_2US_MAX - 7'b1))
 cnt_2s <= cnt_2s + 10'b1;
 else
 cnt_2s <= cnt_2s; 
 end

 //inc_dec_flag 为低电平,led 灯由暗变亮,inc_dec_flag 为高电平,led 灯由亮变暗
 always@(posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
 inc_dec_flag <= 1'b0;
 else if(cnt_2s == (CNT_2S_MAX - 10'b1)
 && cnt_2ms ==( CNT_2MS_MAX - 10'b1)
 && cnt_2us == (CNT_2US_MAX - 7'b1))
 inc_dec_flag <= ~inc_dec_flag;
 else
 inc_dec_flag <= inc_dec_flag;
 end

 //led:输出信号连接到外部的 led 灯
 always@(posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
 led <= 1'b0;
 else if((inc_dec_flag == 1'b1 && cnt_2ms >= cnt_2s)
 || (inc_dec_flag == 1'b0 && cnt_2ms <= cnt_2s))
 led <= 1'b1;
 else
 led <= 1'b0;
 end

 endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1124479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

扩散模型学习——代码学习

文章目录 引言正文UNet网络结构训练方法DDPM采样方法讲解Context上下文信息添加DDIM的方法详解 总结参考 引言 这是第一次接触扩散模型&#xff0c;为了学习&#xff0c;这里好好分析一下他的代码 正文 UNet网络结构 这部分主要是定义一下网络结构&#xff0c;以及相关的网…

免费领取!TikTok Shop “全托管”黑五大促官方备战指南来啦!

黑五网一大促即将来袭&#xff0c;自“全托管”模式上线以来&#xff0c;TikTok for Business在沙特阿拉伯和英国市场开展了古尔邦节大促、夏季大促、返校季大促等活动&#xff0c;今年更是会借着黑五网一大促之际&#xff0c;首次覆盖美国市场&#xff0c;为全托管商家带来全球…

k8s的coreDNS添加自定义hosts

1.ack的hosts不会继承宿主机的hosts&#xff0c;而工作中有一个域名默认是走内网解析&#xff0c;内网被限制访问了&#xff0c;只能在coreDNS中加一个hosts解析域名 2.编辑configmap (coredns) kubectl edit configmap -n kube-system coredns 增加hosts节点 Corefile: |.:53…

由浅到深 : Self-Attention (自注意力机制)

Self-Attention 看到下面的第一个saw是动词&#xff0c;第二个saw是名词。 因为第一个saw和第二个saw在形式上没有任何差别。如果任务是进行词性的判断&#xff0c;把上面的词直接输入给神经网络&#xff0c;那么它肯定不能够正确分析。 想要正确分析词性&#xff0c;那么该…

谈谈你对Spring6.0的理解

谈谈你对Spring6.0的理解 一&#xff0c;介绍 Spring 6.0是Spring框架的一个重要版本&#xff0c;它提供了许多新特性和改进&#xff0c;以帮助开发者更高效地完成工作。以下是我对Spring 6.0的一些理解&#xff1a; 反应式编程支持&#xff1a;Spring 6.0对反应式编程提供了…

Pico示波器 汽车振动异响(NVH)解决方案

汽车振动异响故障可能有多个潜在原因&#xff0c;包括发动机、传动系统、悬挂系统、制动系统等等。技师需要对汽车各个方面有全面的了解&#xff0c;才能更好地进行故障排查。 振动和异响可能由多个因素引起。例如&#xff0c;可能是零部件损坏、松脱、磨损或者不正确安装。这…

ResNet: Deep Residual Learning for Image Recognition(CVPR 2015)

正常来说&#xff0c;plain网络&#xff08;简单的堆叠层数&#xff09;会随着网络的加深错误率变低的&#xff0c;但事实上训练和测试错误率都升高了&#xff0c;这就是网络的退化问题。 此外&#xff0c;网络加深会出现梯度消失或梯度爆炸&#xff0c;妨碍收敛&#xff0c;但…

HarmonyOS 音频开发指导:使用 AudioRenderer 开发音频播放功能

AudioRenderer 是音频渲染器&#xff0c;用于播放 PCM&#xff08;Pulse Code Modulation&#xff09;音频数据&#xff0c;相比 AVPlayer 而言&#xff0c;可以在输入前添加数据预处理&#xff0c;更适合有音频开发经验的开发者&#xff0c;以实现更灵活的播放功能。 开发指导…

node-sass安装报错

node-sass安装竟然报了python的错 先说最终解决方案 将node换成14版本 声明&#xff1a;个人总结&#xff0c;思路到哪写到哪&#xff0c;不喜请轻喷&#x1f602; 参考 https://blog.csdn.net/ccm_2354586864 可恶的node-sass让我不得不在周末自愿加班&#x1f620; 我的…

优化mybatisPlus批量新增,新增mapper层批量新增方法,附带代码生成vm模板。

文章目录 一、主题二、效果展示三、mybatis-plus源码分析四、优化思路五、代码优化方法一&#xff1a;修改批量新增SQL方法二&#xff1a;使用insertBatchSomeColumn 方法 一、主题 经发现&#xff0c;mybatisPlus只有Service中存在saveBatch()方法&#xff0c;而Mapper中不存在…

博客后台模块续更(五)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…

从0开始学云计算之服务器:服务的定义,特点,应用场景,分类

服务器定义 服务器是计算机的一种。它比普通计算机运行速度更快、负载更高且价格更高。 服务器的英文名称为“Server”&#xff0c;是指在网络上提供各种服务的高性能计算机。作为网络的节点&#xff0c;存储、处理网络上80%的数据、信息&#xff0c;因此也被称为x络的灵魂。 …

三、机器学习基础知识:Python常用机器学习库(Pandas)

文章目录 1、Pandas2、Series数据结构2.1 Series的创建2.2 Series的索引与访问2.3 Series的常见操作 3、DataFrame对象3.1 DataFrame的创建与索引3.2 DataFrame的访问3.3 DataFrame的常见操作 4、数据对齐5、缺失数据处理6、Pandas存取文件 1、Pandas Pandas 库是以Numpy库为基…

互联网医院牌照|互联网医院牌照资质申请流程和所需材料

那么不同的企业基于不同的业务板块&#xff0c;所需要搭建的互联网医院也存在差异&#xff0c;平衡好自身业务及互联网医疗建设二者间的关系&#xff0c;是企业建设互医的基础需求&#xff0c;那么互联网医院牌照办理流程和材料都包含哪些呢&#xff1f;接下来就给大家介绍下。…

短视频矩阵系统软件源码

短视频矩阵系统软件源码 视频成为获得免费流量最便宜的渠道&#xff0c;平台给所有视频最基础的保底流量。如果按照一个视频最低500流量计算&#xff0c;5个账户就是2500的流量&#xff0c;200个视频就是50W流量&#xff0c;如果从其他渠道获得50W流量是个很困难的事情。短视频…

第四章 文件管理 三、文件目录

目录 一、文件控制块 1、定义&#xff1a; 2、要进行哪些操作 &#xff08;1&#xff09;搜索: &#xff08;2&#xff09;创建文件: &#xff08;3&#xff09;删除文件: &#xff08;4&#xff09;显示目录: &#xff08;5&#xff09;修改目录: 二、目录结构 1、单…

QSOP24封装的语音芯片优势列举

1. 封装紧凑&#xff1a;QSOP24封装采用了更小的封装尺寸&#xff0c;相比于其他大型封装&#xff0c;它的体积更小、尺寸更紧凑。这使得它在空间受限的应用中更加适用&#xff0c;可以方便地集成到小型或薄型设备中&#xff0c;提供更高的设计灵活性。 2. 强大的功能&#xf…

Go之流程控制大全: 细节、示例与最佳实践

引言 在计算机编程中&#xff0c;流程控制是核心的组成部分&#xff0c;它决定了程序应该如何根据给定的情况执行或决策。以下是Go语言所支持的流程控制结构的简要概览&#xff1a; 流程控制类型代码if-else条件分支if condition { } else { }for循环for initialization; con…

el-table相同的值合并单元格+多级表头

<el-table border :data"costList" :span-method"objectSpanMethod" ><el-table-column label"类别" prop"类别" width"120"> </el-table-column><el-table-column label"费用科目" prop&qu…

如何给照片添加水印?请看下面3个简单教程

如何给照片添加水印&#xff1f;随着智能手机的普及和不断提升的拍摄技术&#xff0c;如今人们可以轻松使用手机进行高质量的照片拍摄。从老人到小孩&#xff0c;每个人都可以在日常生活中捕捉到美好瞬间&#xff0c;并将其记录下来。作为一种表达自己的方式&#xff0c;现在手…