verilog学习笔记- 9)流水灯实验

news2024/11/25 18:29:28

目录

简介:

实验任务:

硬件设计:

程序设计:

下载验证:


简介:

LED,又名发光二极管。LED 灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗震性能好, 可靠性高,寿命长。由于这些优点,LED 灯被广泛用在仪器仪表中作指示灯、液晶屏背光源等诸多领域。

发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过 5mA 左右的电流就可 以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电流限定在 3~20mA 之间, 否则电流过大就会烧坏二极管。


实验任务:

本节实验任务是使新起点开发板上的 4 个 LED 灯顺序点亮并熄灭,循环往复产生流水的现象。


硬件设计:

发光二极管的原理图如图:

本实验中,系统时钟、按键复位以及 LED 端口的管脚分配如下表:

对应的 TCL 约束语句如下:

set_location_assignment PIN_M2 -to sys_clk
set_location_assignment PIN_M1 -to sys_rst_n
set_location_assignment PIN_D11 -to led[0]
set_location_assignment PIN_C11 -to led[1]
set_location_assignment PIN_E10 -to led[2]
set_location_assignment PIN_F9 -to led[3]

程序设计 :

由于发光二极管的阳极与 FPGA 的管脚相连,只需要改变与 LED 灯相连的 FPGA 管脚的电平,LED 灯 的亮灭状态就会发生变化。当 FPGA 管脚为高电平时,LED 灯点亮;为低电平时,LED 灯熄灭。本次设计的模块端口及信号连接如下图所示:

由于人眼的视觉暂留效应,流水灯状态变换间隔时间最好不要低于 0.1s,否则就不能清晰地观察到流水 效果。这里我们让流水灯每间隔 0.2s 变化一次。在程序中需要用一个计数器累加计数来计时,计时达 0.2s 后计数器清零并重新开始计数,这样就得到了固定的时间间隔。每当计数器计数满 0.2s 就让 led 灯发光状态变化一次。

代码如下:

