FPGA入门实验教程 适合初学者

更新时间:2023-12-19 10:06:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

艾米电子工作室—让开发变得更简单 http://www.amy-studio.com

FPGA 入门系列实验教程——点亮LED

1. 实验任务

点亮发光二极管。通过这个实验,熟悉并掌握CPLD/FPGA 开发软件Quartus II 的使用方法和开发流程以及Verilog HDL的编程方法。

2. 实验环境

硬件实验环境为艾米电子工作室型号EP2C5T144 开发套件。 软件实验环境为Quartus II 8.1 开发软件。

3. 实验原理

FPGA 器件同单片机一样,为用户提供了许多灵活的独立的输入/输出I/O 口 (单元)。FPGA 每个I/O 口可以配置为输入、输出、双向、集电极开路和三态 门等各种组态。作为输出口时,FPGA 的I/O 口可以吸收最大为24mA 的电流, 可以直接驱动发光二极管LED 等器件。图1. 1 为8 个发光二极管硬件原理图, 本原理图对应艾米电子工作室型号为EP2C5T144 FPGA 开发板及接口板。通过 原理图可知如果要点亮这八个LED,所以只要正确分配并锁定引脚后,在相应 的引脚上输出相应高电平“1”,就可实现点亮该发光二极管的功能。本工作室开 发板均采用输出“1”点亮LED 的模式,以后就不再另作说明。

图1. 1 发光二极管LED 硬件原理图

艾米电子工作室—让开发变得更简单 http://www.amy-studio.com

FPGA 入门系列实验教程——LED 闪烁灯

1. 实验任务

让实验板上的8 个LED 周期性的闪烁。通过这个实验,熟悉并掌握采用计数 与判断的方式来实现分频的Verilog HDL 的编程方法以及Quartus II 软件的使 用方法和开发流程。

2. 实验环境

硬件实验环境为艾米电子工作室型号EP2C8Q208 增强版开发套件。 软件实验环境为Quartus II 8.1 开发软件。

3. 实验原理

艾米电子工作室开发套件板载50MHz 的时钟源,假如我们直接把它输入

到发光二极管LED,由于人眼的延迟性,我们将无法看到LED 闪烁,认为

它一直亮着。如果我们期望看到闪烁灯,就需要将时钟源的频率降低后再输

出。本实验采用计数与判段的方式来实现降低时钟源的频率。计数电路可用 计数器实现,每来一个时钟脉冲CLK,计数器就加1,而每当判断出计数器 达到某个数值时,把输出状态求反,就使得8 个LED 的亮灭反转一次,即: 周期性的输出高电平“1”和低电平“0”。这样设计相当于把50MHz 的时钟 源分频后输出。如果最终要使得LED 1S 闪烁一次,即输出1Hz 的时钟脉冲, 让计数器计到25000000 便可以让LED 亮0.5 秒、灭0.5 秒。

4. 实验程序

module led1 (clk ,led); // 模块名及端口参数 input clk; // 输入端口定义 output [7:0]led; // 输出端口定义

reg [7:0]led; // 输出端口定义为寄存器型

reg [25:0] buffer; // 中间变量buffer 定义为寄存器型 always@(posedge clk)

begin // 顺序语句,到end 止 buffer<=buffer+1; // 计数器buffer 按位加1

