FPGA入门实验教程 适合初学者
- 格式:doc
- 大小:72.50 KB
- 文档页数:10
实验一组合逻辑3-8译码器的设计 .................... 错误!未定义书签。
实验二基于FPGA的数字钟的设计 ................... 错误!未定义书签。
实验三基于NIOS的交通灯实验 .......................... 错误!未定义书签。
实验四静态图像显示 ............................................. 错误!未定义书签。
实验一组合逻辑3-8译码器的设计一、实验目的:1、通过3-8译码器的设计,让学生掌握组合逻辑电路的设计方法。
2、掌握组合逻辑电路的静态测试方法。
3、初步了解可编程器件设计的全过程。
二、实验步骤:1、打开QuartusII软件。
2、选择路径。
选择File/New Project Wizard,指定工作目录,指定工程和顶层设计实体称;注意:工作目录名不能有中文。
3、添加设计文件。
将设计文件加入工程中。
单击“Next”,如果有已经建立好的VHDL 或者原理图等文件可以在File name中选择路径然后添加,或者选择Add All添加所有可以添加的设计文件(.VHDL ,.Verilog原理图等)。
如果没有直接点击“Next”,等建立好工程后再添加也可,这里我们暂不添加。
4、选择FPGA器件。
Family选择Cyclone II,Available device选EP2C35F484C8,Packge选择Any,Pin Count 选择484,Speed grade选择Any;点击“Next”。
5、选择外部综合器、仿真器和时序分析器。
Quartus II支持外部工具,可通过选中来指定工具的路径。
这里我们不做选择,默认使用Quartus II自带的工具。
6、结束设置。
单击“Next”,弹出“工程设置统计”窗口,上面列出了工程的相关设置情况。
最后单击“Finish”,结束工程设置。
7、建立原理图文件。
Verilog及Xilinx_FPGA⼊门(⼀)⼀、流⽔灯实验;⼀、FPGA的⼯作是基于时钟的,语⾔中⼏乎每处都⽤到了always@(posedge clk),意思是clk上升沿触发⼯作,之后执⾏其下的语句。
⼆、<=⾮阻塞语⾔,并⾏⽅式三、FPGA基本⼯作原理基于LUT查表,查表这也是⼀种特别重要的编程思想,下⾯的流⽔灯实现(⼆)差不多就是这种思想。
(1)实现(⼀)module liushuideng(input clk,input rst,output reg[7:0] led=8'b00000001;);reg[31:0] cnt=0;always@(posedge clk or negedge rst)if(!rst) begin //rst按键按下为低电平led<=8'b00000001;cnt<=0;end else beginif(cnt==32'd100000000) //假如时钟为100MHz 那么32‘d100000000代表1秒钟beginled<={led[6:0],led[7]}; //⾼电平代表点亮灯,实现循环左移位cnt<=0;end else begincnt<=cnt+1;endend(2)实现(⼆)module liushuideng(input clk,input rst,output reg[7:0] led=8'b00000001;);reg[31:0] cnt=0;always@(posedge clk or negedge rst)if(!rst) begin //rst按键按下为低电平led<=8'b00000001;cnt<=0;end else beginif(cnt==32'd800000000)begincnt<=0; //cnt==32'd800000000时重新复位为0end else begincnt<=cnt+1;//每当时钟沿到来时 cnt⾃加1endcase(cnt)32'd800000000:led<=8'b10000000; //cnt为800000000时led==8‘d1*******(8代表位宽//缺省为最⼤位宽)32'd700000000:led<=8'b01000000;32'd600000000:led<=8'b00100000;32'd500000000:led<=8'b00010000; 32'd400000000:led<=8'b00001000; 32'd300000000:led<=8'b00000100; 32'd200000000:led<=8'b00000010; 32'd100000000:led<=8'b00000001;default:;endend。
基于DE2-115开发板的FPGA入门设计实验1、Lab1: 4位加法器、减法器的设计1.1 摘要在文件add_sub里面的工程文件operation_4.v为顶层文件,该顶层文件包含了三个子模块,分别为数码管显示模块,4位带进位的二进制加法器模块和4位带借位的二进制减法器模块,最后通过DE2-115开发板显示实验结果。
1.2 程序1)add_4bits.v 加法器module adder_4bits(input clk,input rst_n,input [3:0] x,input [3:0] y,output reg [3:0] sum,output reg carry_out //溢出位);always@(posedge clk or negedge rst_n)beginif(!rst_n){carry_out, sum} <= 0;else{carry_out, sum} = x + y;endendmodule2)substractor_4bits.v减法器module subtractor_4bits(input clk,input rst_n,input [3:0] x,input [3:0] y,output r eg [3:0] sub,output r eg borrow_out);always@(posedge clk or negedge rst_n) beginif(!rst_n){borrow_out, sub} <= 0;elsebeginif(x >= y){borrow_out, sub} = {1'b0, x - y};else{borrow_out, sub} = {1'b1, x - y};endendendmodule3)seg7_lut.v 数码管显示译码模块module Seg7_lut(input [3:0] iDIG,output r eg [6:0] oSEG);always @(iDIG)begincase(iDIG)4'h1: oSEG = 7'b1111001; // ---t----4'h2: oSEG = 7'b0100100; // | |4'h3: oSEG = 7'b0110000; // lt rt4'h4: oSEG = 7'b0011001; // | |4'h5: oSEG = 7'b0010010; // ---m----4'h6: oSEG = 7'b0000010; // | |4'h7: oSEG = 7'b1111000; // lb rb4'h8: oSEG = 7'b0000000; // | |4'h9: oSEG = 7'b0011000; // ---b----4'ha: oSEG = 7'b0001000;4'hb: oSEG = 7'b0000011;4'hc: oSEG = 7'b1000110;4'hd: oSEG = 7'b0100001;4'he: oSEG = 7'b0000110;4'hf: oSEG = 7'b0001110;4'h0: oSEG = 7'b1000000;endcaseendendmodule1.3 结果本设计通过Verilog HDL硬件描述语言。
FPGA入门系列实验教程——按键消抖控制LED亮灭1.实验任务实现按键控制LED亮灭。
通过这个实验,掌握采用Verilog HDL语言编程实现按键控制LED亮灭及按键消抖方法。
2.实验环境硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。
软件实验环境为Quartus II8.1开发软件。
3.实验原理当独立按键key1按下后,相应的LED被点亮;再次按下后,LED做翻转输出,即LED熄灭,从而实现按键控制LED亮灭。
本实验对按键进行了消抖处理。
作为机械开关的按键,操作时,机械触点的弹性及电压突跳等原因,在触点闭合或开启的瞬间会出现电压抖动,实际应用中如果不进行处理将会造成误触发。
按键去抖动的关键在于提取稳定的低电平状态,滤除前沿、后沿抖动毛刺。
按键消抖处理一般有硬件和软件两种方法。
软件消抖是检测到有触发后,延时一段时间后再检测触发状态,如果与之前检测到的状态相同,则认为有按键按下;如果没有则认为是误触发。
硬件就是加去抖电路。
4.实验程序module key_debounce(rst_n,clk,key,led);input rst_n;input clk;input key;output led;//通过降采样对key的输入做低通滤波,将其高频分量滤除,得到low_sw值reg[17:0]cnt;always@(posedge clk)if(!rst_n)cnt<=18'd0;elsecnt<=cnt+1'b1;wire sample_pulse=cnt==18'h3ffff;reg low_sw;always@(posedge clk)if(!rst_n)low_sw<=1'b1;else if(sample_pulse)low_sw<=key;//在整个low_sw(active_low)有效过程中取一个控制量作为led的控制信号//本实例中使用low_sw的下降沿reg low_sw_r;//将low_sw信号锁存一个时钟周期,延时不是真的“锁存”always@(posedge clk)low_sw_r<=low_sw;wire led_ctrl=low_sw_r&(!low_sw);reg led;always@(posedge clk or negedge rst_n)if(!rst_n)led<=1'b0;else if(led_ctrl)led<=~led;endmodule5.实验步骤(1)建立新工程项目:打开Quartus II软件,进入集成开发环境,点击File→New project wizard建立一个工程项目key_debounce。
FPGA入门系列实验教程——数码管动态显示FPGA(Field-Programmable Gate Array)是一种可编程逻辑设备,它可以通过编程的方式实现各种数字逻辑电路的功能。
在FPGA入门的过程中,了解如何使用数码管进行动态显示是一项非常基础而重要的实验。
本文将向读者介绍如何使用FPGA实现数码管的动态显示,并提供相关的实验教程。
一、实验目的本实验的目的是通过FPGA控制数码管以一定的时间间隔显示不同的数字或字符。
通过本实验的学习,读者可以了解到FPGA的编程方式和数码管的控制原理,并初步掌握FPGA的基本应用。
二、实验材料和准备1. FPGA开发板(如Xilinx Spartan系列)2.七段数码管模块3.连接线三、实验步骤1.搭建电路连接将开发板上的数码管模块通过连接线与FPGA的GPIO引脚相连接,确保连接正确无误。
2.创建工程打开FPGA开发环境(如Xilinx ISE),创建一个新的工程。
3.编写代码在创建的工程中,通过HDL语言(如Verilog或VHDL)编写数码管控制的代码。
以下是一个简单的Verilog代码示例:module seven_segment_displayinput wire clk,output wire [6:0] seg,output wire [3:0] anreg [23:0] count;reg [3:0] digit;reg [6:0] segment;count <= count + 1;digit <= 0;digit <= 1;digit <= 2;digit <= 3;count <= 0;endendassign seg = segment;assign an = digit;endmodule以上代码实现了数码管的动态显示功能。
其中,clk为时钟信号,seg为七段数码管的引脚,an为数码管的位选引脚。
FPGA及其应用实验指导书前言近些年来,FPGA技术发展迅速。
一方面,各种大容量、高性能、低功耗的FPGA器件不断推出,使得专用集成电路(ASIC)的生产商感受到空前的竞争压力。
另一方面,出现了许多FPGA设计辅助工具,这些工具大大提高了新型集成电路的设计效率,使更低成本、更短周期的复杂数字系统开发成为可能。
于是一场ASIC与FPGA之争在所难免。
然而FPGA器件具有先天的竞争优势,那就是可以反复编程,在线调试。
FPGA仿真技术正是这场较量的推动引擎之一。
一般来说,FPGA仿真技术就是以计算机为平台,以FPGA仿真软件工具为开发环境,以HDL为设计语言,以FPGA芯片为目标器件,以电子系统设计为应用方向的电子产品自动化设计过程。
设计者只需编写硬件描述语言代码,然后选择目标器件,在集成开发环境里进行编译,仿真,综合,最后在线下载调试。
整个过程,大部分工作由FPGA设计软件完成。
全球许多著名的可编程器件提供商都推出了自己的集成开发工具软件,如Altera公司的QuartusⅡ软件;Xilinx公司的ISE软件等。
这些软件的推出,极大地促进了集算法设计、芯片编程、电路板设计于一体的新型电子系统技术的发展。
另外,在以SOC芯片为目标器件的电子系统设计要求下,可编程器件的内部开始集成高速的处理器硬核、处理器软核、DSP模块、大量的存储资源、高速的串行收发模块、系统时钟管理器、多标准的I/O接口模块,亦使得设计者更加得心应手,新一轮的数字革命由此引发。
FPGA技术是一门实践性很强的学科,要培养出具有竞争力的一流IC设计人才,动手能力是关键。
只有通过理论学习,加上现场实验,在使用软件编程加硬件调试的过程中真正获得锻炼,增长技能。
UP2实验系统采用灵活结构,可方便进行基于CPLD/FPGA芯片的实验开发,并易于升级,符合当前高校在此方面对人才培养的要求。
我们相信,只要学生扎扎实实完成本实验系统的所有实验,并在此基础上利用现有硬件资源开发出新的数字应用系统,学生的潜力会得到最大程度的发挥,对FPGA技术的学习也会有质的飞跃,从而为推动我国数字系统设计技术的发展做出更大的贡献。
FPGA入门教程FPGA入门教程1.数字电路设计入门2.FPGA简介3.FPGA开发流程4.RTL设计5.QuartusⅡ设计实例6.ModelSim和Testbench1.数字电路设计入门1.1数字电路设计数字电路设计的核心是逻辑设计。
通常,数字电路的逻辑值只有‘1’和‘0’,表征的是模拟电压或电流的离散值,一般‘1’代表高电平,‘0’代表低电平。
高低电平的含义可以理解为,存在一个判决电平,当信号的电压值高于判决电平时,我们就认为该信号表征高电平,即为‘1’。
反之亦然。
当前的数字电路中存在许多种电平标准,比较常见的有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVDS、HSTL、SSTL等。
这些电平的详细指标请见《补充教程1:电平标准》。
数字电路设计大致可分为组合逻辑电路和时序逻辑电路。
一般的数字设计的教材中对组合逻辑电路和时序逻辑电路的定义分别为:组合逻辑电路的输出仅与当前的输入有关,而时序逻辑电路的输出不但与输入有关,还和系统上一个状态有关。
但是在设计中,我们一般以时钟的存在与否来区分该电路的性质。
由时钟沿驱动工作的电路为时序逻辑电路。
大家注意,这两种电路并不是独立存在的,他们相互交错存在于整个电路系统的设计中。
1.1.1组合逻辑电路组合逻辑电路由任意数目的逻辑门电路组成,一般包括与门、或门、非门、异或门、与非门、或非门等。
一般的组合逻辑电路如下图:其中A,B,C,D,E,F为输入,G为输出。
1.1.2时序逻辑电路时序逻辑电路由时钟的上升沿或下降沿驱动工作,其实真正被时钟沿驱动的是电路中的触发器(Register),也称为寄存器。
触发器的工作原理和参数如下图:Register的原理和参数DClkQDQClktc-qtholdTtsutsu:建立时间,在时钟有效沿到来之前触发器数据输入应保持稳定的时间,如果建立时间不够,数据将不能在这个时钟沿被打入触发器。
它间接约束了组合逻辑的最大延时。
FPGA入门系列实验教程——LED流水灯1.实验任务让实验板上的8个LED实现流水灯的功能。
通过这个实验,进一步掌握采用计数与判断的方式来实现分频的VHDL的编程方法以及移位运算符的使用。
2.实验环境硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。
软件实验环境为Quartus II8.1开发软件。
3.实验原理流水灯,顾名思义就是让LED象水一样的点亮。
如果把流水做慢动作播放,可以想象到其实就是移动,即:把水块不断地向同一方向移动,而原来的水块保持不动,就形成了流水。
同样,如果使得最左边的灯先亮;然后,通过移位,在其右侧的灯,由左向右依次点亮,而已经亮的灯又不灭,便形成了向右的流水灯。
初始状态时,8个灯都不亮。
每来一个时钟脉冲CLK,计数器就加1。
每当判断出计数器中的数值达到25000000时,就会点亮一个灯,并进行移位。
FPGA输出的数据就应该首先是10000000,隔1秒钟变成11000000……一直变化到11111111,这样,依次点亮所有的灯,就形成了流水灯。
而当8个灯都点亮时,需要一个操作使得所有的灯恢复为初始状态,即:灯都不亮。
然后,再一次流水即可。
如果是右移位,就出现向右流水的现象;反之,向左流水。
4.实验程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity LED isport(clk:in std_logic;//设置时钟输入dout:out std_logic_vector(7downto0));//8位端口输出end LED;architecture behave of LED issignal p:std_logic_vector(31downto0);//信号变量signal t:std_logic_vector(8downto0);beginprocess(clk)beginif(clk'event and clk='1')then//判断上升沿信号p<=p+1;if(p=25000000)thent(8downto1)<=t(7downto0);//将低8位移至高8位t(0)<='1';//最地位置1p<="00000000000000000000000000000000";end if;if(t(8)='1')thent<="000000000";end if;end if;end process;dout<=t(7downto0);//将低8位赋给输出端口end behave;代码分析:先定义一个二进制32位的信号变量P和一个9位的信号变量t,时钟每产生一个上升沿的时钟跳变,P自动加1。
FPGA入门及Quartus II使用教程FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在可编程阵列逻辑PAL(Programmable Array Logic)、门阵列逻辑GAL(Gate Array Logic)等可编程器件的基础上上进一步发展的产物。
可以这样讲,ASIC(内部的所有资源,是Application Specific Integrated Circuit )用积木堆积起来的小房子,可以是一个欧美风情的房子,还可以是一个北京四合院…….而FPGA内部就可以说是一个个小积木,也就是内部有大量的资源提供给我们,根据我们的需求进行内部的设计。
并且可以通过软件仿真,我们可以事先验证设计的正确性。
第一章 FPGA的基本开发流程下面我们基于Altera 公司的QuantusII 软件来说明FPGA 的开发流程。
下图是一个典型的基于Quartus II的FPGA开发整体流程框图。
1、建立工程师每个开发过程的开始,Quartus II以工程为单位对设计过程进行管理。
2、建立顶层图。
可以这样理解,顶层图是一个容器,将整个工程的各个模块包容在里边,编译的时候就将这些模块整合在一起。
也可以理解为它是一个大元件,比如一个单片机,内部包含各个模块,编译的时候就是生成一个这样的大元件。
3、采用ALTERA公司提供的LPM功能模块。
Quartus软件环境包含了大量的常用功能模块,比如计数器、累加器、比较器等等。
4、自己建立模块。
由于有些设计中现有的模块功能不能满足具体设计的要求,那就只能自己设计。
使用硬件描述语言,当然也可以用原理图的输入方法,可以独立的把它们当成一个工程来设计,并且生成一个模块符号(Symbol),类似于那些LPM功能模块。
这里可以理解为,如果我们需求的滤波器,没有现成的合适的,那我们可以通过LC自己来搭建一个滤波器。
5、将顶层图的各个功能模块连线起来。
实验二 7段数码管实验以及仿真设置一. 实验目的1. 进一步了解FPGA的设计流程和加深对QII的使用。
2. 学习和了解动态扫描数码管的工作原理的程序设计方法。
3. 加强和熟悉VHDL语言的设计方法和特点,学会掌握常用的 计数器,译码器的设计,功能宏模块使用方法。
4. 学习使用QII中的仿真功能。
二. 实验原理1、管脚映射:略(参考例子)2、开发板上使用了一个4位联体的共阳极7段数码管,动态扫描显示接口是数码管应用最为广泛的一种显示方式之一。
其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O 线控制。
CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就可以自行决定何时显示哪一位了。
而所谓动态扫描就是指我们采用分时的方法,轮流控制各个数码管的COM端,使各个LED轮流点亮。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的,但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上每个显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
4位7段共阳数码管参考图三. 实验步骤本实验要实现一个增加的数在数码管上显示。
1. 设计主电路模块在QII中新建一个工程,本实验开发板为例。
先建一个顶层图,另存为seg7led.bdf(与所在文件夹名相同).再新建一个.V文件,另存为segmain.v(必需与程序中的模块名 module “segmain“相同,如两处蓝色字体指出的名字必需相同)。
输入以下程序(Verilog以及VHDL程序可以参考光盘中例子):module segmain(clk,reset_n,datain,seg_data,seg_com);input clk;input reset_n;input [15:0] datain;output [7:0]seg_data;output [3:0]seg_com;reg [3:0]seg_com;reg [7:0]seg_data;reg [3:0]bcd_led;reg [36:0]count;always @(posedge clk)beginif(!reset_n)count<=0;elsecount=count+1;endalways @(count[14:13] or datain)begincase(count[14:13])2'b00:beginbcd_led =datain[3:0];seg_com =4'b1110; //低有效end2'b01:beginbcd_led=datain[7:4];seg_com=4'b1101;end2'b10:beginbcd_led=datain[11:8];seg_com=4'b1011;end2'b11:beginbcd_led=datain[15:12];seg_com=4'b0111;endendcaseendalways @(seg_com or bcd_led)begincase(bcd_led)4'h0:seg_data=8'hc0;// 0 //共阳,低有效4'h1:seg_data=8'hf9;// 14'h2:seg_data=8'ha4;// 24'h3:seg_data=8'hb0;// 34'h4:seg_data=8'h99;// 44'h5:seg_data=8'h92;// 54'h6:seg_data=8'h82;// 64'h7:seg_data=8'hf8;// 74'h8:seg_data=8'h80;// 84'h9:seg_data=8'h90;// 94'ha:seg_data=8'h88;// A4'hb:seg_data=8'h83;// b4'hc:seg_data=8'hc6;// c4'hd:seg_data=8'ha1;// D4'he:seg_data=8'h86;// E4'hf:seg_data=8'h8e;// Fdefault:seg_data=8'hc0;endcaseendendmodule2. 开始分析综合这个模块注意:开始分析综合前要把当前要编译的模块设成顶层实体后再开始。
0基础小白如何制定fpga学习计划在当今科技日新月异的时代,硬件编程越来越受到重视,FPGA(Field-Programmable Gate Array)作为一种可编程的逻辑芯片,在各种应用领域都有着广泛的应用。
而对于0基础小白而言,想要学习FPGA编程可能会感到困惑和迷茫。
因此,本文将为0基础小白制定一份FPGA学习计划,帮助他们逐步掌握FPGA编程的相关知识和技能。
第一阶段:入门基础1.了解FPGA的基本概念FPGA是一种可编程逻辑芯片,它可以通过编程来实现不同的逻辑功能。
小白需要了解FPGA的基本原理和结构,包括FPGA的硬件资源、布线和时序控制等方面的知识。
2.学习Verilog或VHDL语言Verilog和VHDL是FPGA编程的两种主流语言,小白可以选择其中一种语言进行学习。
通过学习Verilog或VHDL语言,理解逻辑门、组合逻辑、时序电路等基本概念,并能够编写简单的逻辑电路代码。
3.掌握常用的FPGA开发工具在学习FPGA编程过程中,开发工具是必不可少的。
小白可以选择常用的FPGA开发工具,如Quartus、Vivado等,并学习其基本操作和使用方法。
第二阶段:深入学习1.学习FPGA的高级应用除了基本的逻辑设计外,FPGA还可以应用在数字信号处理、通信系统、图像处理等领域。
小白可以学习FPGA的高级应用,了解FPGA在各个领域的具体应用场景和实现方法。
2.了解FPGA的硬件架构FPGA的硬件架构包括逻辑单元、存储单元、时序控制等部分,小白可以深入学习FPGA的硬件架构,理解FPGA内部的工作原理和结构。
3.实践项目通过实践项目,小白可以将理论知识与实际应用相结合,提高自己的编程能力。
可以选择一些简单的FPGA项目,如LED灯控制、数码管显示、信号发生器等,逐步提高自己的编程和调试能力。
第三阶段:提升水平1.参加FPGA竞赛或比赛参加FPGA竞赛或比赛是一个锻炼自己的好机会,通过参加比赛,小白可以将自己的FPGA编程能力与他人进行比拼,在竞赛中学习和提高。
艾米电子工作室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的学习方法。
FPGA基本教程第一节 FPGA的基本开发流程PLD是可编程逻辑器件(Programable Logic Device)的简称,FPGA是现场可编程门阵列(Field Programable Gate Array)的简称,两者的功能基本相同,只是实现原理略有不同,所以我们有时可以忽略这两者的区别,统称为可编程逻辑器件或PLD/FPGA。
PLD是电子设计领域中最具活力和发展前途的一项技术,它的影响丝毫不亚于70年代单片机的发明和使用。
PLD能做什么呢?可以毫不夸张的讲,PLD能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路,都可以用PLD来实现。
PLD如同一张白纸或是一堆积木,工程师可以通过传统的原理图输入法,或是硬件描述语言自由的设计一个数字系统。
通过软件仿真,我们可以事先验证设计的正确性。
在PCB完成以后,还可以利用PLD的在线修改能力,随时修改设计而不必改动硬件电路。
使用PLD来开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。
PLD的这些优点使得PLD技术在90年代以后得到飞速的发展,同时也大大推动了EDA软件和硬件描述语言(HDL)的进步。
如何使用PLD呢?其实PLD的使用很简单,学习PLD比学习单片机要简单的多,有数字电路基础,会使用计算机,就可以进行PLD的开发。
开发PLD需要了解两个部分:1.PLD开发软件 2.PLD本身由于PLD软件已经发展的相当完善,用户甚至可以不用详细了解PLD的内部结构,也可以用自己熟悉的方法:如原理图输入或HDL语言来完成相当优秀的PLD设计。
所以对初学者,首先应了解PLD开发软件和开发流程。
了解PLD的内部结构,将有助于提高我们设计的效率和可靠性。
下面我们以基于Altera公司的QuantusII软件来简单说明一下FPGA的开发流程。
下图是一个典型的基于QuantusII的FPGA开发流程。
(1)建立工程是每个开发过程的开始,QuantusII(以下简称Q2)以工程为单元对设计过程进行管理。
艾米电子工作室—让开发变得更简单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 亮灭。