1 module flow_led(
2 input sys_clk , //系统时钟
3 input sys_rst_n, //系统复位,低电平有效
4 
5 output reg [3:0] led //4 个 LED 灯
6 );
7 
8 //reg define
9 reg [23:0] counter;
10 
11 //*****************************************************
12 //** main code
13 //***************************************************** 
14 
15 //计数器对系统时钟计数,计时 0.2 秒
16 always @(posedge sys_clk or negedge sys_rst_n) begin
17 if (!sys_rst_n)
18 counter <= 24'd0;
19 else if (counter < 24'd1000_0000)
20 counter <= counter + 1'b1;
21 else
22 counter <= 24'd0;
23 end
24 
25 //通过移位寄存器控制 IO 口的高低电平,从而改变 LED 的显示状态
26 always @(posedge sys_clk or negedge sys_rst_n) begin
27 if (!sys_rst_n)
28 led <= 4'b0001;
29 else if(counter == 24'd1000_0000)
30 led[3:0] <= {led[2:0],led[3]};
31 else
32 led <= led;
33 end
34 
35 endmodule

 本程序中输入时钟为 50MHz,所以一个时钟周期为 20ns(1/50MHz)。因此计数器 counter 通过对 50MHz 系统时钟计数,计时到 0.2s,需要累加 0.2s/20ns=10000000 次。在代码第 22 行,每当计时到 0.2s 计数器清零一次。

同时,每当计数器计数到 10000000 时,将各个 LED 灯的状态左移一位,并将最高位的值移动到最低 位,循环往复。其他时间,LED 灯的状态不变。如代码中第 29 至 32 行所示。

需要说明的是,led 的初始值必须是一位为 1,其它位为 0,在循环左移的过程中才会呈现流水灯的效 果;而如果 led 的初始值为 0,则左移后 led 的状态仍然为 0。代码中 led 的初始值是由复位信号(sys_rst_n) 控制的,如代码中第 27 行和第 28 行所示。这里的复位信号对应的就是板载的复位按键,尽管在上电后没 有按下复位按键,由于 FPGA 芯片内部有一个上电检测模块,一旦检测到电源电压超过检测门限后,就产 生一个上电复位脉冲(Power On Reset)送给所有的寄存器,led 的初始值就是在这个时候复位成 4‘b0001 的。

我们在 Modelsim 中对流水灯程序进行仿真,为了减少仿真过程所需要的时间,将流水灯状态变化的间 隔时间修改为 0.1ms。仿真得到的波形图如图 8.4.2 所示,led 端口寄存器的值按照 0001→0010→0100→1000 →0001 的顺序变化,对应的各个 LED 灯的接口电平依次改变。

 

仿真过程用到的测试程序如下所示:

1 `timescale 1ns/1ns // 定义仿真时间单位 1ns 和仿真时间精度为 1ns
2 
3 module flow_led_tb; // 测试模块
4 
5 //parameter define
6 parameter T = 20; // 时钟周期为 20ns
7 
8 //reg define
9 reg sys_clk; // 时钟信号
10 reg sys_rst_n; // 复位信号
11 
12 //wire define
13 wire [3:0] led;
14 
15 //*****************************************************
16 //** main code
//*****************************************************
18 
19 //给输入信号初始值
20 initial begin
21 sys_clk = 1'b0;
22 sys_rst_n = 1'b0; // 复位
23 #(T+1) sys_rst_n = 1'b1; // 在第 21ns 的时候复位信号信号拉高
24 end
25 
26 //50Mhz 的时钟,周期则为 1/50Mhz=20ns,所以每 10ns,电平取反一次
27 always #(T/2) sys_clk = ~sys_clk;
28 
29 //例化 led 模块
30 flow_led u0_flow_led (
31 .sys_clk (sys_clk ),
32 .sys_rst_n (sys_rst_n),
33 .led (led )
34 );
35 
36 endmodule

下载验证:

 

 可以看到功能正常

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

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

相关文章

工业互联网安全漏洞分析

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 研究背景 在政策与技术的双轮驱动下&#xff0c;工业控制系统正在越来越多地与企业内网和互联网相连接&#xff0c;并与新型服务模式相结合&#xff0c;逐步形成…

day01--Python学习笔记之安装及测试

目录 官网下载 1、Python自带简单的开发环境 2、Python的交互式命令行程序 3、官方技术文档 4、安装模块文档 1、Python自带简单的开发环境 在当前中编辑代码 在新文件中编辑代码 2、P…

springboot 使用tomcat详解

1.使用内嵌tomcat启动 创建tomcat对象设置端口设置Context设置servlet 和 路径 2.spring中单独注册servlet和地址的映射关系 Beanpublic ServletRegistrationBean getServletRegistrationBean() {ServletRegistrationBean bean new ServletRegistrationBean(apiServlet);bean…

免费GPU攻略

白嫖kaggle kaggle每周会送38个小时&#xff0c;16GB显存。 验证手机号 根据 kaggle问答可知&#xff0c;需要手机号短信验证&#xff0c;账号才能用GPU。国内的手机号都是可用的。操作如下&#xff1a; 点击右上角头像&#xff0c;点击Account。 到了个人详情页后&#xf…

基于JAVA springboot+mybatis智慧生活分享平台设计和实现

基于JAVA springbootmybatis智慧生活分享平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

【MySQL进阶】执行一条 sql 语句,期间会发生什么

【MySQL进阶】执行一条 sql 语句&#xff0c;期间会发生什么? 文章目录【MySQL进阶】执行一条 sql 语句&#xff0c;期间会发生什么?MySQL 执行流程是怎样的&#xff1f;第一步&#xff1a;连接器第二步&#xff1a;查询缓存第三步&#xff1a;解析 SQL解析器第四步&#xff…

Google Play Install Referrer API 和 Facebook App Ads Referral 集成

介绍&#xff1a;由于需要精准的获取投放广告的数据&#xff08;投放的平台&#xff0c;防止数据的丢失等&#xff09;。我们使用了Google Play Install Referrer API 和Facebook App Ads Referral结合采集数据&#xff0c;然后通过后台服务记录数据。最后服务器记录的数据与Fa…

openwrt tc(traffic contrl)配置及使用

在某些情况下&#xff0c;嵌入式设备需要用到弱网环境进行测试。网上针对tc的配置有很多&#xff0c;但是7688的没找到&#xff0c;所以做个记录&#xff0c;方便大家使用。netem配置 Kernel modules > Network Support > kmod-netemqos-scripts配置> Base system >…

甲氧基聚乙二醇-葡聚糖 mPEG-Dextran结构式;Dextran-PEG科研实验用

甲氧基聚乙二醇-葡聚糖 mPEG-Dextran 中文名称&#xff1a;甲氧基聚乙二醇-葡聚糖 英文名称&#xff1a;mPEG-Dextran 规格&#xff1a;500mg/1g/5g/10g 分散系数&#xff1a;小于等于1.05 分子量&#xff08;PEG&#xff09;&#xff1a;2000&#xff1b;3400&#xff1b…

Jmeter5.0之 dubbo插件安装

我记得之前 这个链接&#xff1a;https://github.com/ningyu1/jmeter-plugins-dubbo/tree/master/dist 能下载现成的dubbo插件&#xff0c;现在这个链接访问后提示404、网上搜索提供了最新的获取方式&#xff0c;1、访问链接&#xff1a;https://github.com/ningyu1/jmeter-plu…

ForkJoin

什么是ForkJoin ForkJoin在JDK1.7&#xff0c;并行执行任务&#xff01;提高效率&#xff0c;大数据量&#xff01; 大数据&#xff1a;Map Reduce&#xff08;把大任务拆分为小任务&#xff09; ForkJoin特点&#xff1a;工作窃取 这个里面维护的都是双端队列 当第一行的任务执…

AJAX

目录1 AJAX 快速入门1.1 介绍1.2 原生 JavaScript 实现 AJAX1.3 原生JS实现AJAX详解1.4 jQuery 的 GET 方式实现 AJAX1.5 jQuery 的 POST方式实现 AJAX1.5 jQuery 的 通用方式实现 AJAX2 JSON 的处理2.1 JSON 回顾2.2 JSON 转换工具的介绍2.3 JSON转换练习3 案例-搜索联想4 案例…

git 切换分支

1. 查看远程分支&#xff0c;查看当前所有git branch -a 2. 查看本地分支git branch * master3. 切换分支 //创建分支 git checkout -b test origin/test //切换分支 git checkout 分支名

iframe 页面间的通信(分享)

文章目录1. 概述2. 页面之间传递数据3. 直接获取父页面的数据4. 获取父级页面源的信息1. 概述 在许多老的项目中使用的都是 iframe 进行的页面嵌套&#xff0c;我这里写了三个页面进行演示红色的页面为最外层&#xff0c;本地开的服务&#xff0c;端口为 5500&#xff0c;而黄色…

官宣了,德云社京剧神童陶阳亮相河南春晚,为什么不是老乡岳云鹏

随着春节的临近&#xff0c;一年一度的央视春晚&#xff0c;也即将拉开大幕与观众见面&#xff0c;不过今年却略有不同。虽然央视春晚还没有开播&#xff0c;互联网上面就一片抵触声音&#xff0c;有人甚至给出了建议&#xff0c;希望省下钱给大家发红包。 与央视春晚形成鲜明对…

未来的分析型数据库是什么样的?

本文来自于 Doris Summit 2022 演讲实录&#xff0c;演讲人&#xff1a;陈明雨十年对于数据库意味着什么&#xff1f;身处在日新月异的时代&#xff0c;我们见惯了技术的兴起与繁荣、变迁与衰落&#xff0c;甚至是朝荣夕灭。信息技术以前所未有的速度更迭&#xff0c;给周遭事物…

从0到1完成一个Vue后台管理项目(十四、对话框封装、接口联通、api优化 很重点(封装思想))

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

React Fiber 树思想,解决业务实际场景

熟悉 Fiber 树结构 我们知道&#xff0c;React 从 V16 版本开始采用 Fiber 树架构来实现渲染和更新机制。 Fiber 在 React 源码中可以看作是一个任务执行单元&#xff0c;每个 React Element 都会有一个与之对应的 Fiber 节点。 Fiber 节点的核心数据结构如下&#xff1a; …

基于javaweb+springboot+HTML汽车配件管理系统设计和实现以及文档报告

基于javaweb(springboot)汽车配件管理系统设计和实现以及文档报告 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言…

Java面试题,这是一篇会一直更新的博客!欢迎大家留言~

Java面试题1、面向对象与面向过程2、Spring源码分析&#xff08;可能比较复杂&#xff0c;但是看下去可能会找到让你顿悟的字眼&#xff09;2.1、Spring创建Bean对象2.2 实例化&#xff08;推断构造方法&#xff09;1、面向对象与面向过程 封装&#xff1a;封装在于明确标识出允…