if(buffer==26'd25000000) //判别buffer 中的数值为25000000 时, //做输出处理 begin

led<=~led; // led[0]-led[7]反转一次。 buffer<=0; end

艾米电子工作室—让开发变得更简单 http://www.amy-studio.com

FPGA 入门系列实验教程——LED 流水灯

1. 实验任务

让实验板上的8 个LED 实现流水灯的功能。通过这个实验,进一步掌握采用 计数与判断的方式来实现分频的Verilog HDL 的编程方法以及移位运算符的 使用。

2. 实验环境

硬件实验环境为艾米电子工作室型号EP2C8Q208C8 增强版开发套件。 软件实验环境为Quartus II 8.1 开发软件。

3. 实验原理

流水灯,顾名思义就是让LED 象水一样的点亮。如果把流水做慢动作播放, 可以想象到其实就是移动,即:把水块不断地向同一方向移动,而原来的水块保 持不动,就形成了流水。同样,如果使得最左边的灯先亮;然后,通过移位,在 其右侧的灯,由左向右依次点亮,而已经亮的灯又不灭,便形成了向右的流水灯。 初始状态时,8 个灯都不亮。每来一个时钟脉冲CLK,计数器就加1。每当判断

出计数器中的数值达到25000000 时,就会点亮一个灯,并进行移位。FPGA 输出 的数据就应该首先是 10000000,隔 1 秒钟变成 11000000??一直变化到

11111111,这样,依次点亮所有的灯,就形成了流水灯。而当8 个灯都点亮时, 需要一个操作使得所有的灯恢复为初始状态,即:灯都不亮。然后,再一次流水 即可。如果是右移位,就出现向右流水的现象;反之,向左流水。

4. 实验程序

module ledwater(clk,led); // 模块名及端口参数 output [7:0] led; // 输出端口定义

input clk; // 输入端口定义,50M 时钟 reg[8:0] led_out; // 变量led_out 定义为寄存器型 reg[8:0] led_out1; // 变量led_out1 定义为寄存器型 reg[25:0]buffer; // 中间变量buffer 定义为寄存器型 always@(posedge clk) begin

buffer=buffer+1;

if (buffer==26'd25000000) // 判别buffer 数值为25000000 时,做输出处理 begin

led_out=led_out<<1; // led 向左移位,空闲位自动添0 补位 if(led_out==9'b000000000) led_out=9'b111111111;

艾米电子工作室—让开发变得更简单 http://www.amy-studio.com

FPGA 入门系列实验教程——LED 跑马灯

1. 实验任务

让实验板上的8 个LED 实现跑马灯的功能。通过这个实验,进一步掌握采用 计数与判断的方式来实现分频的Verilog HDL 的编程方法以及移位运算符的 使用。

2. 实验环境

硬件实验环境为艾米电子工作室型号EP2C8Q208C8 增强版开发套件。 软件实验环境为Quartus II 8.1 开发软件。

3. 实验原理

从LED[0]到LED[7]依次点亮,第二个灯点亮时第一个熄灭,每个灯交换的

时间为0.5S;看上去的效果就象一个亮点从LED[0] 跑向LED[7],然后重复此循

环,故命名跑马灯。初始状态时,LED[0]亮,其余熄灭。每来一个时钟脉冲CLK, 计数器就加1。每当判断出计数器中的数值达到25000000时,就会点亮LED[1],

同时LED[0]熄灭,并进行移位。这样,依次点亮所有的灯,就形成了跑马灯。而 当LED[7]点亮时,需要一个操作使得恢复为初始状态,即:LED[0]亮,其余熄 灭。然后,再进行一次跑马灯,重复此循环。如果是右移位,就出现向右跑马的 现象;反之,向左跑马。

4. 实验程序

module ledwalk(led,clk); input clk;

output [7:0] led; reg[7:0]led_out; reg[25:0]buffer;

always@(posedge clk) begin

buffer<=buffer+1'b1; if(buffer==26'd25000000) begin

led_out=led_out<<1;

if(led_out==8'b00000000) led_out=8'b00000001; end end

assign led=led_out;

endmodule

艾米电子工作室—让开发变得更简单 http://www.amy-studio.com

FPGA 入门系列实验教程——LED 花样彩灯

1. 实验任务

让实验板上的8 个LED 实现花样彩灯的功能。通过这个实验,进一步掌握采 用计数器实现分频的Verilog HDL 的编程方法以及case 语句的使用。

2. 实验环境

硬件实验环境为艾米电子工作室型号EP2C8Q208C8 增强版开发套件。 软件实验环境为Quartus II 8.1 开发软件。

3. 实验原理

本次试验是对前几个实验的总结,让LED逐步实现闪烁—流水灯—闪烁—跑 马灯—闪烁—对灯流水—闪烁,重复此循环即可实现彩灯显示功能。本次实验程 序采用case语句编写,程序比较通俗易懂,具体实现原理在前面实验都已详细讲 述,本次试验将不再重复。

4. 实验程序

module led_run(sys_clk,led); input sys_clk; output [7:0] led; reg [7:0] led; reg [24:0] count; reg [4:0] state; wire clk;

always @ (posedge sys_clk) count<=count+1'b1; assign clk=count[23];

always @ (posedge clk) begin case(state)

5'b00000: led=8'b11111111; 5'b00001: led=8'b00000000; 5'b00010: led=8'b10000000; 5'b00011: led=8'b11000000; 5'b00100: led=8'b11100000; 5'b00101: led=8'b11110000;

艾米电子工作室—让开发变得更简单 http://www.amy-studio.com

FPGA 入门系列实验教程——读取按键信号

1. 实验任务

通过开发板上的8 个按键控制发光二极管led1~led8 显示。通过这个实验,进 一步掌握case 语句的编程方法及FPGA I/O 口的输出控制。

2. 实验环境

硬件实验环境为艾米电子工作室型号EP2C8Q208C8 增强版开发套件。 软件实验环境为Quartus II 8.1 开发软件。

3. 实验原理

FPGA的所有I/O 控制块允许每个I/O 引脚单独配置为输入口,不过这种 配置是系统自动完成的。当该I/O 口被设置为输入口使用时,该I/O 控制模 块将直接使三态缓冲区的控制端接地,使得该I/O 对外呈高阻态,这样该I/O 引脚即可用作输入引脚使用。正确分配并锁定引脚后,一旦key1~key8 中有 键输入,即可在检测到按键输入的情况下,继续判断其键值并作出相应的处 理。如key4 按下,则发光二极管led1~led4 亮。

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; //数码管位选择输出寄存器

本文来源:https://www.bwwdw.com/article/84x5.html

Top