北邮22级信通院数电:Verilog-FPGA(4)第三周实验:按键消抖、呼吸灯、流水灯 操作流程注意事项

北邮22信通一枚~

跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章

持续关注作者 迎接数电实验学习~

获取更多文章,请访问专栏:

北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客

目录

一.注意事项

二.按键消抖

2.1  LED_debounce代码

2.2debounce.v代码

 2.3管脚分配

三.流水灯

3.1  LED_flash.v代码

3.2 divide.v代码

3.3decode38.v代码

3.4管脚分配

四.呼吸灯

4.1 LED_breath.v代码

 4.2管脚分配


一.注意事项

烧录之前首先检查这几个参数是否调整完毕:

 

没调的赶紧去调!!!

二.按键消抖

2.1  LED_debounce代码

module LED_debounce (clk,rst,key,led);input             clk;input             rst;input 	          key;                      				output   reg      led;        wire              key_pulse;//当按键按下时产生一个高脉冲,翻转一次ledalways @(posedge clk  or  negedge rst)beginif (!rst) led <= 1'b1;else if (key_pulse)led <= ~led;elseled <= led;end    //例化消抖module,这里没有传递参数N,采用了默认的N=1     debounce  u1 (                               .clk (clk),.rst (rst),.key (key),.key_pulse (key_pulse));endmodule

2.2debounce.v代码

module debounce (clk,rst,key,key_pulse);parameter       N  =  1;         //要消除的按键的数量input             clk;input             rst;input 	[N-1:0]   key;          //输入的按键					output  [N-1:0]   key_pulse;        //按键动作产生的脉冲	reg     [N-1:0]   key_rst_pre;  //定义一个寄存器型变量存储上一个触发时的按键值reg     [N-1:0]   key_rst;      //定义一个寄存器变量储存储当前时刻触发的按键值wire    [N-1:0]   key_edge;      //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk  or  negedge rst)beginif (!rst) beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelse beginkey_rst <= key;       //第一个时钟上升沿触发之后key的值赋给key_rst,//同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst;    //非阻塞赋值。//相当于经过两个时钟触发,//key_rst存储的是当前时刻key的值,//key_rst_pre存储的是前一个时钟的key的值end    endassign  key_edge = key_rst_pre & (~key_rst);//脉冲边沿检测。//当key检测到下降沿时,//key_edge产生一个时钟周期的高电平reg	[17:0]	  cnt;                       //产生延时所用的计数器,系统时钟12MHz,//要延时20ms左右时间,至少需要18位计数器     //产生20ms延时,当检测到key_edge有效是计数器清零开始计数always @(posedge clk or negedge rst)beginif(!rst)cnt <= 18'h0;else if(key_edge)cnt <= 18'h0;elsecnt <= cnt + 1'h1;end  reg     [N-1:0]   key_sec_pre;                //延时后检测电平寄存器变量reg     [N-1:0]   key_sec;                    //延时后检测key,如果按键状态变低产生一个时钟的高脉冲。如果按键状态是高的话说明按键无效always @(posedge clk  or  negedge rst)beginif (!rst) key_sec <= {N{1'b1}};                else if (cnt==18'h3ffff)key_sec <= key;  endalways @(posedge clk  or  negedge rst)beginif (!rst)key_sec_pre <= {N{1'b1}};else                   key_sec_pre <= key_sec;             end      assign  key_pulse = key_sec_pre & (~key_sec);     endmodule

 2.3管脚分配

三.流水灯

3.1  LED_flash.v代码

module LED_flash(clk,rst,led);input clk,rst;						output [7:0] led;				reg   [2:0] cnt ; //定义了一个3位的计数器,输出可以作为3-8译码器的输入wire clk1h;       //定义一个中间变量,表示分频得到的时钟,用作计数器的触发        //例化module decode38,相当于调用decode38 u1 (                                   .sw(cnt),     //例化的输入端口连接到cnt,输出端口连接到led  .led(led));//例化分频器模块,产生一个1Hz时钟信号		divide #(.WIDTH(32),.N(12000000)) u2 (         //传递参数.clk(clk),.rst_n(rst),                   //例化的端口信号都连接到定义好的信号.clkout(clk1h));                             //1Hz时钟上升沿触发计数器,循环计数		always @(posedge clk1h or negedge rst)if (!rst)cnt <= 0;elsecnt <= cnt +1;endmodule

