综合电子实践Quartus ii 课程设计报告
姓名:XXX
学号:22011XXX
报告日期:2013/9/6
1
目录
A交通控制灯设计…………………………………………………………………………………..………………………3
1.系统设计要求……………………………………………………………………………………………..…………………….3 2.系统设计方案……………………………………………………………………………………………………………………3
2.1 系统设计思路……………………………………………………………………………………………………………3 2.2 系统设计方案分析…………………………………………………………………………………………………….5 3.交通控制灯各模块电路设计……………………………………………………………………………………………6
3.1控制模块 controller………………………………………………………………………………………………………6 3.2时钟分频模块frequency10Hz和frequency…………………………………………………………………………10 3.3分位电路模块fenwei……………………………………………………………………………………………….……12 3.4带闪烁功能的七段数码驱动显示模块display…………………………………………………………….…………14 4.交通控制灯顶层电路设计……………………………………………………………………………………….………16
4.1原理说明…………………………………………………………………………………………………..…………………16 4.2 端口设计说明…………………………………………………………………………………………….…………………16 4.3 Quartus ii 仿真与结果分析………………………………………………………………………………………………..17
B 跑马灯设计………………………………………………………………………………………………………………………19
1.设计要求……………………………………………………………………………………………………………………………….19 2.方案设计框架……………………………………………………………………………………………………………….………19 3.硬件电路的设计与软件设计………………………………………………………………………………………………..20
3.1集成分频器模块……………………………………………………………………………………………….……………20 3.2 32进制计数器模块…………………………………………………………………………………………………………24 3.3彩灯控制模块……………………………………………………………………………………………………………..…25 3.4 4选1选择器模块………………………………………………………………………………………………………..…28 3.5 4进制计数器模块…………………………………………………………………………………………………………..29 4.系统结构及仿真……………………………………………………………………………………………………………..…….31
C 数字钟设计……………………………………………………………………………………………………32 1.系统设计要求………………………………………………………………………………………………………..32 2.系统设计和仿真验证………………………………………………………………………………………………33
2.1整体方案设计…………………………………………………………………………………………………..33 2.2 端口设计说明………………………………………………………………………………………………….34 2.3 功能仿真…………………………………………………………………………………………………… ...34
3.VHDL设计和RTL视图…………………………………………………………………………………………….35
3.1 对应的的顶层VHDL设计…………………………………………………………………………………….35 3.2 底部元件74161_0,74161_1,74161_2和74161_3 VHDL设计………………………………………………………………….41 3.3 RTL视图…………………………………………………………………………………………………….…42
D 设计心得…………………………………………………………………………………………………………..42
※设计报告说明:所有程序均在Quartus ii 9.0环境下运行,打开时可能会存在软件版本问题
2
A 交通控制灯设计
1. 系统设计要求
(1) 在十字路口的两个方向上各设一组红、绿、黄灯,显示顺序为其中一个方向是(东
西方向)是绿灯、黄灯、红灯;另一方向(南北方向)是红灯、绿灯、黄灯。
(2) 设置一组数码管,以倒计时的方式显示允许通行或禁止通行的时间。其中绿灯、黄
灯、红灯的持续时间分别是20s、5s和25s。
(3) 当各条路上任意一条上出现特殊情况时,如当消防车、救护车或其他需要优先放行
的车辆通过时,各方向上均是红灯,倒计时停止,且显示数字在闪烁。当特殊运行状态结束时,控制器恢复原来状态,继续正常运行。
2. 系统设计方案
2.1 系统设计思路
(1) 本系统设计中均采用混合设计的方法,将整体方案划分成若干个模块进行设计。采
用VHDL硬件描述语言和原理图描述相结合的方式,对多种应用电路进行设计,其中底层电路(即模块电路)采用VHDL硬件描述语言方式实现,顶层电路采用原理图描述方式实现。
3
(2) 系统设计流程 提出系统设计要求
需求分析
模块化方案设计 底层电路设计----VHDL模块 电路设计
顶层电路设计----原理图描
述+各模块连接
FPGA整体方案设计实现
FPGA整体方案编译仿真
时序仿真 功能仿真
硬件搭接和运行
FPGA整体方案设计完成
4
图1 系统设计流程
2.2 系统设计方案分析
根据任务要求,计数器的值和交通灯亮灭关系如图1所示。 显然,此任务设计的核心是一个技术范围为0~50s的计数器和一个根据计数值作出规定反应的控制器。假设现有晶振为20MHz,因此还需要分频电路来得到10Hz和1Hz的时钟,最后要驱动七段数码管,还需要一个译码电路。
黄灯亮 绿灯亮 红灯亮
0 25 45 20 50
黄灯亮 绿灯亮 红灯亮
图2计数值和交通灯亮灭关系
根据上面的分析,交通控制灯系统框图如图3所示; Hold Reset 计数器 控制器 倒计时数字及“闪 烁控制信号” Clk 1Hz 20MHz 分频电路 分位译码电路 Clk 10Hz 七段数码管驱动电路 CPLD/FPGA 计数值 红、黄、绿发光二极管 七段数码管 5
图3 交通控制等系统框图
3.交通控制灯各模块电路设计
3.1 控制模块 controller
(1)控制模块的作用是根据计数器的数值控制发光二极管的亮、灭,以及输出倒计时数值
给七段数码管的分位译码电路。计数范围为0~50。计数到50后,下一个时钟沿回复到0,开始下一计数。此外当检测到特殊情况(hold=”1”)发生时,计数器暂停计数,无条件点亮红色的发光二极管。而系统复位信号reset则使计数器异步清零。控制模块controller外部端口如图4所示。
图4控制模块controller外部端口
(2)控制模块的VHDL程序 程序说明:控制模块描述了功能键hold和reset的功能;同时对频率为1Hz的时钟进行计数,
通过计数值,对各个时间段内交通灯信号进行描述;此外,模块还给出了下一步用于倒计时的信号numa[4..0]和numb[4..0]。
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity controller is port(clock:instd_logic; reset:instd_logic; hold:instd_logic; flash:outstd_logic;
numa,numb:out integer range 0 to 25; reda,greena,yellowa:outstd_logic; redb,greenb,yellowb:outstd_logic ); end;
6
architecture control of controller is signal countnum:integer range 0 to 50; begin
process(clock) begin
if reset='1' then countnum<=0;
elsifrising_edge(clock) then if hold='1' then flash<='1'; else
flash<='0';
if countnum=47 then countnum<=0; else
countnum<=countnum+1; end if; end if; end if; end process; process(clock) begin
if rising_edge(clock) then if hold='1' then reda<='1'; redb<='1'; greena<='0'; greenb<='0'; yellowa<='0'; yellowb<='0'; else
if countnum<=17 then numa<=20-countnum; reda<='0'; greena<='1'; yellowa<='0';
elsif (countnum<=24) then numa<=25-countnum; reda<='0'; greena<='0'; yellowa<='1'; else
numa<=50-countnum; reda<='1';
7
greena<='0'; yellowa<='0'; end if;
if countnum<=24 then
numb<=25-countnum; redb<='1'; greenb<='0'; yellowb<='0';
elsifcountnum<=44 then
numb<=45-countnum; redb<='0'; greenb<='1'; yellowb<='0'; else
numb<=50-countnum; redb<='0'; greenb<='0'; yellowb<='1';
end if; end if; end if; end process; end;
(3)控制模块的VHDL仿真验证
初始状态
8
整体功能验证
reset键功能验证---将状态恢复至初始状态,计数器显示初始值,绿灯greena和红灯redb
亮
hold键功能验证----保持计数值不变,红灯reda和redb同时亮,flash闪烁输出为高电
平
9
3.2 时钟分频模块frequency10Hz和frequency
(1)时钟分频模块是对系统时钟(设为20MHz)进行分频,得到10Hz和1Hz的时钟。时
钟分频模块的外部端口如图5所示。
图5 时钟分频模块的外部端口
(2)时钟分频模块frequency 10Hz的VHDL程序
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity frequency10hz is port(clk20m:in std_logic; clk10hz:out std_logic); end;
architecture count of frequency10hz is signal tout:integer range 0 to 999999; signal clk:std_logic; begin
10
process(clk20m) begin
if rising_edge(clk20m) then if tout=999999 then tout<=0; clk<= not clk;
else tout<=tout+1; end if; end if; end process; clk10hz<=clk; end;
(3)时钟分频模块frequency10Hz仿真验证
(4)时钟分频模块frequency的VHDL程序
程序说明:通过一级分频得到10Hz的时钟,对其再次分频得到1Hz时钟。
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity frequency is
port(clk10hz:in std_logic; clk1hz:out std_logic); end;
architecture count of frequency is signal tout:integer range 0 to 4; signal clk:std_logic; begin
process(clk10hz) begin
11
if rising_edge(clk10hz) then if tout=4 then tout<=0; clk<= not clk;
else tout<=tout+1; end if; end if; end process; clk1hz<=clk; end;
(5)时钟分频模块frequency仿真验证
3.3 分位电路模块fenwei
(1)因为控制输出的倒计时数值可能是1位或者2位十进制数,所以七段数码管的译码电
路前要加上分位电路(即将其分为2个1位的十进制数,如25分为2和5)。
(2)分位电路模块fenwei的外部端口如图6所示。fenwei模块输出的计数值numa[4..0]和
numb[4..0]将十位数和个位数分别存到数组里,这样可以得到两个路口倒计时时间显示的十位和个位信号。
12
图6 分位电路模块fenwei外部端口
(3)分位电路模块fenwei的VHDL程序 程序说明:以10Hz的速度提取显示值。 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity fenwei is
port(clock:instd_logic;
numin:in integer range 0 to 25;
numa,numb:out integer range 0 to 15); end;
architecture fen of fenwei is begin
process(clock) begin
if rising_edge(clock) then if numin>=20 then numa<=2;
numb<=numin-20; elsifnumin>=10 then numa<=1;
numb<=numin-10; else numa<=0;
numb<=numin; end if; end if; end process; end;
(3)分位电路模块fenwei仿真验证
13
3.4 带闪烁功能的七段数码驱动显示模块display
(1)七段数码驱动显示模块对输入信号进行译码得到七段数码显示器的驱动信号,其外部
端口如图7所示。
图7 七段数码驱动显示模块display外部端口
(2)七段数码驱动显示模块display的VHDL程序
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity display is
port(clock:instd_logic; flash:instd_logic;
qin:instd_logic_vector(3 downto 0); display:outstd_logic_vector(0 to 6)); end;
architecture light of display is
signal timeout:integer range 0 to 11; begin
process(clock) begin
14
if rising_edge(clock) then if (flash='0') then timeout<=0; else
if (timeout=11) then
timeout<=timeout+1; end if; end if;
if(timeout<=6) then case qin is
when \"0000\"=>display<=\"1111110\"; when \"0001\"=>display<=\"0110000\"; when \"0010\"=>display<=\"1101101\"; when \"0011\"=>display<=\"1111001\"; when \"0100\"=>display<=\"0110011\"; when \"0101\"=>display<=\"1011011\"; when \"0110\"=>display<=\"1011111\"; when \"0111\"=>display<=\"1110000\"; when \"1000\"=>display<=\"1111111\"; when \"1001\"=>display<=\"1111011\"; when others=>display<=\"0000000\"; end case; else
display<=\"0000000\"; end if; end if;
end process; end;
(3)七段数码驱动显示模块display仿真验证
15
4.交通控制灯顶层电路设计
4.1 原理说明
交通顶层电路图如图8所示。图8中有3个输入信号clk20m、reset和hold。clk20m为系统输入时钟,它通过分频器可分别得到1Hz和10Hz频率信号,分别用来向controller模块和display模块提供时钟脉冲。controller模块根据时钟脉冲上升沿开始计数,将数据传输到numa[4…0]和numb[4…0]两个端口,并对reda、greena、yellowa和redb、greenb、yellowb两组红、黄、绿灯开始控制。fenwei模块时钟由系统输入时钟clk20m控制,将controller模块输出端口numa[4…0]和numb[4…0]传输过来的数据分为十位数和个位数分别存到numina、numinb、numinc和numind两组两位数组里,然后分别送到display模块输入端口numina、numinb、numinc和numind进行数据显示。
图8 交通控制灯顶层设计原理图
4.2 端口设计说明
clk20m:系统输入时钟,来自于石英振荡器。
hold:输入,功能键,保持:按hold键能实现特殊的功能:显示倒计时的两组数码管
闪烁;计数器停止计数并保持在原有的状态;东西,南北路口均显示红灯状态;特殊状态接触后可以继续计数。
reset:输入,功能键,复位。
flash:输出,转换期间的闪烁信号。
redb:输出,B路口显示红灯信号,高电平有效。 greenb:输出,B路口显示绿灯信号,高电平有效。 yellowb:输出,B路口显示黄灯信号,高电平有效。 reda:输出,A路口显示红灯信号,高电平有效。 greena:输出,A路口显示绿灯信号,高电平有效。
16
yellowab:输出,A路口显示黄灯信号,高电平有效。 displaya:A路口倒数时间显示十位数 displayb:A路口倒数时间显示个位数 displayc:B路口倒数时间显示十位数 displayd:B路口倒数时间显示个位数
4.3 Quartus ii 仿真与结果分析
交通灯控制系统的时序仿真波形如图9~图11所示。可见,图9中reset设置为高电平“1”时显示初始值,为低电平“0”时显示器开始倒计时。
图9 交通灯控制系统的时序仿真波形1
图10是仿真结果的细节部分。当A路口绿灯亮。displaya和displayb从20s倒计时,同时B路口灯亮,displayc和displayd从25s倒计时。当A路口绿灯倒计时结束时,让黄灯亮,倒计时5s为转换信号,当黄灯倒计时结束时红灯亮,displaya和displayb从25s倒计时。B路口绿灯亮,displayc和displayd从20s倒计时,A路口红灯亮,displaya和displayb从25s倒计时,这时B路口重复A路口的上一次动作,如此循环下去。
17
图10 交通灯控制系统的时序仿真波形2
图11 交通灯控制系统的时序仿真波形3
从图11可以看出交通灯控制系统中hold键的功能。当hold设置为高电平“1”时显示器保持原有数字不变,且无条件点亮红色的发光二极管reda=1。当hold设置为低电平“0”时,显示器继续计数。
18
B 跑马灯设计
1.设计要求
1.1学习并掌握Quartus ii软件,掌握用自顶向下的设计方法,使用VHDL语言
来实现跑马灯的设计,并在此基础上熟悉可编程逻辑器件的使用。 1.2基础功能要求:
实现8个红色LED的亮、灭、交错显示等,其显示如下 (1)复位时,8个灯全灭;
(2)从左到右第一个开始亮,依次亮到最后一个; (3)从右到左第一个开始亮,依次亮到最后一个; (4)从中间亮到两边; (5)从两边亮到中间; 1.3扩展功能要求:
随着彩灯显示图案的变化,发出不同的音响声。
2.方案设计框架
2.1 这次的跑马灯设计采用模块化方法设计,整体方案包括分频器模块、计数器模块、选择器模块和彩灯控制器模块。其中彩灯控制器是用来输出不同的图案和音响声,彩灯控制器的输出则是用一个32进制的计数器来控制。扬声器的输出用不同的频率来控制,因此用了一个集成分频器来使输入的频率被分为几种不同的频率。不同频率的选择性的输出则是用一个4选一的选择器来控制。
32进制计数器 跑马灯控制器 LED输出 图3.1跑马灯的输出原理方框图
19
提供控制端 4进制计数器 提供脉冲 四选一的选择器 扬声器输出 分频器 提供选择端 图3.2 扬声器输出原理方框图
3.硬件电路的设计与软件设计
3.1集成分频器模块
1)设计要求显示不同的跑马灯的时候要伴随不同的音乐,所以设计分频器来用不同的频率控制不同的音乐输出。 模块说明:
Rst:输入信号,复位信号,用来复位集成分频器的输出使输出为“0”,及没有音乐输出。
Clk:输入信号,即为分频输入的频率信号。
Clk_4、clk_6、clk_8、clk_10:输出信号 即为分频模块对输入信号clk的分频,分别为1/4分频输出、1/6分频输出、1/8分频输出、1/10分频输出。
图3.1 集成分频器
20
2)分频器VHDL程序编写及仿真结果
LIBRARY ieee;
USE ieee.std_logic_1164.all; -- IEEE库使用声明 ENTITY fenpinqi IS -- 实体端口声明 PORT(clk,rst : IN std_logic; -- 类型的输入端口
clk_10,clk_4,clk_6,clk_8: OUT std_logic); -- 输出口
END fenpinqi;
ARCHITECTURE cd OF fenpinqi IS --结构体功能描述语句 begin
p1:process(clk,rst) --进程语句 variable a:integer range 0 to 20; begin
if rst='1' then
clk_4<='0'; ---复位信号控制部分 else
if clk'event and clk='1'then --时钟信号clk,上升沿有效边沿 if a>=3 then a:=0; --当a大于等于3时,则a等于0 clk_4<='1'; else
a:=a+1; --否则a等于a加1 clk_4<='0'; end if; end if; end if; end process p1; p2:process(clk,rst)
variable b:integer range 0 to 20; begin
21
if rst='1' then
clk_6<='0'; ----- 复位信号控制部分 else
if clk'event and clk='1'then if b>=5 then b:=0; clk_6<='1'; else b:=b+1; clk_6<='0'; end if; end if; end if; end process p2;
p3:process(clk,rst)
variable c:integer range 0 to 20; begin
if rst='1' then
clk_8<='0'; ----- else
if clk'event and clk='1'then if c>=7 then c:=0; clk_8<='1'; else c:=c+1; clk_8<='0'; end if;
22
复位信号控制部分
end if; end if;
end process p3; --关闭进程
p4:process(clk,rst) --开启另外一个进程 variable d:integer range 0 to 20; --定义d为变量 begin
if rst='1' then
clk_10<='0'; ----- 复位信号控制部分 else
if clk'event and clk='1'then if d>=9 then d:=0;
clk_10<='1'; else d:=d+1; clk_10<='0'; end if; end if; end if;
end process p4; end cd;
图3.2 集成分频器仿真波形
23
3.2 32进制计数器模块
1)32进制模块用来控制彩灯输出模块,即确定跑马灯控制器的不同的输出。
Rst:输入信号 复位信号 用来复位32进制使其输出为“00000”。 Clk:输入信号 用来给模块提供工作频率。
Count_out[4..0]:输出信号 即为32进制计数器的输出。
图3.2 32进制计数器
2)32进制计数器VHDL程序编写及其仿真结果
library ieee;
use ieee.std_logic_1164.all; -- IEEE库使用声明 entity counter_32 is --实体端口声明
port(clk,rst: in std_logic; --声明clk,clr是标准逻辑位类型的输入
端口
count_out: out integer range 0 to 31);
end counter_32;
architecture a of counter_32 is begin
process (rst,clk)
variable temp:integer range 0 to 32; --定义temp为变量
begin
if rst='1' then --条件选择语句
temp:=0;
elsif (clk'event and clk='1') then
temp:=temp+1; if(temp=32) then
24
temp:=0; end if; end if; count_out<=temp; end process; end a;
图3.432进制计数器仿真波形
3.3彩灯控制模块
1)彩灯控制模块用来直接控制跑马灯的输出,使彩灯表现出不同的花样。
Rst:输入信号 使彩灯控制模块的输出为“00000000”,即让彩灯无输出。 Input[4..0]:输入信号 不同的输入使彩灯控制模块有不同的输出即彩灯显示出不同的花样。
Output[7..0]:输出信号 直接与彩灯相连来控制彩灯
图3.5 彩灯控制模块
2)彩灯控制模块VHDL程序编写及仿真
LIBRARY ieee;
USE ieee.std_logic_1164.all; -- IEEE库使用声明
25
ENTITY caideng IS -- 实体端口声明 PORT(input: IN INTEGER RANGE 0 TO 31; rst:instd_logic;
output : OUT std_logic_vector(7 downto 0);
);
sm :out std_logic_vector(6 downto 0) END caideng;
ARCHITECTURE a OF caideng IS --结构体功能描述语句 BEGIN
PROCESS (input,rst) BEGIN
if rst='1' then output<=\"00000000\";sm<=\"0000000\"; --当rst复位时,灯全灭 else
case input is
when 0=>output<=\"10000000\";sm<=\"0000110\"; when 1=>output<=\"01000000\";sm<=\"0000110\"; when 2=>output<=\"00100000\";sm<=\"0000110\"; when 3=>output<=\"00010000\";sm<=\"0000110\"; when 4=>output<=\"00001000\";sm<=\"0000110\"; when 5=>output<=\"00000100\";sm<=\"0000110\"; when 6=>output<=\"00000010\";sm<=\"0000110\"; when 7=>output<=\"00000001\";sm<=\"0000110\"; --当sm为110时,灯从左到右第一个开始亮 when 8=>output<=\"00010000\";sm<=\"0011011\"; when 9=>output<=\"00110000\";sm<=\"0011011\"; when 10=>output<=\"00111000\";sm<=\"0011011\"; when 11=>output<=\"01111000\";sm<=\"0011011\"; when 12=>output<=\"01111100\";sm<=\"0011011\"; when 13=>output<=\"01111110\";sm<=\"0011011\"; when 14=>output<=\"11111110\";sm<=\"0011011\"; when 15=>output<=\"11111111\";sm<=\"0011011\";
26
--当sm为11011时,灯从中间亮到两边 when 16=>output<=\"10000001\";sm<=\"1001111\"; when 17=>output<=\"11000001\";sm<=\"1001111\"; when 18=>output<=\"11000011\";sm<=\"1001111\"; when 19=>output<=\"11100011\";sm<=\"0011011\"; when 20=>output<=\"11100111\";sm<=\"1001111\"; when 21=>output<=\"11110111\";sm<=\"1001111\"; when 22=>output<=\"11111111\";sm<=\"1001111\"; when 23=>output<=\"00001000\";sm<=\"1001111\"; --当sm为1001111时,灯从两边亮到中间
when 24=>output<=\"00000001\";sm<=\"0100110\"; when 25=>output<=\"00000010\";sm<=\"0100110\"; when 26=>output<=\"00000100\";sm<=\"0100110\"; when 27=>output<=\"00001000\";sm<=\"0100110\"; when 28=>output<=\"00010000\";sm<=\"0100110\"; when 29=>output<=\"00100000\";sm<=\"0100110\"; when 30=>output<=\"01000000\";sm<=\"0100110\"; when 31=>output<=\"10000000\";sm<=\"0100110\"; when others=>null;
--当sm为0100110时,灯从右边亮到左边 end case; end if; end process; end a;
27
图3 .6.跑马灯控制模块仿真波形
3.4 4选1选择器模块
1) Rst:输入信号复位信号使选择器的输出为“0”。 In1、in2、in3、in4:输入信号接分频器的输出。
Inp[1..0]:输入信号接4进制计数器的输出用来控制选择器的选择不同的输入选择不同的输出。
Output:输出信号直接接扬声器即输出的是不同的频率来控制扬声器播放音乐。
图4.74选1选择器
2) 4选1选择器模块VHDL程序编写及仿真
Library ieee;
use ieee.std_logic_1164.all; -- IEEE库使用声明 entity mux41 is -- 实体端口声明 port( rst:instd_logic;
s:in std_logic_vector(1 downto 0);
a,b,c,d: in std_logic;
y: out std_logic); end mux41;
architecture a of mux41 is --结构体功能描述语句
begin
process (rst,s,a,b,c,d)
28
begin
if(rst='1') then y<='0'; else
case s is -- case选择语句 when \"00\"=>y<=a; when \"01\"=>y<=b; when \"10\"=>y<=c; when \"11\"=>y<=d; when others=>null; end case;
end if;
end process; end a;
图4.8 4选1选择器仿真波形
3.54进制计数器模块
1)4进制计数器作为选择器的输入来控制选择器选择不同的频率作为输出控制扬声器工作。
Clk:输入信号 来为计数器提供工作频率。
Rst:输入信号 复位信号 使计数器的输出为“00”。
图4.9 4进制计数器
29
2) 4进制计数器模块VHDL程序编写及仿真
Library IEEE;
use ieee.std_logic_1164.all; -- IEEE库使用声明 entity counter_4 is -- 实体端口声明
port(clk,rst: in std_logic; -- 声明clk,clr是标准逻辑位
count_out: out integer range 0 to 3
);
end counter_4;
architecture a of counter_4 is begin
process(rst,clk)
variable temp:integer range 0 to 4; begin
if rst='1'then --如果rst为1,变量temp:为0,否则temp:=temp+1;
temp:=0;
elsif (clk'event and clk='1') then
temp:=temp+1; if(temp=4) then temp:=0; end if;
end if;
count_out<=temp; --把temp赋值给count_out
end process; end a;
30
图4.10 4进制计数器仿真波形
5系统结构及仿真
整个系统就是各个分模块组成来实现最后的彩灯控制功能,系统又两个时钟来控制一个是控制32进制计数器即控制彩灯控制模块来实现彩灯的不同输出,另一个时钟为分频器的输入来进行分频处理,最后用来控制扬声器发出不同的音乐,具体分频处理的时钟的频率比实现彩灯控制的时钟频率要高。
图 5.1 系统功能模块
31
图 5.2系统功能仿真波形
C 数字钟设计
1.系统设计要求
(1)设计一个数字钟,要求可以显示小时和分钟 (2)数字钟中采用同步时钟控制 (3)为了增加设计难度和更深刻地理解数字钟的设计原理,系统设计师要求采用74161(16
进制计数器)设计完成,不得使用74160(10进制计数器)
32
2.系统设计和仿真验证
2.1 整体方案设计
图1 数字钟整体方案设计
33
2.2 端口设计说明
VCC:电源,接+5V,对整个系统供电。
EN:使能端,当EN=1时,数字钟系统开始运行;当EN=0时,系统暂停计数。 GND:接地端
QHH0,QHH1,QHH2,QHH3:时钟输出小时显示高位 QHL0,QHL1,QHL2,QHL3:时钟输出小时显示低位 QMH0,QMH1,QMH2,QMH3:时钟输出分钟显示高位 QML0,QML1,QML2,QML3:时钟输出分钟显示低位
2.3功能仿真
图2 EN使能端功能验证
图3 数字钟功能仿真验证
34
3. VHDL设计和RTL视图
3.1 对应的的顶层VHDL设计
-- Copyright (C) 1991-2009 Altera Corporation
-- Your use of Altera Corporation's design tools, logic functions -- and other software and tools, and its AMPP partner logic -- functions, and any output files from any of the foregoing -- (including device programming or simulation files), and any -- associated documentation or information are expressly subject -- to the terms and conditions of the Altera Program License -- Subscription Agreement, Altera MegaCore Function License -- Agreement, or other applicable license agreement, including, -- without limitation, that your use is for the sole purpose of
-- programming logic devices manufactured by Altera and sold by -- Altera or its authorized distributors. Please refer to the -- applicable agreement for further details.
-- PROGRAM \"Quartus II 64-Bit\" -- VERSION \"Version 9.0 Build 132 02/25/2009 SJ Full Version\" -- CREATED ON \"Tue Sep 10 22:56:29 2013\"
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY work;
ENTITY digital_clock IS PORT ( EN : IN STD_LOGIC; CLK : IN STD_LOGIC; QML0 : OUT STD_LOGIC; QML1 : OUT STD_LOGIC; QML2 : OUT STD_LOGIC; QML3 : OUT STD_LOGIC; QMH0 : OUT STD_LOGIC; QMH1 : OUT STD_LOGIC; QMH2 : OUT STD_LOGIC; QMH3 : OUT STD_LOGIC; QHL0 : OUT STD_LOGIC;
35
QHL1 : OUT STD_LOGIC; QHL2 : OUT STD_LOGIC; QHL3 : OUT STD_LOGIC; QHH0 : OUT STD_LOGIC; QHH1 : OUT STD_LOGIC; QHH2 : OUT STD_LOGIC; QHH3 : OUT STD_LOGIC );
END digital_clock;
ARCHITECTURE bdf_type OF digital_clock IS
ATTRIBUTE black_box : BOOLEAN; nATTRIBUTEnoopt : BOOLEAN;
COMPONENT \\74161_0\\ PORT(CLRN : IN STD_LOGIC; CLK : IN STD_LOGIC; ENP : IN STD_LOGIC; LDN : IN STD_LOGIC; A : IN STD_LOGIC; D : IN STD_LOGIC; ENT : IN STD_LOGIC; B : IN STD_LOGIC; C : IN STD_LOGIC; QD : OUT STD_LOGIC; QC : OUT STD_LOGIC; QB : OUT STD_LOGIC; QA : OUT STD_LOGIC); END COMPONENT;
ATTRIBUTE black_box OF \\74161_0\\: COMPONENT IS true; ATTRIBUTE noopt OF \\74161_0\\: COMPONENT IS true;
COMPONENT \\74161_1\\ PORT(CLRN : IN STD_LOGIC; CLK : IN STD_LOGIC; ENP : IN STD_LOGIC; LDN : IN STD_LOGIC; A : IN STD_LOGIC; D : IN STD_LOGIC; ENT : IN STD_LOGIC; B : IN STD_LOGIC; C : IN STD_LOGIC; QD : OUT STD_LOGIC;
36
QC : OUT STD_LOGIC; QB : OUT STD_LOGIC; QA : OUT STD_LOGIC); END COMPONENT;
ATTRIBUTE black_box OF \\74161_1\\: COMPONENT IS true; ATTRIBUTE noopt OF \\74161_1\\: COMPONENT IS true;
COMPONENT \\74161_2\\ PORT(CLRN : IN STD_LOGIC; CLK : IN STD_LOGIC; ENP : IN STD_LOGIC; LDN : IN STD_LOGIC; A : IN STD_LOGIC; D : IN STD_LOGIC; ENT : IN STD_LOGIC; B : IN STD_LOGIC; C : IN STD_LOGIC; QD : OUT STD_LOGIC; QC : OUT STD_LOGIC; QB : OUT STD_LOGIC; QA : OUT STD_LOGIC); END COMPONENT;
ATTRIBUTE black_box OF \\74161_2\\: COMPONENT IS true; ATTRIBUTE noopt OF \\74161_2\\: COMPONENT IS true;
COMPONENT \\74161_3\\ PORT(CLRN : IN STD_LOGIC; CLK : IN STD_LOGIC; ENP : IN STD_LOGIC; LDN : IN STD_LOGIC; A : IN STD_LOGIC; D : IN STD_LOGIC; ENT : IN STD_LOGIC; B : IN STD_LOGIC; C : IN STD_LOGIC; QD : OUT STD_LOGIC; QC : OUT STD_LOGIC; QB : OUT STD_LOGIC; QA : OUT STD_LOGIC); END COMPONENT;
ATTRIBUTE black_box OF \\74161_3\\: COMPONENT IS true; ATTRIBUTE noopt OF \\74161_3\\: COMPONENT IS true;
SIGNAL SYNTHESIZED_WIRE_48 : STD_LOGIC;
37
SIGNAL SYNTHESIZED_WIRE_49 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_50 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_51 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_52 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_17 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_18 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_53 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_54 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_22 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_55 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_25 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_27 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_30 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_56 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_43 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_46 : STD_LOGIC; SIGNAL SYNTHESIZED_WIRE_47 : STD_LOGIC;
BEGIN
QML0 <= SYNTHESIZED_WIRE_47; QML3 <= SYNTHESIZED_WIRE_46; QMH0 <= SYNTHESIZED_WIRE_17; QMH2 <= SYNTHESIZED_WIRE_18; QHL0 <= SYNTHESIZED_WIRE_54; QHL1 <= SYNTHESIZED_WIRE_27; QHL3 <= SYNTHESIZED_WIRE_22; QHH1 <= SYNTHESIZED_WIRE_25; SYNTHESIZED_WIRE_48 <= '1'; SYNTHESIZED_WIRE_50 <= '0';
b2v_inst : 74161_0
PORT MAP(CLRN => SYNTHESIZED_WIRE_48, CLK => CLK, ENP => SYNTHESIZED_WIRE_48, LDN => SYNTHESIZED_WIRE_49, A => SYNTHESIZED_WIRE_50, D => SYNTHESIZED_WIRE_50, ENT => EN, B => SYNTHESIZED_WIRE_50, C => SYNTHESIZED_WIRE_50, QD => SYNTHESIZED_WIRE_46,
38
QC => QML2, QB => QML1, QA => SYNTHESIZED_WIRE_47);
b2v_inst1 : 74161_1
PORT MAP(CLRN => SYNTHESIZED_WIRE_48, CLK => CLK, ENP => SYNTHESIZED_WIRE_48, LDN => SYNTHESIZED_WIRE_51, A => SYNTHESIZED_WIRE_50, D => SYNTHESIZED_WIRE_50, ENT => SYNTHESIZED_WIRE_52, B => SYNTHESIZED_WIRE_50, C => SYNTHESIZED_WIRE_50, QD => QMH3, QC => SYNTHESIZED_WIRE_18, QB => QMH1, QA => SYNTHESIZED_WIRE_17);
SYNTHESIZED_WIRE_52 <= NOT(SYNTHESIZED_WIRE_49);
SYNTHESIZED_WIRE_51 <= NOT(SYNTHESIZED_WIRE_52 AND SYNTHESIZED_WIRE_17 AND SYNTHESIZED_WIRE_18);
SYNTHESIZED_WIRE_53 <= NOT(SYNTHESIZED_WIRE_51);
SYNTHESIZED_WIRE_55 <= NOT(SYNTHESIZED_WIRE_53 AND SYNTHESIZED_WIRE_54 AND SYNTHESIZED_WIRE_22);
SYNTHESIZED_WIRE_43 <= NOT(SYNTHESIZED_WIRE_55);
SYNTHESIZED_WIRE_56 <= NOT(SYNTHESIZED_WIRE_53 AND SYNTHESIZED_WIRE_25 AND SYNTHESIZED_WIRE_54 AND SYNTHESIZED_WIRE_27);
39
b2v_inst2 : 74161_2
PORT MAP(CLRN => SYNTHESIZED_WIRE_48, CLK => CLK, ENP => SYNTHESIZED_WIRE_48, LDN => SYNTHESIZED_WIRE_30, A => SYNTHESIZED_WIRE_50, D => SYNTHESIZED_WIRE_50, ENT => SYNTHESIZED_WIRE_53, B => SYNTHESIZED_WIRE_50, C => SYNTHESIZED_WIRE_50, QD => SYNTHESIZED_WIRE_22, QC => QHL2, QB => SYNTHESIZED_WIRE_27, QA => SYNTHESIZED_WIRE_54);
SYNTHESIZED_WIRE_30 <= SYNTHESIZED_WIRE_56 AND SYNTHESIZED_WIRE_55;
b2v_inst3 : 74161_3
PORT MAP(CLRN => SYNTHESIZED_WIRE_48, CLK => CLK, ENP => SYNTHESIZED_WIRE_48, LDN => SYNTHESIZED_WIRE_56, A => SYNTHESIZED_WIRE_50, D => SYNTHESIZED_WIRE_50, ENT => SYNTHESIZED_WIRE_43, B => SYNTHESIZED_WIRE_50, C => SYNTHESIZED_WIRE_50, QD => QHH3, QC => QHH2, QB => SYNTHESIZED_WIRE_25, QA => QHH0);
SYNTHESIZED_WIRE_49 <= NOT(SYNTHESIZED_WIRE_46 AND SYNTHESIZED_WIRE_47);
END bdf_type;
40
3.2 底部元件74161_0,74161_1,74161_2和74161_3 VHDL设计
(此处仅以74161_0 VHDL设计举例,其余同)
LIBRARY ieee;
USE ieee.std_logic_1164.all; LIBRARY work;
ENTITY 74161_0 IS PORT ( CLRN : IN STD_LOGIC; CLK : IN STD_LOGIC; ENP : IN STD_LOGIC; LDN : IN STD_LOGIC; A : IN STD_LOGIC; D : IN STD_LOGIC; ENT : IN STD_LOGIC; B : IN STD_LOGIC; C : IN STD_LOGIC; QD : OUT STD_LOGIC; QC : OUT STD_LOGIC; QB : OUT STD_LOGIC; QA : OUT STD_LOGIC );
END 74161_0;
ARCHITECTURE bdf_type OF 74161_0 IS BEGIN
-- instantiate macrofunction
b2v_inst : 74161
PORT MAP(CLRN => CLRN, CLK => CLK, ENP => ENP, LDN => LDN, A => A, D => D, ENT => ENT, B => B, C => C, QD => QD, QC => QC,
41
QB => QB, QA => QA);
ENDbdf_type;
3.3 RTL视图
图4 对应的RTL视图
D设计心得
这次的EDA课程设计有一周的时间,在这一周的时间里我们充分合理的安排了自己的时间来使本次的课程设计能够顺利的完成,当然我们在本次的设计中并不是一帆风顺的,我们遇到了一些的问题,例如我们开始时用的文本的方式用一个总的程序来完成,可以在设计的过程中我们发现程序编到后面变量越到很容易搞混淆同时各个进程间的联系也越来越模糊以至于后面我们自己都不知道程序的整体框图是什么,导致后面不能够继续下去,后面我们再一次对我们这次的设计题目进行了分析和整理,最后我和我的同伴决定采用分模块的方式来完成本次的课题设计,当然最重要的是分析各个模块间的关系。最后我们采用上面分析的结构框图。最后我们的设计很成功,仿真和硬件测试都是正确的,实现了我们的设计要求和目的。
42
在这次设计中我们收获了很多,首先最直接的收获就是我们巩固了这门课程所学过的知识,把它运用到了实践当中,并且学到了很多在书本撒和那个所没有学到的知识,通过查阅相关资料进一步加深了对EDA的了。总的来说,通过这次课程设计不仅锻炼了我们的动手和动脑能力,也使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,要把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。在我们的共同努力和指导老师的指引下我们圆满的完成了设计,实现了设计目的。
43
XXXXXXXXXXXXXXXXXXX
2013/9/6
因篇幅问题不能全部显示,请点此查看更多更全内容