研究生FPGA实验项目(LED显示及秒表计时器设计)

更新时间:2024-01-23 07:02:01 阅读量: 教育文库 文档下载

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

FPGA实验项目

实验一、LED译码显示实验

实验目的:1、掌握QuartusII6.0等EDA工具软件的基本使用; 2、熟悉VHDL硬件描述语言编程及其调试方法;

3、学习用FPGA控制LED电路实现显示器设计。

实验内容:

本实验目标是利用FPGA逻辑资源,编程设计实现一个LED显示控制器。实验器材为EDA实验箱,FPGA芯片型号为EPF10K20RC208-4。电路设计采用VHDL硬件描述语言编程实现,开发软件为QuartusII6.0。 7段数码显示译码器基本原理

在数字电路中,常常需要把运算结果用十进制数显示出来,这就要用显示译码器。 现以驱动七段发光二极管的二-十进制译码器为例说明显示译码器的设计原理,如图1.1。

图1.1 7段数码显示译码器的原理示意图

7段显示译码器实际上是一种代码变换器,它是将4位二进制码转换成7位代码,燃亮LED显示器a、b、c、d、e、f、g七段中的对应段,显示出十进制数的字型。

表2.1 7段显示译码器真值表(以共阴极数码管为例)

在EDA实验箱中验证这个项目,可用数据开关表示输入,用LED数码管表示输出。 实验步骤:

1、 创建工程文件

先打开“我的电脑”,在E盘新建名为“fpga_lab1”文件夹。然后,利用QuartusII软件创建工程向导(New Project Wizard)创建一个新的工程。步骤如下:

1)打开QuartusII6.0软件界面,在“文件”菜单下选择“New Project Wizard”,点击“next”后弹出如下对话框

点选第一行右侧的“?”选择工程目录为“F:\\ fpga_lab1”,在第二行输入项目名称:led_display,第三行默认把项目名设为顶层文件名,点击“next”,

该窗口可为项目添加已经编辑好的程序文件,默认为空,点击“next”,

该窗口选择FPGA硬件信息,在Family下拉框内选择“FLEX10K”,在Avaliable devices窗口选择芯片型号为:EPF10K20RC208-4,其它选项默认。点击“next”

该窗口用来添加其它EDA工具软件参与综合、仿真、时序分析等工作,本实验默认不选,点击“next”

该窗口为建立的项目信息,点击“Finish”项目建立完毕。 2、 子模块电路设计(包括各个模块的功能仿真)

1) LED显示译码器设计

程序编写:在“文件”菜单下选择“New”,在弹出的窗口点击“VHDL File”点击“OK”打开vhdl编辑窗口。

编辑输入LED显示译码器程序,编辑完毕后保存,文件名保存为“decorder4_7”

(注:文件名必须与程序中实体名一致)

选中“Add file to current project”选项,添加当前文件到项目。 --文件名为decorder4_7.vhd

--功能:把4位二进制数变为七段LED显示码 library ieee;

use ieee.std_logic_1164.all;

entity decorder4_7 is port (A :IN STD_LOGIC_vector(3 downto 0); Y :OUT STD_LOGIC_vector(6 downto 0)); end decorder4_7;

architecture behave of decorder4_7 is begin process(A) begin case A is when \ when \ when \ when \ when \ when \

when \ when \ when \ when \ when \ when \ when \ when \ when \ when \ when others => Y<=\ --注意X要大写 end case; end process; end behave;

文件编译:保存文件后,选择“Project”菜单,点击“Set as Top-Level Entity”项,把当前文件设置为顶层实体。

(注:Quartus环境下所有操作(综合、编译、仿真、下载等)都只对顶层实体进行,所以编译任何程序前,必须先设置该选项,把当前要编译的文件设置为顶层实体后,才能对该文件进行编译等操作)

打开“Processing”菜单,点击“Start Compilation”执行完全编译

状态窗口显示编译过程进度信息

编译结束,系统会弹出编译结束窗口,报告错误与警告数,点击“确定”。 编译报告给出所有编译结果信息,包括硬件信息、资源占用率等。

错误修改: 如果程序中有错误,需要根据“Messages”消息栏给出的错误提示修改程序,保存后须再次编译,直至所有错误均改正后,方可执行下一步操作。警告信息可以忽略。

波形仿真:

1. 建立波形图文件

关闭编译报告窗口,在“文件”菜单下选择“New”,选中“other files”标签页,在弹出的窗口点击“Vector Waveform File”点击“OK” 打开波形编辑窗口。

波形图编辑窗口

2. 定义仿真观测的输入输出节点

在波形编辑窗口左侧栏内单击鼠标右键,出现浮动菜单,选择“Insert Note or Bus?”出现“Insert Note or Bus?”对话框,点击“Node Finder?”按键,出现“Node Finder”对话框,如下图所示。

