09B-独立按键消抖实验02——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线——普利斯队长精心奉献

?

实验目的: 1.复习按键的设计

2.用模块化设计的方式实现每次按下按键0,4个LED显示状态以二进制加法格式加1,每次按下按键1,4个LED显示状态以二进制加法格式减1

实验平台:芯航线FPGA核心板

实验原理:????

????在上一讲中设计并验证了独立按键的消抖,这里基于上一讲的按键消抖模块来实现一个加减法计数器,并以此学习模块化的设计方式。

????在设计过程中,相对大一点的工程经常通常不会写在一个设计文件中,通常会针对不同的功能设计出不同的子文件,最后在顶层文件中进行例化。基于本讲其模块的划分如图9-1所示。

图9-1 顶层模块端口图

实验步骤:

????这里先编写led_ctrl,从图9-1可得出其端口列表如下。


input Clk;

input Rst_n;

input key_flag0,key_flag1;

input key_state0,key_state1;

?

output
[3:0]led;

?

这里需要进行根据两个按键的状态来进行计数器的加减。


reg
[3:0]led_r;

always@(posedge Clk or
negedge Rst_n)

if(!Rst_n)

led_r <=
4‘b0000;

else
if(key_flag0 &&
!key_state0)

led_r <= led_r +
1‘b1;

else
if(key_flag1 &&
!key_state1)

led_r <= led_r -
1‘b1;

else

led_r <= led_r;

????计数器的初值为4‘b0000,这里当按键0按下即计数器加一计数器变为4‘b0001,由开发板上的led灯电路图可知,led灯为低电平点亮,此时就会出现led0-led3分别为亮亮亮暗,为了更直观的显示效果对输出数据进行取反,这样led的数据就会变为暗暗暗亮,与正常的思路相符合。


assign led =
~led_r;

图9-2 led灯电路图

这样各个独立的模块即编写完成,下面开始顶层文件的设计。


module key_led_top(Clk,Rst_n,key_in0,key_in1,led);

?

input Clk;

input Rst_n;

input key_in0;

input key_in1;

?

output
[3:0]led;

?

wire key_flag0,key_flag1;

wire key_state0,key_state1;

?

key_filter key_filter0(

.Clk(Clk),

.Rst_n(Rst_n),

.key_in(key_in0),

.key_flag(key_flag0),

.key_state(key_state0)

);

?

key_filter key_filter1(

.Clk(Clk),

.Rst_n(Rst_n),

.key_in(key_in1),

.key_flag(key_flag1),

.key_state(key_state1)

);

?

led_ctrl led_ctrl0(

.Clk(Clk),

.Rst_n(Rst_n),

.key_flag0(key_flag0),

.key_flag1(key_flag1),

.key_state0(key_state0),

.key_state1(key_state1),

.led(led)

);

?

endmodule

进行分析和综合直至没有错误以及警告。这时可以打开Quartus II软件中的RTL Viewer,查看模块间的连接。如图9-4所示,与设计的顶层模块端口图一样,因此可以看出顶层文件例化正确。

图9-4 顶层模块RTL视图

为了测试仿真编写测试激励文件,这里由于调用了两个按键进行仿真,因此需要将前一讲设计的按键仿真模型进行改写,加入使能信号press,即press上升沿时就执行一次输出key,其中任务task press_key部分是不变的。如果不改写调用的两个仿真模型会同时执行,就导致出错。


`timescale
1ns/1ns

?

module key_model(press,key);

?

input press;

output
reg key;

?

reg
[15:0]myrand;

?

initial
begin

key =
1‘b1;

end

?

always@(posedge press)

press_key;

?

task press_key;

begin

…………

end

endtask

?

endmodule

?

新建key_led_top_tb.v文件输入以下内容并保存到testbench文件夹下,再次进行分析和综合直至没有错误以及警告。以下内容除了生成了时钟以及复位信号,还模拟了按键0按下释放两次以及按键1按下释放两次的过程。这样整体的代码就如下所示。


`timescale
1ns/1ns

?

`define clk_period 20

?

module key_led_top_tb;

?

reg Clk;

reg Rst_n;

?

wire key_in0;

wire key_in1;

reg press0,press1;

?

wire
[3:0]led;

?

key_led_top key_led_top0(

.Clk(Clk),

.Rst_n(Rst_n),

.key_in0(key_in0),

.key_in1(key_in1),

.led(led)

);

?

key_model key_model0(

.press(press0),

.key(key_in0)

);

?

key_model key_model1(

.press(press1),

.key(key_in1)

);

?

initial Clk=
1;

always#(`clk_period/2) Clk =
~Clk;

?

initial
begin

Rst_n =
1‘b0;

press0 =
0;

press1 =
0;

#(`clk_period*10) Rst_n =
1‘b1;

#(`clk_period*10
+
1);

?

press0 =
1;

#(`clk_period*3)

press0 =
0;

#80_000_000;

?

press0 =
1;

#(`clk_period*3)

press0 =
0;

#80_000_000;

?

press1 =
1;

#(`clk_period*3)

press1 =
0;

#80_000_000;

?

press1 =
1;

#(`clk_period*3)

press1 =
0;

#80_000_000;

$stop;

end

?

