哈工大FPGA设计与应用分频器设计实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FPGA设计与应用
分频器设计实验报告
班级:1105103班
姓名:郭诚
学号:1110510304
日期:2014年10月11日
实验性质:验证性实验类型:必做开课单位:电信院学时:2学时
一、实验目的
1、了解Quartus II软件的功能;
2、掌握Quartus II的HDL输入方法;
3、掌握Quartus II编译、综合、适配和时序仿真;
4、掌握Quartus II管脚分配、数据流下载方法;
5、了解设计的资源消耗情况;
6、掌握分频器和计数器的实现原理;
7、掌握数码管的静态和动态显示原理
二、实验准备(1分)
2.1 EP2C8的系统资源概述
逻辑单元8,256
M4K RAM 块(4k比特+512校验比特) 36
总的RAM比特数165,888
嵌入式乘法器18
锁相环PLLs 2
2.2 工程所用到的FPGA引脚及功能说明
工程所用到的FPGA引脚及功能说明:
PIN_23是时钟引脚;
PIN_114 PIN_117 PIN_127 PIN_134是数码管的位选引脚;
PIN_133 PIN_116 PIN_110 PIN_112 PIN_128 PIN_118 PIN_115是数码管段选信号引脚;实验所用的LED是共阴级连接
2.3 数码管的动态显示原理
动态显示是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O 线控制,当输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于FPGA对位选通COM端电路的控制,所以只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
三、代码及测试
3.1 工程源代码及分析(2分)
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
Entity gcfp is
port ( gc_clk : in std_logic;
gc_clkout : out std_logic;
gc_s7: out std_logic_vector( 6 downto 0 ); --7段码输出
gc_s3: out std_logic_vector( 3 downto 0)); --4个数码管选通
end;
architecture one of gcfp is
signal gc_L1,gc_L2,gc_L3,gc_L4,gc_L:integer; --L1,L2表示分的高低两位L3,L4表示秒的高低两位
signal gc_a:std_logic_vector(26 downto 0); --用作计数
signal gc_q1:std_logic; --LED灯信号
signal gc_b:std_logic_vector(12 downto 0); --用作计数
signal gc_q2:std_logic; --数码管扫描信号
signal gc_clkout1:std_logic; --数码管扫描信号的输出signal gc_c:std_logic_vector(1 downto 0):="00"; --用于数码管选通
--将时钟信号分频(27173913分频)得到频率为1.84Hz(学号为4)的输出信号,要求占空比为25%
begin
process(gc_clk)
begin
if gc_clk'event and gc_clk='1' then
if gc_a<6793478 then
gc_a<=gc_a+1;
gc_q1<='1';
elsif gc_a<27173913 then
gc_a<=gc_a+1;
gc_q1<='0';
else
gc_a <= (others=>'0');
end if;
end if;
gc_clkout<=gc_q1;
end process;
--将时钟信号分频得到周期为1ms的信号作为数码管扫描信号process(gc_clk)
begin
if gc_clk'event and gc_clk='1' then
if gc_b<25000 then
gc_b<=gc_b+1;
gc_q2<=gc_q2;
else
gc_b <= (others=>'0');
gc_q2<=not gc_q2;
end if;
end if;
gc_clkout1<=gc_q2;
end process;
--进行计数,第一、三位模10计数,第二、四位模6计数process(gc_q1)
variable min_10:integer:=0;
variable min:integer:=0;
variable sec_10:integer:=0;
variable sec:integer:=0;
begin
if gc_q1'event and gc_q1='1' then