在图中“Filter:”选项下选择管脚类型为“Pins:all”,然后单击List按钮,可在左下侧

区域看到设计项目中的输入输出信号,单击按钮“= 〉”,将这些信号选择到“Selected Nodes”区,表示对这些信号进行观测,单击OK

此时的波形编辑窗口如下图所示。

保存波形文件,文件名为led_display.vwf(注:扩展名默认不填,文件名与项目名同名)

3. 为输入信号赋值

波形编辑器窗口左侧为信号赋值工具条,根据实际要求点选工具按钮对输入信号赋值。 1)为输入信号A赋值:单击A,使其呈蓝色即选中状态,单击为累加信号赋值工具按钮

,弹出Clock对话框,在Radix框中选择数值类型为Hexadecimal(十六进制),其它

值按默认即可,点击OK。

2)设置仿真时间

选择Edit菜单下的End Time?选项,打开End Time对话框,在time框内入输100单位为us。

再次保存波形文件,窗口如下

时序仿真

选择Processing菜单下的Begin Simulation选项,即开始波形仿真。状态窗口会显示出仿真进程,

仿真结束后可以看到仿真结果波形,如下图所示。观察波形可用工具条上的放大缩小按钮放大缩小波形图。

结果分析:图上可以观察到输出端Y有相应的波形输出,输入信号A与输出信号Y存在对应关系,可以用来检验程序正确性。

生成符号文件:

通过波形仿真可以确定程序功能是否正确后,就可以把该程序生成符号文件,以便在后面的程序中调用。具体操作是:打开File文件菜单,选择Creat/Updata菜单项,右侧弹出子菜单再选择Creat Symbol files for Current file把当前文件创建成符号文件。状态窗口有进度信息显示。

生成的符号文件可以在新建原理图窗口调入,进行层次化设计。下图为在打开的原理图界面下双击鼠标左键,即打开器件库窗口(Symbol),自己生成的模块在Project目录下。

器件管脚分配

打开Assignments菜单,选择Pins选项

弹出管脚分频窗口,在Location位置点击下拉按钮选择相应管脚

根据EDA实验箱的资源情况,输入分配到数据开关,输出分配到LED数码管上,管教具体分配如下表所示:

表 decoder4_7的管脚分配

信号名 A0 A1 A2 A3 Y0—Y6 对应器件名 S1(数据开关) S2(数据开关) S3(数据开关) S4(数据开关) L30(数码管) 物理管教号 75 74 73 71 202——208 注意:管脚分配完成一定要再次编译(即运行compiler)才能使管脚信息加入到下载的编程文件中。

编程下载(即硬件验证)

将下载用的十针扁平电缆一端插入计算机并行口,另一端插入EDA实验箱的电缆插口,接通实验箱电源。

打开tools菜单,选择Programmer打开下载窗口。

弹出窗口如图所示,Hardware Setup按钮右侧显示“No Hardware”,即没有可用的下载硬件,需要配置下载电缆设置。

单击Hardware Setup按钮,弹出Hardware Setup对话框,再点击Add Hardware按钮,弹出Add Hardware对话框,在Hardware type下拉菜单中选择ByteBlaster MV or ByteBlasterII选项,在Port选项中为LPT1,点击OK,再点击close,即完成编程电缆的添加。过程如下图所示:

勾选Program/Configure选项,点击Start,把程序下载到FPGA。

此时,FPGA内部已经完成一个LED译码显示电路设计,根据管脚分配表内对应的器件名称,波动开关可观察到LED显示出不同字符信息。

Ok!到目前为止,我们已经在Quartus下实现一个完整的设计项目。在这个设计中,一些工具条和快捷按钮的使用请阅读窗口中的提示,并不断摸索以求熟练掌握,提高设计速度。

实验二、基于LED秒表计时器实验

实验目的:1、掌握QuartusII6.0等EDA工具软件的基本使用; 2、熟悉VHDL硬件描述语言编程及其调试方法;

3、学习用FPGA控制LED电路实现显示器设计。

实验内容:

基于LED显示器可以进行电子表、秒表计时器、出租车计价器、频率计等复杂电路系统设计,本实验以秒表计时器为例,继续介绍Quartus编程环境以及VHDL语言与原理图混合编程应用。仅给出设计思路和必要的程序,请大家参照LED译码器实验的步骤完成。

本秒表计时器用于体育竞赛及各种要求有较精确时的各领域。此计时器是用VHDL语言描述的在FPGA上实现。它具有开关、计时、时钟和显示功能。

计时器的设计功能: (1)精度应大于1/100s