endmodule

?

设置好仿真脚本后进行功能仿真,可以看到如图9-5所示的波形文件。每当按键0按下时计数器led_r则会加一,按键1按下后计数器led_r则会减一。

图9-5 功能仿真波形图

分配引脚后全编译无误后下载工程到开发板中。也看到与之对应的现象,即为设计无误。

至此,实现了一个简单的模块化设计,并进行了仿真与板级验证。

时间: 2024-08-29 07:13:22

09B-独立按键消抖实验02——小梅哥FPGA设计思想与验证方法视频教程配套文档的相关文章

09A-独立按键消抖实验01——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的: 1.复习状态机的设计思想并以此为基础实现按键消抖 2.单bit异步信号同步化以及边沿检测 3.在激励文件中学会使用随机数发生函数$random 4.仿真模型的概念 实验平台:芯航线FPGA核心板 实验原理: ????按键在电子设计中使用的最多,从复位到控制设置均可以看到其身影.现在按键的功能也种类也越来越多,例如多向按键.自锁按键.薄膜按键等.普通按键其硬件示意图如图9-1所示. 图9-1 按键示意图 芯航线开发板所载的为两脚贴片按键,分别位于开发板

08-FPGA状态机设计实例——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:1.学习状态机的相关概念 2.理解一段式.两段式以及三段式状态机的区别以及优缺点 实验平台:芯航线FPGA核心板 实验原理: 状态机全称是有限状态机(finite-state machine,缩写:FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 状态机分为摩尔(Moore)型有限状态机与米利(Mealy)型有限状态机.摩尔状态机输出是只由输入确定的有限状态机(不直接依赖于当前状态).米利有限状态机的输出不止与其输入有关还于它的

02-FPGA设计流程介绍——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线——普利斯队长精心奉献 课程目标: 1.了解并学会FPGA开发设计的整体流程 2.设计一个二选一选择器并进行功能仿真.时序仿真以及板级验证 实验平台:芯航线FPGA开发板.杜邦线 实验内容: 良好的文件夹设置以及工程管理是一个好的FPGA设计的基础,在学习之初就建立俩良好的习惯,会少走一些弯路.因此我们首先在新建的工程文件夹下面,分别建立如图2-1所示的子文件夹. 图2-1 FPGA工程子文件夹 上图中,prj为工程文件存放目录:rtl为verilog可综合代码存放目录:testbench

06-BCD计数器设计与应用——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:1.掌握BCD码的原理.分类以及优缺点 ???????? 2.设计一个多位的8421码计数器并进行验证 ???????? 3.学会基本的错误定位以及修改能力 ???? 实验平台:无 实验原理: ????BCD码(Binary-Coded Decimal)又被称为二进码十进数.二-十进制代码是一种十进制的数字编码,用4位二进制数来表示十进制数中的0~9个十个数之一.BCD编码又可以分成有权码和无权码两种,其中有权码如:8421码.2421码以及5421等

05-IP核应用之计数器——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯顿队长精心奉献 ? 实验目的:了解FPGA的IP核相关知识并以计数器IP核为例学会基本IP使用的流程 实验平台:无 实验原理: ????IP核(Intellectual Property core),也被称为知识产权核,其分为软核.硬核和固核.软核通常是与工艺无关.具有寄存器传输级硬件描述语言描述的设计代码,可以进行后续设计:硬核是前者通过逻辑综合.布局.布线之后的一系列工艺文件,具有特定的工艺形式.物理实现方式:固核则通常介于上面两者之间,它已经通过功能验证.时序分析等过程,设

10-8位7段数码管驱动实验——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的: 1.实现FPGA驱动数码管动态显示: 2.使用In system sources and probes editor工具,输入需要显示在数码管上的的数据,数码管显示对应数值. 实验平台:芯航线FPGA核心板.数码管_VGA_PS2模块 实验原理: ????电子设计系统中常用的显示设备有数码管.LCD液晶以及VGA显示器等.其中数码管又可分为段式显示(7段.米字型等)以及点阵显示(8*8.16*16等),LCD液晶的应用可以分为字符式液晶(1602.1

07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: ????阻塞赋值,操作符为"=","阻塞"是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行.而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量. ????非阻塞赋值,操作符为"<=","非阻塞"是指在进程语句(

关于按键消抖实验

对于特权同学按键消抖程序的理解:(程序源码见<深入浅出玩转FPGA>P191) 第一个always块中,在每个时钟周期(clk)对按键值进行采样 第二个always块中,利用边沿脉冲检测法,当key_rst有下降沿时,key-an将输出一个周期的高脉冲 第三个always块中,利用cnt进行循环计数(计数时间周期大约20ms),当keg-an为1时,cnt将清零,然后从零开始计数(由此产生一个20ms,从而消除抖动部分的影响) 第四个always块中,每当cnt从0计数到20'hfffff(即

单片机第7课:独立按键消抖程序

JP3连接P0口,数码管的VCC接+5V电源,JP5的8.1分别接P2.0和P2.1. #include<reg51.h> /* * 功能:独立按键消除抖动程序,按下KEY1,数值加1,按下KEY8,数值减去1 * */ #define uchar unsigned char #define uint unsigned int int num; uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80,