数字时钟系统实验报告.docx
《数字时钟系统实验报告.docx》由会员分享,可在线阅读,更多相关《数字时钟系统实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
数字时钟系统实验报告
数字时钟系统设计7段数码管译码显示
一、实验目的
作为熟悉实验箱后的第一个实验,本实验继续帮助同学们进一步熟悉试验箱和开发软件QuartusII,实验结合下载到实验箱的操作,定会帮助同学们更加熟悉EDA实验流程和方法,为后续实验打下基础。
利用FPGA开发软件QuartusII,熟悉其原理图方式的设计方法,简单VHDL程序模块化,原理图连结的方式,实现7段数码管译码显示。
二、实验内容
建立工程,理解和编写实验中的VHDL程序,然后把每个简单的VHDL程序(CreateSymbolFilesForCurrentFile)作为一个模块,在原理图输入中引入,最后把原理图设置成顶层文件,模拟仿真,下载到FPGA中观看数码管循环译码显示。
三、实验原理
VHDL程序原理
实验程序用VHDL语言编写,利用开发软件QuartusII完成编译,完成本实验,主要有3部分参考程序,分别是系统时钟分频程序(int_div.vhd)、加法计数器程序(cnt4b.vhd),还有转换译码程序(decl7s.vhd)。
系统时钟分频程序,实验箱的系统时钟频率为48Mhz,通过设置分频模块,对系统时钟进行了48000000分频,得到1Hz的信号频率,通过分频输出后,频率降低,1Hz频率时,周期为一秒,得到1Hz的秒脉冲,一秒一个跳变,从而使得7段数码管的每一个跳变眼睛都能够清晰地分辨出来。
加法计数器程序,在工作频率作用下,每个频率周期进行一次加一操作,使得4位二进制数循环输出(0000到1111),每输出一个4位的二进制数据信号,分别对应数码管0~9、A~F的16个数据,并且循环显示,让变化的顺序和结果循环展示,方便验证观察。
转换译码程序,在对应加法计数器输出的4位二进制信号下,经逻辑译码转换,每一组4位的二进制信号输入都对应一组8位的高低电平信号输出,对应数码管0~9、A~F每个状态下的8个发光二极管的发光状态,使数码管在每个状态下都有相应、直观的显示输出在数码管上。
数码管原理
实验箱中的数码管为7段共阴数码管,低电平有效,需注意在习惯逻辑上的1转换成0,并修改书上的VHDL程序,“0”为亮,当然,在上面转换译码程序中,我们可以把对应的电平二进制数值写成较简单的十六进制数据表示(参见转换译码(decl7s.vhd)的参考程序)。
最后用VHDL程序构成3个模块,分频模块(int_div)分频得到1Hz的频率信号,加载于4位加法器模块的时钟输入端,计数循环输出0~9、A~F共16个数。
最后通过七段译码模块译码后在数码管上显示出来。
四、实验步骤
(1)打开QuartusII,利用NewProjectWizard建立一个新的工程。
①在第二栏与第三栏中,将工程名与顶层文件的实体名同设为sled。
图1新建工程路径、名称、顶层实体指定对话框
②这里我们选择的是QuikSOPC核心板上用的Cyclone系列的EP1C12Q240C8。
图2新建工程器件选择对话框
(2)新建VHDL源程序文件(菜单中File→NEW→VHDLFile),输入源程序代码,并以程序中的实体名保存在工程所在的文件夹,可先对单个程序逐个编译仿真,检查程序的正确性。
若在编译过程中发现问题,可在程序编译的下窗口的提示中检查程序并更正错误。
①输入顶层文件代码并保存。
若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
图3
②输入4位加法计数器代码并保存。
若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
图4
③输入转换译码代码并保存。
若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
图5
图6
(3)新建原理图(菜单中File→NEW→BlockDiagram/SchematicFile),对各个已保存的VHDL程序创建成相应的模块(CreateSymbolFilesForCurrentFile),使得能在原理图中作为元件引入调用。
图7
图8
(4)按照下面的原理图进行连接,并将原理图设置成顶层文件,完成编译并排错。
图9
图10
(5)选择目标器件并对相应的引脚进行锁定,为准备下载到试验箱做准备。
Clock信号引脚设置为28。
图11
(6)编译结束后,对话框显示消息“Fullcomplicationwassuccessful.”,单击OK进入ComplicationReport窗口,如图13所示,包括编译报告、综合报告、适配报告和时序分析报告等。
图12
(7)进行引脚锁定后,点击编译按钮,进行一些下载前的设置,比如在菜单中Assignments→Device,点击弹出界面中的Devices&PinOptions,进行设定,确保下载仿真顺利并成功。
(8)下载硬件设计到目标FPGA
成功编译硬件系统后,将产生led_test.sof的FPGA配置文件输出,下面简单介绍将SOF文件下载到目标FPGA器件的步骤。
①通过ByteBlasterII下载电缆连接实验箱JTAG口和主计算机,接通实验箱电源。
②在QuartusII主界面中选择Tools→Programmer,也可以单击工具栏上的
按钮,打开编程器窗口并自动打开配置文件。
如果没有自动打开配置文件,则需要自己添加需要的配置文件。
③确保编程器窗口左上角的HardwareSetup栏中硬件已经安装。
④确保Program/Configure下的方框选中。
⑤单击“Start”开始使用配置文件对FPGA进行配置,Progress框中显示配置进度。
如果使用QuickSOPC核心板,板上的配置绿色指示灯CONF亮,说明配置成功。
本实验只讲述如何将配置文件下载到FPGA中,掉电后FPGA中配置的数据将丢失。
也可以将配置文件写入掉电保护的EPCS,在上电时使用EPCS对FPGA进行配置。
五、实验参考程序(VHDL)
程序清单1分频器int_div.vhd
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.NUMERIC_BIT.ALL;--包含移位函数等.
ENTITYint_divIS
GENERIC
(
F_DIV:
Integer:
=48000000;--分频系数
F_DIV_WIDTH:
Integer:
=32--分频计数器宽度
);
PORT(
clock:
INSTD_LOGIC;
clock_out:
OUTSTD_LOGIC
);
END;
ARCHITECTUREoneOFint_divIS
SIGNALclk_p_r:
STD_LOGIC;--上升沿输出时钟
SIGNALclk_n_r:
STD_LOGIC;--下降沿输出时钟
SIGNALcount_p:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);--上升沿脉冲计数器
SIGNALcount_n:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);--下降沿脉冲计数器
--SIGNALf_div_width_r:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);
SIGNALclock_out_r:
STD_LOGIC;
SIGNALfull_div_p:
STD_LOGIC;--上升沿计数满标志
SIGNALhalf_div_p:
STD_LOGIC;--上升沿计数半满标志
SIGNALfull_div_n:
STD_LOGIC;--下降沿计数满标志
SIGNALhalf_div_n:
STD_LOGIC;--下降沿计数半满标志
BEGIN
clock_out<=clock_out_r;
--clock_out<=clockWHEN(F_DIV=1)ELSE((clk_p_r='1'ANDclk_n_r='1')WHEN(F_DIV(0)='1')clk_p_r);
-------------------------<<判断计数标志位置位与否.
full_div_p<='1'WHEN(count_phalf_div_p<='1'WHEN(count_p<(F_DIV/2)-1)ELSE'0';
full_div_n<='1'WHEN(count_nhalf_div_n<='1'WHEN(count_n<(F_DIV/2)-1)ELSE'0';
PROCESS(clock)--上升沿脉冲计数
--VARIABLEi:
IntegerRANGE0TO31;
BEGIN
IFRISING_EDGE(clock)THEN
IFfull_div_p='1'THEN
count_p<=count_p+1;
IF(half_div_p='1')THEN
clk_p_r<='0';
ELSE
clk_p_r<='1';
ENDIF;
ELSE
count_p<=(OTHERS=>'0');
clk_p_r<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(clock)--下降沿脉冲计数
BEGIN
IFFALLING_EDGE(clock)THEN
IFfull_div_n='1'THEN
count_n<=count_n+1;
IFhalf_div_n='1'THEN
clk_n_r<='0';
ELSE
clk_n_r<='1';
ENDIF;
ELSE
count_n<=(OTHERS=>'0');
clk_n_r<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(clock)
BEGIN
IFRISING_EDGE(clock)THEN
IFF_DIV=1THEN
clock_out_r<=clock;
ELSE
IF(F_DIVREM2)=1THEN
clock_out_r<=clk_p_rANDclk_n_r;
ELSE
clock_out_r<=clk_p_r;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
END;
程序清单24位加法计数器cnt4b.vhd
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt4bis
port(CLK:
instd_logic;
OUTY:
outstd_logic_vector(3downto0));--加法器输出
endcnt4b;
architecturebehavofcnt4bis
signalcqi:
std_logic_vector(3downto0);
begin
process(CLK)
begin
ifCLK'EVENTANDCLK='1'THEN--上升沿
cqi<=cqi+1;
endif;
outy<=cqi;
endprocess;
endbehav;
程序清单3转换译码decl7s.vhd
libraryIEEE;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydecl7sis
port(A:
instd_logic_vector(3downto0);
led7s:
outstd_logic_vector(7downto0));
end;
architectureoneofdecl7sis
begin
process(A)
begin
caseAis
when"0000"=>led7s<=X"c0";--0
when"0001"=>led7s<=X"f9";--1
when"0010"=>led7s<=X"a4";--2
when"0011"=>led7s<=X"b0";--3
when"0100"=>led7s<=X"99";--4
when"0101"=>led7s<=X"92";--5
when"0110"=>led7s<=X"82";--6
when"0111"=>led7s<=X"f8";--7
when"1000"=>led7s<=X"80";--8
when"1001"=>led7s<=X"90";--9
when"1010"=>led7s<=X"88";--A
when"1011"=>led7s<=X"83";--b
when"1100"=>led7s<=X"c6";--C
when"1101"=>led7s<=X"a1";--d
when"1110"=>led7s<=X"86";--E
when"1111"=>led7s<=X"8e";--F
whenothers=>null;
endcase;
endprocess;
end;