3.2 divide.v代码

module divide (	clk,rst_n,clkout);input 	clk,rst_n; //输入信号,其中clk连接到FPGA的C1脚,频率为12MHzoutput	clkout;    //输出信号,可以连接到LED观察分频的时钟//parameter是verilog里常数语句parameter	WIDTH	= 3; //计数器的位数,计数的最大值为 2**WIDTH-1parameter	N	= 5;     //分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出reg [WIDTH-1:0]	cnt_p,cnt_n; //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器reg			clk_p,clk_n;     //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟//上升沿触发时计数器的控制always @ (posedge clk or negedge rst_n )//posedge和negedge是verilog表示信号上升沿和下降沿//当clk上升沿来临或者rst_n变低的时候执行一次always里的语句beginif(!rst_n)cnt_p<=0;else if (cnt_p==(N-1))cnt_p<=0;else cnt_p<=cnt_p+1;//计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器end//上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%always @ (posedge clk or negedge rst_n)beginif(!rst_n)clk_p<=0;else if (cnt_p<(N>>1))          //N>>1表示右移一位,相当于除以2去掉余数clk_p<=0;else clk_p<=1;               //得到的分频时钟正周期比负周期多一个clk时钟end//下降沿触发时计数器的控制        	always @ (negedge clk or negedge rst_n)beginif(!rst_n)cnt_n<=0;else if (cnt_n==(N-1))cnt_n<=0;else cnt_n<=cnt_n+1;end//下降沿触发的分频时钟输出,和clk_p相差半个时钟always @ (negedge clk)beginif(!rst_n)clk_n<=0;else if (cnt_n<(N>>1))  clk_n<=0;else clk_n<=1;                //得到的分频时钟正周期比负周期多一个clk时钟endassign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p;      //条件判断表达式                                                         //当N=1时,直接输出clk//当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p//当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。//正周期多所以是相与
endmodule     

3.3decode38.v代码

module decode38 (sw,led);input [2:0] sw;            //开关输入信号,利用了其中3个开关作为3-8译码器的输入output [7:0] led;		   //输出信号控制特定LEDreg [7:0] led;          //定义led为reg型变量,在always过程块中只能对reg型变量赋值//always过程块,括号中sw为敏感变量,当sw变化一次执行一次always中所有语句,否则保持不变always @ (sw)begincase(sw)                        //case语句,一定要跟default语句3'b000:	led=8'b0111_1111;   //条件跳转,其中“_”下划线只是为了阅读方便,无实际意义  3'b001:	led=8'b1011_1111;   //位宽'进制+数值是Verilog里常数的表达方法,//进制可以是b、o、d、h(二、八、十、十六进制)3'b010:	led=8'b1101_1111;3'b011:	led=8'b1110_1111;3'b100:	led=8'b1111_0111;3'b101:	led=8'b1111_1011;3'b110: led=8'b1111_1101;3'b111:	led=8'b1111_1110;default: ;endcaseendendmodule

3.4管脚分配

四.呼吸灯

4.1 LED_breath.v代码

module LED_breath(clk,rst,led);input clk;             //系统时钟输入input rst;             //复位输出output led;            //led输出reg [24:0] cnt1;       //计数器1reg [24:0] cnt2;       //计数器2reg flag;              //呼吸灯变亮和变暗的标志位//parameter   CNT_NUM = 2400;	//计数器的最大值 period = (2400^2)*2 ~= 12000000 = 1s由亮到暗0.5s,由暗到亮0.5sparameter   CNT_NUM = 3464;	//计数器的最大值 period = (3464^2)*2 ~= 24000000 = 2s由亮到暗1s,由暗到亮1s//产生计数器cnt1always@(posedge clk or negedge rst) begin if(!rst) begincnt1<=13'd0;end else beginif(cnt1>=CNT_NUM-1) cnt1<=1'b0;else cnt1<=cnt1+1'b1; endend//产生计数器cnt2always@(posedge clk or negedge rst) begin if(!rst) begincnt2<=13'd0;flag<=1'b0;end else beginif(cnt1==CNT_NUM-1) begin   //当计数器1计满时计数器2开始计数加一或减一if(!flag) begin              //当标志位为0时计数器2递增计数,表示呼吸灯效果由暗变亮if(cnt2>=CNT_NUM-1)      //计数器2计满时,表示亮度已最大,//标志位变高,之后计数器2开始递减flag<=1'b1;elsecnt2<=cnt2+1'b1;end else begin  //当标志位为高时计数器2递减计数if(cnt2<=0) //计数器2级到0,表示亮度已最小,标志位变低,之后计数器2开始递增flag<=1'b0;else cnt2<=cnt2-1'b1;endendelse cnt2<=cnt2;//计数器1在计数过程中计数器2保持不变endend//比较计数器1和计数器2的值产生自动调整占空比输出的信号,输出到led产生呼吸灯效果assign	led = (cnt1<cnt2)?1'b0:1'b1;endmodule

 4.2管脚分配

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[MySQL]基础篇

