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

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

 

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

2.用模块化设计的方式实现每次按下按键04LED显示状态以二进制加法格式加1,每次按下按键14LED显示状态以二进制加法格式减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 功能仿真波形图

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

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

转载于:https://www.cnblogs.com/xiaomeige/p/5500968.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
01 试看小梅哥fpga设计思想验证方法视频:http://bbs.elecfans.com/jishu_484523_1_1.html 02 芯航线FPGA开发平台设计初衷:http://bbs.elecfans.com/jishu_514523_1_1.html 03 芯航线FPGA学习平台介绍:http://bbs.elecfans.com/jishu_514526_1_1.html 04 芯航线FPGA学习平台焊接记录:http://bbs.elecfans.com/jishu_514914_1_1.html 05 芯航线FPGA学习平台系统调试:http://bbs.elecfans.com/jishu_515169_1_1.html 06【连载视频教程(一)】科学的开发流程:http://bbs.elecfans.com/jishu_515340_1_1.html 07【连载视频教程(二)】3-8译码器设计验证:http://bbs.elecfans.com/jishu_515468_1_1.html 08【连载视频教程(三)】二进制计数器设计验证:http://bbs.elecfans.com/jishu_515476_1_1.html 09【连载视频教程(四)】高性能计数器IP核使用:http://bbs.elecfans.com/jishu_515714_1_1.html 10【连载视频教程(五)】BCD码计数器设计验证:http://bbs.elecfans.com/jishu_515893_1_1.html 11【连载视频教程(六)】例解阻塞赋值与非阻塞赋值:http://bbs.elecfans.com/jishu_516094_1_1.html 12【连载视频教程(七)】例说状态机:http://bbs.elecfans.com/jishu_516249_1_1.html 13【连载视频教程(八)】基于状态机的独立按键消抖:http://bbs.elecfans.com/jishu_516791_1_1.html 14【连载视频教程(九)】独立按键控制LED与亚稳态问题引入:http://bbs.elecfans.com/jishu_516795_1_1.html 15【连载视频教程(十)】数码管动态扫描设计与实现:http://bbs.elecfans.com/jishu_516979_1_1.html 16【连载视频教程(十一)】UART串口发送模块设计验证:http://bbs.elecfans.com/jishu_516984_1_1.html 17【连载视频教程(十二)】UART串口接收模块设计验证:http://bbs.elecfans.com/jishu_518308_1_1.html 18【芯航线FPGA学习平台众筹进度帖】芯航线FPGA开发板入手测试说明:http://bbs.elecfans.com/jishu_518301_1_1.html 19【芯航线FPGA学习平台众筹进度帖】芯航线FPGA学习套件配置文件固化教程 http://bbs.elecfans.com/jishu_518816_1_1.html 20【芯航线FPGA学习平台众筹进度帖】芯航线FPGA学习套件众筹回报已发放完毕,特公布运单号 http://bbs.elecfans.com/jishu_518819_1_1.html 21【芯航线FPGA学习平台众筹进度帖】芯航线FPGA学习套件众筹总结暨抽奖结果 http://bbs.elecfans.com/jishu_520454_1_1.html 22【芯航线FPGA学习平台众筹进度帖】【有奖活动】芯航线FPGA学习平台有奖活动第一季——看教程,秀笔记,赢好礼 http://bbs.elecfans.com/jishu_520463_1_1.html 23【连载视频教程(十三)】嵌入式块RAM应用之双口RAM:http://bbs.elecfans.com/jishu_520914_1_1.html 24【连载视频教程(十四)】搭建串口收发与存取双口RAM简易应用系统: http://bbs.elecfans.com/jishu_520915_1_1.html 25【连载视频教程(十五)】ROM的搭建与Signaltap II 工具使用:http://bbs.elecfans.com/jishu_522774_1_1.html 26【连载视频教程(十六)】FIFO介绍与时序验证:http://bbs.elecfans.com/jishu_522778_1_1.html 27【连载视频教程(十七)】使用PLL进行设计+Verilog参数化设计介绍: http://bbs.elecfans.com/jishu_524442_1_1.html 28【芯航线FPGA学习平台众筹进度帖】芯航线FPGA学习套件下载器驱动安装说明 http://bbs.elecfans.com/jishu_524793_1_1.html 29【芯航线FPGA学习平台众筹进度帖】Verilog语法基础讲解之参数化设计: http://bbs.elecfans.com/jishu_528770_1_1.html 30【连载视频教程(十八)】基于线性序列机设计思想的串行DAC(TLC5620)驱动: http://bbs.elecfans.com/jishu_533944_1_1.html 31【连载视频教程(十九)】基于线性序列机设计思想的串行ADC驱动: http://bbs.elecfans.com/jishu_537056_1_1.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值