艾米电子工作室—让开发变得更简单FPGA 入门系列实验教程——点亮LED1. 实验任务点亮发光二极管。
通过这个实验,熟悉并掌握CPLD/FPGA 开发软件QuartusII 的使用方法和开发流程以及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 硬件原理图艾米电子工作室—让开发变得更简单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 按位加1if(buffer==26'd2*******) //判别buffer 中的数值为25000000 时,//做输出处理beginled<=~led; // led[0]-led[7]反转一次。
buffer<=0;end艾米电子工作室—让开发变得更简单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)beginbuffer=buffer+1;if (buffer==26'd2*******) // 判别buffer 数值为25000000 时,做输出处理beginled_out=led_out<<1; // led 向左移位,空闲位自动添0 补位if(led_out==9'b000000000)led_out=9'b111111111;艾米电子工作室—让开发变得更简单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)beginbuffer<=buffer+1'b1;if(buffer==26'd2*******)beginled_out=led_out<<1;if(led_out==8'b00000000)led_out=8'b00000001;endendassign led=led_out;endmodule艾米电子工作室—让开发变得更简单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)begincase(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;艾米电子工作室—让开发变得更简单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_ledinput[7:0]key_in; //定义按键输入output[7:0]led; //定义led 输出reg[7:0]led; //定义寄存器reg[7:0]buffer;always@(key_in)beginbuffer=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; 艾米电子工作室—让开发变得更简单FPGA 入门系列实验教程——按键控制LED 亮灭1. 实验任务实现按键控制LED 亮灭。