(2)计时器的最长计时时间为1小时, 在一般的短时间计时应用中,1小时应该足够了。为此需要一个6位显示器,显示最长时间为59分59.99秒。

(3)设置复位和启/停开关 复位开关用来使计时器清0。启/停开关的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时进程应立即终止,并对计时器清零。

整体设计方案:

为了便于描述,将整个计时控制芯片分成4个子模块:分频器子模块(fpq),十进制计数器子模块(cnt10),六进制计数器子模块(cnt6),和译码显示子模块(decorder4_7),各模块之间信号连接关系的方框图如下:

程序设计:

各模块程序及生成的符号文件如下: 1、分频器子模块fpq模块设计

--本程序实现由4MHz晶振分频得到100Hz计数脉冲信号 --分频数计算:4000000/100=40000 library IEEE;

use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL; entity fpq is

generic(framlenr:integer:=40000); Port (clk:in std_logic; bclk:out std_logic); end fpq;

architecture Behavioral of fpq is begin

process(clk)

variable cnt:integer; begin

if rising_edge(clk) then

if cnt>=framlenr then cnt:=0; bclk<='0'; elsif cnt>=framlenr/2 then cnt:=cnt+1;bclk<='1'; else cnt:=cnt+1; bclk<='0'; end if; end if; end process; end Behavioral; 生成的符号:

2、十进制计数器子模块(cnt10). LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt10 IS

PORT (reset,en,clk:IN STD_LOGIC; carry:OUT STD_LOGIC;

q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END CNT10;

ARCHITECTURE rtl OF cnt10 IS

SIGNAL qs :STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL ca :STD_LOGIC; BEGIN

PROCESS(clk) BEGIN

IF(clk'EVENT AND clk='1')THEN IF(reset='1')THEN qs<=\ ELSIF(en='1') THEN

IF(qs=\ --计数到9 qs<= \ ca<='0';

ELSIF(qs=\计数到8 qs<= qs+1; ca<='1';

ELSE qs<= qs+1; ca<='0'; END IF; END IF; END IF;

END PROCESS; PROCESS(ca) BEGIN q<=qs;

carry<=ca AND en; END PROCESS; END rtl; 生成的符号:

仿真波形:

3、 六进制计数器子模块(cnt6) LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY cnt6 IS

PORT (reset,en,clk:IN STD_LOGIC; carry :OUT STD_LOGIC;

q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END CNT6;

ARCHITECTURE rtl OF cnt6 IS

SIGNAL qs :STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL ca :STD_LOGIC; BEGIN

PROCESS(clk) BEGIN

IF(clk'EVENT AND clk='1')THEN IF(reset='1')THEN qs<=\

ELSIF(en='1')THEN IF(qs=\ qs<= \ ca<='0';

ELSIF(qs=\ qs<= qs+1; ca<='1'; ELSE

qs<=qs+1; ca<='0'; END IF; END IF; END IF;

END PROCESS; PROCESS(ca,en) BEGIN

q<=qs;

carry<=ca AND en; END PROCESS; END rtl; 生成的符号:

仿真波形:

4、译码显示子模块(decorder4_7) 参考实验一 5、顶层文件设计

完整的顶层原理图如图所示:按图完成电路设计,

编译通过正确后,分配器件管脚,如下表格: 信号名 start resetb clk led0[6]—led0[0] led1[6]—led1[0] led2[6]—led2[0] led3[6]—led3[0] led4[6]—led4[0] led5[6]—led5[0] 对应器件名称 S2 S1 M3(石英晶体振荡器) L25(1/100s计数个位输出) L27(1/100s计数十位输出) L29(秒个位输出) L26(秒个位输出) L28(分个位输出) L30(分个位输出) 管脚号 74 75 183 150,157—162 163,164,166—170 172—177,179 180,186,187,189—192 193,195—200 202—208 分配完管脚信息,再次编译使之生效,最后下载程序到FPGA实验箱进行结果验证。

编译通过正确后,分配器件管脚,如下表格: 信号名 start resetb clk led0[6]—led0[0] led1[6]—led1[0] led2[6]—led2[0] led3[6]—led3[0] led4[6]—led4[0] led5[6]—led5[0] 对应器件名称 S2 S1 M3(石英晶体振荡器) L25(1/100s计数个位输出) L27(1/100s计数十位输出) L29(秒个位输出) L26(秒个位输出) L28(分个位输出) L30(分个位输出) 管脚号 74 75 183 150,157—162 163,164,166—170 172—177,179 180,186,187,189—192 193,195—200 202—208 分配完管脚信息,再次编译使之生效,最后下载程序到FPGA实验箱进行结果验证。

本文来源:https://www.bwwdw.com/article/6g7o.html

Top