4. 实验程序
module key_led(key_in,led); //模块名key_led input[7:0]key_in; //定义按键输入 output[7:0]led; //定义led 输出 reg[7:0]led; //定义寄存器 reg[7:0]buffer; always@(key_in) begin
buffer=key_in; case(buffer)
8'b11111110:led=8'b00000001; //是key1,则led1 亮
8'b11111101:led=8'b00000011; //是key2,则led1~ led2 亮 8'b11111011:led=8'b00000111; 8'b11110111:led=8'b00001111;
8'b11101111:led=8'b00011111; 艾米电子工作室—让开发变得更简单 http://www.amy-studio.com
FPGA 入门系列实验教程——按键控制LED 亮灭
1. 实验任务
实现按键控制LED 亮灭。通过这个实验,掌握采用Verilog HDL 语言编程实 现按键控制LED 亮灭方法。
2. 实验环境
硬件实验环境为艾米电子工作室型号EP2C8Q208C8 增强版开发套件。 软件实验环境为Quartus II 8.1 开发软件。
3. 实验原理
当独立按键key1 按下后,相应的LED 被点亮;再次按下后,LED 做翻转输 出,即LED 熄灭,从而实现按键控制LED 亮灭。本实验没有对按键做消抖 处理。
4. 实验程序
module key(rst_n,clk, key, led ); input rst_n; input clk; input key; output led;
reg led;
always @ ( posedge clk or negedge rst_n ) if ( !rst_n ) led<= 1'b0; else if ( !key) led<= ~led;
endmodule艾米电子工作室—让开发变得更简单 http://www.amy-studio.com
FPGA 入门系列实验教程——按键消抖控制LED 亮灭
1. 实验任务
实现按键控制LED 亮灭。通过这个实验,掌握采用Verilog HDL 语言编程实 现按键控制LED 亮灭及按键消抖方法。
2. 实验环境
硬件实验环境为艾米电子工作室型号EP2C8Q208C8 增强版开发套件。 软件实验环境为Quartus II 8.1 开发软件。
3. 实验原理
当独立按键key1 按下后,相应的LED 被点亮;再次按下后,LED 做翻 转输出,即LED 熄灭,从而实现按键控制LED 亮灭。本实验对按键进行了 消抖处理。
作为机械开关的按键,操作时,机械触点的弹性及电压突跳等原因,在 触点闭合或开启的瞬间会出现电压抖动,实际应用中如果不进行处理将会造 成误触发。按键去抖动的关键在于提取稳定的低电平状态,滤除前沿、后沿 抖动毛刺。按键消抖处理一般有硬件和软件两种方法。软件消抖是检测到有 触发后,延时一段时间后再检测触发状态,如果与之前检测到的状态相同,
则认为有按键按下;如果没有则认为是误触发。硬件就是加去抖电路。 艾米电子工作室FPGA 入门系列实验教程
FPGA 入门系列实验教程V1.0
前言
目前市场销售FPGA 开发板的厂商很多,但大多只提供些简单的代码,没有 详尽的文档和教程提供给初学者。经验表明,很多学生在学习FPGA 设计技术的 过程中,虽然刚开始学习热情很高,但真正坚持下来一直到“学会”的却寥寥无 几,除了学生个人毅力的因素外,另外一个更主要的原因就是所选的开发板缺少 配套的说明文档和手把手系列的入门教程。原本FPGA 的学习门槛相对于单片机
来说就高了不少,再加上缺少手把手系列教程资料,这就给初学者学习FPGA 增 添了更多的困难,很多初学者因为找不到入门的方法而渐渐失去了学习FPGA 的 兴趣和信心。
作者从接著到系统学习FPGA 有两年多的时间了,学习FPGA 的时间不长, 期间因为没有专业的老师指导,自己摸索学习FPGA 走了很多的弯路。有过问题 迎刃而解的快乐,也有过苦苦寻求结果和答案的痛苦历程,回想起自己学习
FPGA 的历程,从开始的茫然,到后来的疯狂看书,购买开发板,在开发板上练 习各种 FPGA 实例,到最后能独立完成项目,一路走来,感受颇多。发觉学习 FPGA 只要选择正确的方法是有捷径可走的,有很多人学习FPGA 很长时间, 因为没有找到正确的方法还是停留在入门阶段。
针对现状,作者从初学者的角度出发,结合作者学习FPGA 的经验和亲身体 会,遵循“宁可啰嗦一点,也不放过细节”的原则编写了详尽的实验教程作为艾 米电子工作室开发套件的配套教程使用,主要面向FPGA 初学者。FPGA 的学习 只有通过大量的操作与实践才能很好并快速的掌握。为此本实验教程从点亮LED 灯写起,深入浅出,以图文并茂的方式由易到难地列举了很多实例,采用手把手、 Step by Step 的方式让初学者以最快的方式掌握 FPGA 技术的开发流程以及
Quartus II 软件的使用,从而激起初学者学习FPGA 的兴趣。在教程中作者采用 “授人以渔”的方式,努力做到不仅讲述怎样进行试验,而且分析为什么这样做, 以便初学者深刻理解并快速掌握FPGA 的学习方法。
本实验教程的所有实例均在艾米电子工作室开发套件上验证通过,本教程虽 然简单但编写也花费了作者大量的时间和精力,对于转载需要注明出处:
http://www.amy-studio.com (艾米电子工作室作者:静水流深),并未经艾米电子 工作室同意不得用于其他商业用途。
FPGA 技术是不断发展变化的,要掌握FPGA 技术的精髓,需要设计者在实 践中不懈地摸索与积累,逐步提高自己的设计水平,本实验教程试图对初学者起 到快速入门的作用。但由于作者学习FPGA 时间不长,水平有限,错漏和不严谨 之处在所难免,欢迎大家批评指正。并请您将阅读中发现的错误或建议发送到作 者Email:zhoujie9220@163.com,以使本教程不断地完善。
艾米电子工作室—让开发变得更简单 http://www.amy-studio.com
FPGA 入门系列实验教程——数码管静态显示
1. 实验任务
实现开发板上的数码管静态循环显示0~F。通过这个实验,掌握采用Verilog HDL 语言编程实现7 段数码管显示译码器的方法。
2. 实验环境
硬件实验环境为艾米电子工作室型号EP2C8Q208C8 增强版开发套件。
软件实验环境为Quartus II 8.1 开发软件。
3. 实验原理
数码管LED 显示是工程项目中使用较广的一种输出显示器。常见的数码管有 共阴和共阳两种。艾米电子工作室开发套件上采用的是共阳极数码管,共阳 数码管就是8 个发光二极管的阳极连接在一起作为公共端。公共端常称为位 码,而将其他八位称为段码。本实验先将板载50M 时钟源进行24 次分频, 然后将分频后的频率作为四位计数器的时钟脉冲信号,使其计数循环输出 0~F,最后经Verilog HDL 编写的译码模块译码后显示于数码管上。
4. 实验程序
module led_display(sm_seg,sm_bit,clk,); input clk;
output [7:0] sm_seg; //数码管段码输出 output [7:0] sm_bit; //数码管位码输出
reg [7:0] sm_seg; //数码管段码输出寄存器 reg [7:0] sm_bit; //数码管位码输出寄存器 reg [3:0] disp_dat; //显示数据寄存器 reg [36:0] count; //定义计数寄存器 always @ (posedge clk ) begin
count = count + 1'b1; sm_bit = 8'b00000000;
end艾米电子工作室—让开发变得更简单 http://www.amy-studio.com
FPGA 入门系列实验教程——数码管动态显示
1. 实验任务
实现开发板上8 个数码管动态显示0~7。通过这个实验,掌握采用Verilog HDL 语言编程实现7 段数码管显示译码器以及数码管动态扫描显示的方法。
2. 实验环境
硬件实验环境为艾米电子工作室型号EP2C8Q208C8 增强版开发套件。 软件实验环境为Quartus II 8.1 开发软件。
3. 实验原理
由于LED静态显示需要占用较多的I/O口,且功耗较大,因此在大多数场合通 常不采用静态显示,而采用动态扫描的方法来控制LED数码管的显示。动态 显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位
数码管有效。点亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各 位数码管送出字形码和相应的位选,只要扫描显示速度够快,利用发光管的 余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态 显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示 电路中的。动态扫描显示时刷新频率最好大于50HZ,即没显示一轮的时间不 超过20ms,每个数码管显示时间不能太长也不能太短,时间太长会影响刷新 率,导致总体显示呈现闪烁的现象,时间太短发光二极管的电流导通时间也 就短,会影响总体的显示亮度。一般控制在1ms左右最佳。
4. 实验程序
module scan_led(clk,rst,sm_seg,sm_bit); input clk,rst;
output[7:0] sm_seg; //数码管段选择输出 output[7:0] sm_bit; //数码管位选择输出
reg[7:0] sm_seg; //数码管段选择输出寄存器 reg[7:0] sm_bit; //数码管位选择输出寄存器