文章目录 1. MySQL基本使用1.1 MySQL的启动和登录1.1.1 MySQL的启动1.1.2 MySQL的客户端连接 1.2 数据模型 2. SQL2.1 SQL类型2.1.1 数值类型2.1.2 字符串类型2.1.3 日期类型 2.2 DDL2.2.1 数据库操作2.2.2 表操作 - 查询2.2.3 表操作 - 创建表2.2.4 表操作 - 修改 2.3 DML2.3.…

运维小工具分享

1.windwos时间同步工具 通过NetTime软件同步 通过一个免费的同步时间软件来进行对时操作 软件官网链接&#xff1a;http://timesynctool.com/ 修改Windows主机时间&#xff0c;修改时间&#xff0c;时间差为10年、3年、4月份、24小时、2小时、1分钟&#xff1b;都可以及时与“…

ROS学习笔记(六)---服务通信机制

1. 服务通信是什么 在ROS中&#xff0c;服务通信机制是一种点对点的通信方式&#xff0c;用于节点之间的请求和响应。它允许一个节点&#xff08;服务请求方&#xff09;向另一个节点&#xff08;服务提供方&#xff09;发送请求&#xff0c;并等待响应。 服务通信机制在ROS中…

深度学习batch、batch_size、epoch、iteration以及小样本中episode、support set、query set关系

batch、batch_size、epoch、iteration关系&#xff1a; epoch&#xff1a;整个数据集 batch&#xff1a; 整个数据集分成多少小块进行训练 batch_size&#xff1a; 一次训练&#xff08;1 batch&#xff09;需要 batch_size个样本 iteration&#xff1a; 整个数据集需要用b…

VMware虚拟机安装Linux教程(图文超详细)

1.安装VMware 官方正版VMware下载地址 https://www.vmware.com/ 双击安装 以上就是VMware在安装时的每一步操作&#xff0c;基本上就是点击 "下一步" 一直进行安装。 2.安装Linux VMware虚拟机安装完毕之后&#xff0c;我们就可以打开VMware&#xff0c;并在上面来…

【群智能算法改进】一种改进的光学显微镜算法 IOMA算法[1]【Matlab代码#60】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 光学显微镜算法&#xff08;OMA&#xff09;1.1 物镜放大倍数1.2 目镜放大倍数 2. 改进后的IOMA算法2.1 透镜成像折射方向学习 3. 部分代码展示4. 仿真结果展示5. 资源获取说明 【获取资源请见文章第5节&#xff1a;…

Vuex的基础使用存值及异步

目录 一、概述 ( 1 ) 讲述 ( 2 ) 概念 ( 3 ) 作用 二、取值 1. 安装 2. 菜单栏 3. 模块 4. 引用 三、改值 四、异步&后台请求 带来的获取 一、概述 ( 1 ) 讲述 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的…

JVM第一讲:JVM相关知识体系详解+面试(P6熟练 P7精通)

JVM相关知识体系详解面试(P6熟练 P7精通) 面试时常常被面试官问到JVM相关的问题。本系列将给大家构建JVM核心知识点全局知识体系&#xff0c;本文是JVM第一讲&#xff0c;JVM相关知识体系详解和相关面试题梳理。 文章目录 JVM相关知识体系详解面试(P6熟练 P7精通)1、JVM学习建议…

大数据之Hudi数据湖_执行编译hudi命令和jar包位置_hudi和hive集成_和spark集成_和presto集成_和flink集成_和trino集成---大数据之Hudi数据湖工作笔记0004

