石家庄经济学院
华信学院
数字逻辑课程设计报告
题 目 数字秒表
姓 名
学 号
班 号
指导老师
成 绩
20##年6月
目 录
1. 课程设计目的·······················································································
2. 开发工具选择·······················································································
3. 设计方案 ···························································································
4. 模块描述····························································································
5. VHDL实现··························································································
6. 调试仿真······························································································
7. 课程设计回顾总结 ···············································································
参 考 文 献 ····························································································
附录 ······································································································
1课程设计目的
(1) 设计一个数字秒表,计时范围是0秒----59分59.9秒。
(2) 复位开关可在任何情况下使用,只要按一下复位开关,计时器就清零,并做好下次计时的准备。
(3) 具有启/停开关,按一下启/停开关,启动计时器开始计时,再按一下启/停开关则停止计时。
2开发工具选择
(1) 硬件描述语言
数字秒表的设计采用了功能强大的VHDL语言,它具有很强的行为能力描述,设计方法灵活,可以支持库和模块设计方法。
(2) QuartusII软见开发工具
本设计采用的软见开发工具是美国的Altera公司的QuartusII,它支持多种设计输入方法,包括原理图输入、文本输入。
(3) EDA实验开发系统
本设计采用的EDA实验开发系统,主要用于提供可编程逻辑器件的下载电路及EDA实验开发的外围资源,供硬件验证用。
3设计方案
本课题所设计的数字秒表,使用模块设计的思想,设置一个控制器模块,然后进行选择,若按一次启/停开关时,则进入计时模块,数字秒表开始计时,此时译码模块将时钟信号转化为七段字形码,而显示模块则将计时的0.1秒、秒个位、秒十位、分个位、分十位信号实时显示出来。
流程图如下:
4模块描述
(1) 模块一:控制器
包括复位开关和启/停开关。复位开关可在任何情况下使用,只要按一下复位开关,计时器就清零,并做好下次计时的准备;按一下启/停开关,启动计时器开始计时,再按一下启/停开关则停止计时。
(2) 模块二:计时
按下启/停开关后,根据时钟开始计时,计时范围是0秒----59分59.9秒,秒表的计时时钟信号,时钟周期为0.1s。仿真中用10ns模拟0.1s,避免仿真时间过长,省去分频电路,计时模块由三个十进制计数器和两个六进制计数器构成,用十进制计数器表示0.1秒和秒个位、分个位,用六进制计数器表示秒十位和分十位。
(3) 模块三显示:
将时钟信号转化成七段字形码,共包含7个共阴极的led数码管,阴级接低电平,每个数码管的a---g输入来自一个bcd-七段字形译码器的输出,因此,共需要7个bcd-七段字形译器,分别显示0.1秒、分隔符、秒个位、秒十位、分隔符、分个位、分十位。
模块图如下:
5 VHDL实现
(1)计时模块六进制:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY liujinzhi IS
PORT(CLK,reset,EN:IN STD_LOGIC;
CN: OUT STD_LOGIC;
COUNT6:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END liujinzhi;
ARCHITECTURE ART OF liujinzhi IS
SIGNAL SCOUNT6: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
COUNT6<=SCOUNT6;
PROCESS(CLK,reset,EN)
BEGIN
IF(reset='1')THEN
SCOUNT6<="0000";CN<='0';
ELSIF RISING_EDGE(CLK)THEN
IF(EN='1')THEN
IF SCOUNT6="0101"THEN
SCOUNT6<="0000";CN<='1';
ELSE
SCOUNT6<=SCOUNT6+'1';CN<='0';
END IF;
END IF;
END IF;
END PROCESS;
END ART;
(2)计时模块十进制:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY shijinzhi IS
PORT(CLK: IN STD_LOGIC;
reset: IN STD_LOGIC;
EN: IN STD_LOGIC;
CN: OUT STD_LOGIC;
COUNT10:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END shijinzhi;
ARCHITECTURE ART OF shijinzhi IS
SIGNAL SCOUNT10: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
COUNT10<=SCOUNT10;
PROCESS(CLK,reset,EN)
BEGIN
IF(reset='1')THEN
SCOUNT10<="0000";CN<='0';
ELSIF RISING_EDGE(CLK)THEN
IF(EN='1')THEN
IF SCOUNT10="1001"THEN
CN<='1';
SCOUNT10<="0000";
ELSE
CN<='0';
SCOUNT10<=SCOUNT10+'1';
END IF;
END IF;
END IF;
END PROCESS;
END ART;
(3)译码七段译码器:
library ieee;
use ieee.std_logic_1164.all;
entity display_7448 is
port(
lt:in std_logic;
bi:in std_logic;
rbi:in std_logic;
rbo:out std_logic;
a:in std_logic_vector(3 downto 0);
segout:out std_logic_vector(6 downto 0));
end display_7448;
architecture display_7448p of display_7448 is
begin
process(lt,bi,a)
begin
if(lt='1' and bi='1' and rbi='1' and a="0000")then
segout<="1111110";rbo<='1';
elsif(lt='1' and bi='1' and a="0001")then
segout<="0110000";rbo<='1';
elsif(lt='1' and bi='1' and a="0010")then
segout<="1101101";rbo<='1';
elsif(lt='1' and bi='1' and a="0011")then
segout<="1111001";rbo<='1';
elsif(lt='1' and bi='1' and a="0100")then
segout<="0110011";rbo<='1';
elsif(lt='1' and bi='1' and a="0101")then
segout<="1011011";rbo<='1';
elsif(lt='1' and bi='1' and a="0110")then
segout<="0011111";rbo<='1';
elsif(lt='1' and bi='1' and a="0111")then
segout<="1110000";rbo<='1';
elsif(lt='1' and bi='1' and a="1000")then
segout<="1111111";rbo<='1';
elsif(lt='1' and bi='1' and a="1001")then
segout<="1110011";rbo<='1';
elsif bi='0' then
segout<="0000000";
rbo<='0';
elsif(lt='0' and bi='1')then
segout<="1111111";
rbo<='1';
end if;
end process;
end display_7448p;
附录:顶层原件原理图设计shuzimiaobiao\miaobiao.bdf
6调试仿真
1六进制:
图1 六进制计数器仿真图
如图所示,秒表计时开始,用周期为10ns的时钟信号clk模拟0.1s的时钟clk,可见,每来一个clk,COUNT6加1,当加到0101(6)时,再来一个clk,COUNT再次从0开始计数,CN代表进位,EN为启/停键,秒表计时过程中,按下启/停键使EN=0,计时停止,再按下启/停键使EN=1,计时继续。reset为复位键,当reset=1时,秒表计时清零。
2十进制:
图2 十进制计数器仿真图
如图所示,秒表计时开始,用周期为10ns的时钟信号clk模拟0.1s的时钟clk,可见,每来一个clk,COUNT10加1,当加到1001(9)时,再来一个clk,COUNT再次从0开始计数,CN代表进位,EN为启/停键,秒表计时过程中,按下启/停键使EN=0,计时停止;再按下启/停键使EN=1,计时继续。reset为复位键,当reset=1时,秒表计时清零。
3七段字形译码器:
图3七段字形译码器仿真图
如图所示,输出信号segouta_g为输入信号a所对应的七段字形码。
4数字秒表:
图4 数字秒表仿真图
如图所示,s1-s7分别显示0.1秒、分隔符、秒个位、秒十位、分隔符、分个位、分十位。秒个位及分个位为十进制,秒十位及分十位为六进制。EN为启/停键,秒表计时过程中,按下启/停键使EN=0,计时停止,再按下启/停键使EN=1,计时继续。reset为复位键,当reset=1时,秒表计时清零。由上述仿真图可知,该数字秒表达到了设计要求。
7课程设计回顾总结
VHDL语言是一种很有用的硬件描述语言,通过两周的学习与实践终于基本实现了老师要求的设计,通过自己动手实践和同学们的交流,研究完成了一次设计,掌握了设计应有的基本流程,很开心,也使我对EDA课程VHDL语言有了更深刻的了解,同时也增加了我的兴趣。通过仿真分析可以看出,该数字秒表达到了设计要求。本课题提出的数字秒表采用模块化设计方法,底层的元件使用硬件描述语言 VHDL进行描述,顶层采用原理图的方法。依靠计算机,借助EDA开发工具,实现系统功能。
数字秒表的计时范围是0秒----59分59.9秒,复位开关可在任何情况下使用,只要按一下复位开关,计时器就清零,并做好下次计时的准备;具有启/停开关,按一下启/停开关,启动计时器开始计时,再按一下启/停开关则停止计时。操作比较方便。总之该数字秒表具有较好的应用前景。
参考文献
【1】《数字逻辑原理与VHDL设计》
【2】《逻辑与数字系统设计》
第二篇:20xx年数字逻辑课程设计报告
石家庄经济学院
信息工程学院
数字逻辑课程设计报告
题 目 数字锁的设计
姓 名
学 号
班 号
指导老师
成 绩
20##年6月
目 录
1. 功能描述··························································································· 3
2. 开发工具选择····················································································· 3
3. 设计方案 ·························································································· 3
4. 模块描述·························································································· 4
5. VHDL实现························································································· 5
6. 调试仿真··························································································· 13
7. 课程设计回顾总结 ············································································ 15
参 考 文 献 ························································································· 15
附录 ··································································································· 15
一. 功能描述
数字锁即电子密码锁,锁内有若干密码,所用密码可由用户自己选定。如果输入代码与锁内密码一致,锁被打开;否则,应封闭开锁电路,并发出警告信号。
设计的八位并行数码锁:
(1) 开锁代码为8位二进制数,当输入代码的位数和位值与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮开锁指示灯LT。否则,系统进行错误状态,并发出警报信号。
(2) 开锁程序由设计者确定,并要求锁内给定的密码是可调的,且预置方便,保密性好。
(3) 数字锁的报警方式是点亮指示灯LF,并使喇叭鸣叫来报警,直到按下复位开关,警报才停止。此时,数字锁又自动进入等待下一次开锁的状态。
二.开发工具选择
(1)硬件描述语言
电子密码锁的设计采用了功能强大的VHDL语言,它具有很强的行为能力描述,设计方法灵活,可以支持库和模块设计方法。
(2)QuartusII软见开发工具
本设计采用的软见开发工具是美国的Altera公司的QuartusII,它支持多种设计输入方法,包括原理图输入、文本输入。
(3)EDA实验开发系统
本设计采用的EDA实验开发系统,主要用于提供可编程逻辑器件的下载电路及EDA实验开发的外围资源,供硬件验证用。
三.设计方案
本文所设计的电子密码锁,使用模块设计的思想:开始输入八位密码数字,然后进行选择,若选择开关S=0时,进行改密码并存入寄存器中;S-1时,进行开锁。若开锁成功,灯LT=1,开锁失败,灯LF=1且喇叭LB=1进行鸣笛。
流程图如下:
四.模块描述
1.模块一:简单选择
输入密码后,进行选择,S=0就改密码,S=1就进行下一步开锁。
2.模块二:寄存器
若进行改密码,则所改密码存入寄存器等待下一次比较;若进行开锁,则输出存在寄存器中原有的密码。
3.模块三:比较器
若寄存器中存入的密码与进行开锁比较的密码相等,则开锁成功,指示灯LT=1;否则开锁失败,指示灯LF=1,喇叭LB=1进行鸣笛。
4.模块四:复位
开锁成功指示灯LT亮,按下复位键CLK=0,灯灭返回待选择状态。
5.模块五:复位与门
开锁失败指示灯LF亮,按下复位CLK=0,灯灭返回。
6.模块六:与门
开锁失败喇叭LB鸣笛,按下复位CLK=0,停止鸣笛。
五:VHDL实现
1.模块一:简单选择
library ieee;
use ieee.std_logic_1164.all;
entity add is
port(D:in std_logic_vector(7 downto 0);
EN:in std_logic;
Z0:out std_logic_vector(7 downto 0);
Z1:out std_logic_vector(7 downto 0));
end ;
architecture one of add is
begin
process(D,EN)
begin
if EN='0' then
Z0<=D;
Z1<=D;
END IF;
end process;
end one;
3.模块二:寄存器
library ieee;
use ieee.std_logic_1164.all;
entity REG8B is
port(CLK: in std_logic;
S:in std_logic;
D:in std_logic_vector(7 downto 0);
Q:out std_logic_vector(7 downto 0));
end;
architecture ONE of REG8B is
signal M: std_logic_vector(7 downto 0):="00000000";
begin
process(S,CLK)
begin
if CLK'event and CLK='1' then
case S is
when '1' => Q<=M;
WHEN OTHERS =>M<=D;
end case;
end if;
Q<=M;
end process;
end;
4.模块三:比较器
library ieee;
use ieee.std_logic_1164.all;
entity compare is
port(S:in std_logic;
D1:in std_logic_vector(7 downto 0);
D2:in std_logic_vector(7 downto 0);
LT:out std_logic;
LF:out std_logic;
LB:out std_logic);
end;
architecture ONE of compare is
begin
process(S,D1)
begin
if S='0' then
LF<='0';
LB<='0';
LT<='0';
elsif( D1=D2) then
LT<='1';
LF<='0';
LB<='0';
else
LF<='1';
LB<='1';
LT<='0';
end if;
end process;
end;
5.模块四:复位
library ieee;
use ieee.std_logic_1164.all;
entity return1 is
port(a0,a1:in std_logic;
z0,z1:out std_logic);
end return1;
architecture one of return1 is
begin
z0<= a0 and a1;
z1<= a0 and a1;
end;
6.模块五:复位与门
library ieee;
use ieee.std_logic_1164.all;
entity yu2 is
port(a0,a1:in std_logic;
Z0:out std_logic);
end yu2;
architecture behave of yu2 is
begin
z0<=a0 and a1;
end behave;
7.模块六:与门
library ieee;
use ieee.std_logic_1164.all;
entity yu2 is
port(a0,a1:in std_logic;
Z0:out std_logic);
end yu2;
architecture behave of yu2 is
begin
z0<=a0 and a1;
end behave;
组合成总的VHDL语言实现:
library ieee;
use ieee.std_logic_1164.all;
entity numberlock is
port(D:in std_logic_vector(7 downto 0);
CLR:in std_logic; --复位
CLK:in std_logic; --时钟信号
S:in std_logic; --选择信号
EN:in std_logic;
LT:out std_logic; --开锁
LF:out std_logic; --警报
LB:out std_logic); --警报
end;
architecture one of numberlock is
component REG8B --寄存器
port(CLK: in std_logic;
S:in std_logic;
D:in std_logic_vector(7 downto 0);
Q:out std_logic_vector(7 downto 0));
end component;
component compare --比较器
port(S:in std_logic;
D1:in std_logic_vector(7 downto 0);
D2:in std_logic_vector(7 downto 0);
LT:out std_logic;
LF:out std_logic;
LB:out std_logic);
end component;
component yu2 --定义2输入与门
port(a0,a1:in std_logic;
Z0:out std_logic);
end component;
component add --定义
port(D:in std_logic_vector(7 downto 0);
EN:in std_logic;
Z0:out std_logic_vector(7 downto 0);
Z1:out std_logic_vector(7 downto 0));
end component;
component return1 --定义
port(a0,a1:in std_logic;
z0,z1:out std_logic);
end component;
signal temp1,temp2,temp3:std_logic_vector(7 downto 0);
signal temp4,temp5,temp6,temp7:std_logic;
begin
U1:add port map(D=>D,EN=>temp7,Z0=>temp1,Z1=>temp2);
U2:REG8B port map(S=>S,D=>temp1,CLK=>CLK,Q=>temp3);
U3:compare port map(S=>S,D1=>temp3,D2=>temp2,LT=>temp4,LF=>temp5,LB=>temp6);
U4:return1 port map(a0=>CLR,a1=>temp4,Z0=>LT,Z1=>temp7);
U5:yu2 port map(a0=>CLR,a1=>temp5,Z0=>LF);
U6:yu2 port map(a0=>CLR,a1=>temp6,Z0=>LB);
end;
六.调试仿真:
调试成功波形图如下:
1.
说明:上升沿有效,输入密码为00000000时,S选1进行开锁,开锁成功输出LT=1。
2.
说明:上升沿有效,输入密码01100000,选择S=0进行修改密码。
3.
说明:上升沿有效,输入修改后的密码01100000,选择开锁,开锁成功LT=1.
4.
说明:输入密码00001100进行开锁,00001100不等于01100000,开锁失败LF=1,LB=1。
5.
说明:开锁成功后进行复位,成功。
数据流描述显示图如下:
七.课程设计回顾总结:
这次的设计密码锁,从一开始的一点思路都没有,之后慢慢琢磨有了具体思路,还有老师的指导,进行了分模块的设计方案,逐个模块的进行编写调试,最终综合在一块,完成了整个的设计方案。通过这次课程设计,我更加清楚了如何从实物中进行研究来实现设计,更灵活的掌握了VHDL语言的编写与实现。
参考文献
《数字逻辑原理与VHDL设计》