在hudi源码的根目录执行就可以了,注意要指定spark的版本上面指定的是3.2 如果不指定默认是3,最好都指定一下. 这里在执行编译之前,我们可以先去看一下在hudi的源码目录下,有个README.md 这个文件 去看看她支持的java 版本和git maven版本 看看spark支持的版本 看看对应的scala…

PayPal VS Block:开启全球金融科技的新未来

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;PayPal&#xff08;PYPL&#xff09;的战略重点是专注于 branded checkout、先付后买、人工智能驱动的创新&#xff0c;以及进入稳定币市场。 &#xff08;2&#xff09;Block&a…

指针拔尖(2)(巩固提高,全网最牛,包会,看不懂带电脑来找我)

文章目录 前言变量的声明 一、函数指针二、函数指针数组三、指向函数指针数组的指针四、 回调函数总结 前言 提示&#xff1a;本章是指针拔尖系列的终章&#xff0c;有四大知识点。 一、函数指针 二、函数指针数组 三、指向函数指针数组的指针 四、回调函数 但学习这些知识点我…

目标检测新思路:DETR

Transformer是一种基于自注意力机制的神经网络架构&#xff0c;它能够从序列中提取重要信息&#xff0c;已被广泛应用于自然语言处理和语音识别等领域。随着Transformer的提出和发展&#xff0c;目标检测领域也开始使用Transformer来提高性能。 DETR是第一篇将Transformer应用于…

Cocos Creator3.8 项目实战(八)2D UI DrawCall优化详解(上)

游戏开发的朋友都知道&#xff0c;在游戏开发过程中&#xff0c;DrawCall 是我们优化性能的一个非常重要的指标&#xff0c;直接影响游戏的整体性能表现&#xff0c;DrawCall数量越多&#xff0c;帧率会降低&#xff0c;能明显感觉到卡顿。 那今天我们就来聊一聊&#xff0c;2D…

零售超市商家怎么做微信小程序

随着互联网的发展&#xff0c;越来越多的零售超市商家开始关注如何借助微信小程序引流&#xff0c;以提高销售额和客户满意度。下面将介绍几个策略&#xff0c;帮助零售超市商家借助微信小程序实现引流。 首先&#xff0c;商家需要开发一款适合自己的微信小程序。小程序是一种轻…

pyqt 划线标注工具

效果图: 代码: import osfrom PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton, QLabel from PyQt5.QtGui import QPainter, QPen, QColor, QImage, QPixmap from PyQt5.QtCore import Qt, QPoint import sys import jsonclass ImageLabel(QLabel)…

centos7下 编译coreboot生成真机可用的bios固件, 并在真机上演示 (上篇)

看了国内的corebot相关文章以及b站的corebot视频, 大不部分都是编译 用于虚拟机(qemu)或者模拟器上运行的 很少有编译corebot项目 出可以再真机上使用的的 bios 本教程应该是全网最详细的了, 真机版的coreboot bios固件, 所以有点长, 希望对你有帮助 #coreboot编译总说明文档…

论文阅读——Large Selective Kernel Network for Remote Sensing Object Detection

目录 基本信息标题目前存在的问题改进网络结构另一个写的好的参考 基本信息 期刊CVPR年份2023论文地址https://arxiv.org/pdf/2303.09030.pdf代码地址https://github.com/zcablii/LSKNet 标题 遥感目标检测的大选择核网络 目前存在的问题 相对较少的工作考虑到强大的先验知…

深度学习基础知识 使用torchsummary、netron、tensorboardX查看模参数结构

深度学习基础知识 使用torchsummary、netron、tensorboardX查看模参数结构 1、直接打印网络参数结构2、采用torchsummary检测、查看模型参数结构3、采用netron检测、查看模型参数结构3、使用tensorboardX 1、直接打印网络参数结构 import torch.nn as nn from torchsummary im…

从裸机启动开始运行一个C++程序(七)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;六&#xff09; 从裸机启动开始运行一个C程序&#xff08;五&#xff09; 从裸机启动开始运行一个C程序&#xff08;四&#xff09; 从裸机启动开始运行一个C程序&#xff08;三&#xff09; 从裸机启动开始运…

Httpd(一)

介绍 httpd是apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程&#xff0c;它会建立一个处理请求的子进程或线程的池。 特性 高度模块化&#xff1a;core modules DSO&#xff1a;Dynamic Shared Object 动态加载/卸载 MPM&#xff1a;multi-p…