目录
一、设计题目................................................................................2
二、设计任务和要求……………………………………………2
三、EDA 设计…………………………………………………...2
1. 设计的总体原理………………………………………….2
2. 仿真波形………………………………………………...3
四.硬件测试……………………………………………………3
1. 给出硬件实现 实验步骤…………………………………3
2. 硬件仿真结果 …………………………………………..5
五、实验困难问题及解决措施…………………………………6
六、实验参考文献………………………………………………7
七、附录…………………………………………………………8
1. 源程序…………………………………………………….8
2. 测试平台………………………………………………….12
3. 设计生成的RTL 电路图 ………………………………...14
八、指导教师评语………………………………………………15
一、设计题目
整点报时电路
二、设计任务及要求
此次的EDA 课程设计任务是整点报时电路,其主要目的是设计一个能够在整点时报时的程序,也是培养我们的实际动手能力,加深我们对EDA 这门课程的理解,增强我们对EDA 程序设计流程的掌握。这个课题还要求我们掌握计数器的设计,六十进制计数器和二十四进制计数器的设计方法,以及各个进制之间的连接关系。同时学习了复位功能实现的方法。
设计要求:
1. 具有时、分、秒,计数显示功能,以二十四时制循环计;
2. 设置复位开关,以满足重新运行功能;
3. 要求计时精度为0.01秒,最长时间为24H ;
4. 每当时钟运行到整点时,要求电路能推动扬声器发出与整点数目相等的音响声。例如:时钟到达10点,扬声器响10下
三、EDA 设计
1. 设计的总体原理 :
要实现一个整点报时系统,整个系统有数字钟,整点报时系统和复位系统组成。数字钟正常运行,每当分为零时将时的数值赋予蜂鸣器响应系统,就实现了整点报时,且扬声器发出与整点数目相等的音响声。
2. 仿真波形
图1 时序波形图
由程序及仿真波形图可以看出该时钟系统是由两个60进制计数器和一个24进制计数器组成,分和秒是60进制,时是24进制。当s1计数到9时s2增加1。,而s1变为0,当s2增加到5,而且s1为9时,s1,s2变为0,c1增加1向分计数器进位,提供一个分计数器的时钟信号。当c1计数到9时c2增加1。,而c1变为0,当c2增加到5,而且c1为9时,c1,c2变为0,h1增加1向时计数器进位,提供一个时计数器的时钟信号。当h1计数到9时s2增加1。,而s1变为0,当s2增加到2,而且s1为4时,,h1,h2变为0. 此时完成一个完整的计数周期。
四、硬件测试
1. 给出硬件实现 实验步骤:
⑴打开Quartus Ⅱ9.0软件,建立进程,进程的名字和程序的名字相同;
⑵打开新建选择VHDL File,然后把程序输入进去;
⑶保存文件点击软件页面上方的编译按键进行编译;
⑷编译成功后,进行软件仿真,点击File 选择Vector Waveform File,然后点击鼠标右键选inset node or bus键,把脚码输入进去,再进行脚码设定;
⑸然后保存,点击Assigment 中的settings 选择时序仿真,进行程序的时序仿真;
⑹时序仿真成功后,点击上方Assigment Editor键进行脚码锁定;脚码锁定中我们用了模式五。
图2 脚码锁定图
2. 硬件仿真结果
在这次设计中刚开始由于种种原因我们的硬件仿真结果没能够正常的显示出来, 经多次的努力我们修改了程序后, 最终仿真结果显示是正确的。下面我照了一些我们仿真的硬件结果, 如下图所示
:
图3 硬件仿真
1
图4 硬件仿真2
经过实际运行,此整点报时电路符合要求。键5为复位键,频率分别选择1024HZ 和1HZ 。为方便演示,数字钟从15时59分50秒开始运行,运行10秒后到16时0分0秒,蜂鸣器开始报时,一秒报一下,当运行到16时0分16秒的时候停止报时,正好报时17声。符合设计要求. 然后复位,恢复到15时59分50秒。
五、实验困难问题及解决措施
经过老师的指导和同学们的帮助,我对VHDL 这门课程逐步加深了了解,增加了我们的动手能力。但是在设计中遇到一些问题,在程序设计方面的问题在我们查阅大量相关资料后的到了解决,在程序软件的实现过程中所遇到的问题经过讨论最后也得到了圆满的解答。
我通过两个六十进制计数器和一个24小时计数器实现了时钟功能,其中秒和分计数器是六十进制计数器,时计数器是二十四计数器,并且秒和分各有一个进位端,秒到59时向分进一位,分到59时向时进一位,这个设计中的主要问题是时整点报时,并且几点报几下,开始想了很多种办法,都无法实现。后来我们经过商讨,让分为0,秒小于时的时候蜂鸣器报时,报时频率和时钟一致,最终实现了几点报几下的功能。
通过这次设计,我更加了解了VHDL 语言,并将课本上的知识形象化,提升了对这门课的兴趣,对这门课进行了一个系统的总结,加强了动手能力,增加了对GW48系列sopc/eda实验开发体统试验箱的认识和使用能力。
六、参考文献
[1] 潘松、黄继业,EDA 技术与VHDL[M],北京:清华大学出版社,2005 [2] 潘 松,EDA 技术实用教程[M],北京:科学出版社,2002
[3] 谭京生,EDA 技术及应用[M],西安:西安电子科技大学出版社,2001 [4] 徐志军,CPLD/FPGA的开发与应用[M],北京:电子工业出版社,2001 [5](美)Mark D.Birnbaum,电子设计自动化基础(英文影印版)[M],北京:机械工业出版社,2005
[6] 朱正伟,EDA 技术与应用[M],北京:清华大学出版社,2005 [7] 王金明,数字系统设计与Verilog HDL[M],北京:电子工业出版社,2000 [8] 潘 松,VHDL 实用教程[M],成都:电子科技大学出版社,2001 [9] 周祖成,电子设计硬件描述语言VHDL [M],北京:北京学苑出版社,2000 [10] 侯伯亭,VHDL 硬件描述语言与数字逻辑电路设计[M],西安:西安电子科技大学出版社,2001
[11] 边计年、薛宏熙,用VHDL 设计电子线路[M],北京:清华大学出版社,2000
[12] 任爱锋,基于FPGA 的嵌入式系统设计[M],西安:西安电子科技大学出版社,2004
七、附录
1. 源程序
Library ieee; --库说明 use ieee.std_logic_1164.all; --前面这几行,是用的package 即数据库
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity zdbs is --实体说明,zdbs 实体名
port --端口
(clk,rst :in std_logic;--clk、rst 为端口名,in 为端口类型,为输入,std_logic指的是标准逻辑数据类型。
clk_1024: in std_logic; --同上
spk: out std_logic; --为输出端口
h1,h2,s1,s2: out std_logic_vector(3 downto 0);
m1,m2: buffer std_logic_vector(3 downto 0));
end zdbs; --结束实体
architecture rtl of zdbs is --结构体rtl 为结构体名,zdbs 为上边的实体名
signal h,s:integer range 0 to 59;--h 、s 为整数从0到59 signal aleart : std_logic; --aleart为端口名
begin
process(clk) --开始进程
variable temp1:std_logic_vector(3 downto 0):="0001"; -- 定义了一个变量temp1,为“0001”
variable temp2:std_logic_vector(3 downto 0):="0101"; -- 定义了一个变量temp2,为“0101”
variable temp3:std_logic_vector(3 downto 0):="0101"; -- 定义了一个变量temp3,为“0101”
variable temp4:std_logic_vector(3 downto 0):="1001"; -- 定义了一个变量temp4,为“1001”
variable temp5:std_logic_vector(3 downto 0):="0101"; -- 定义了一个变量temp5,为“0101”
variable temp6:std_logic_vector(3 downto 0):="0000"; -- 定义了一个变量temp6,为“0000”
begin
if rst='1' then --当复位键rst 为1时,执行以下语句 temp1:="0001";
temp2:="0101";
temp3:="0101";
temp4:="1001";
temp5:="0101";
temp6:="0000";
else if (clk'event and clk='1') then --在当前一个相当小的时间间隔内,事件发生了,并且clk 为逻辑值1,然后执行下边的语句 temp6:=temp6+1; --让temp6加1
if(temp6=10)then
temp6:=(others=>'0');
temp5:=temp5+1; --让temp5加1
if (temp5=6)then
temp5:=(others=>'0');
temp4:=temp4+1; --让temp4加1
if(temp4=10)then
temp4:=(others=>'0');
temp3:=temp3+1; --让temp3加1
if(temp3=6)then
temp3:=(others=>'0');
temp2:=temp2+1; --让temp2加1
if(temp2=10)then
temp2:=(others=>'0');
temp1:=temp1+1; --让temp1加1
end if; --结束if 语句
if ((temp1=2)and(temp2=4)) then --当变量为temp1为2,temp2为4时,执行以下语句
temp1:=(others=>'0');
temp2:=(others=>'0');
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
h
s
h1
h2
m1
m2
s1
s2
end process; --结束process 进程
process(m1,m2,h,s) --开始进程
begin
if ((m1=0)and(m2=0)and(s
aleart
11
else
aleart
end if; --结束if 语句
end process; --结束process 进程
process(aleart,clk,clk_1024) --开始进程
begin
if (aleart='1') then
spk
else
spk
end if; --结束if 语句
end process; --结束process 进程
end rtl; --结束rtl 结构体
2. 测试平台
Library ieee;
use ieee.std_logic_1164.all;
entity test is
end test;
architecture behaviour of test is
signal sig_clk : std_logic :='0' ;
signal sig_clk_1024 : std_logic :='1';
signal sig_rst : std_logic :='0';
signal sig_h1 : std_logic_vector(3
12
downto 0);
signal sig_h2 : std_logic_vector(3 downto 0); signal sig_m1 : std_logic_vector(3 downto 0); signal sig_m2 : std_logic_vector(3 downto 0); signal sig_s1 : std_logic_vector(3 downto 0); signal sig_s2 : std_logic_vector(3 downto 0); signal sig_spk : std_logic;
constant period : time :=5 ns;
component zdbs port (
clk,clk_1024,rst : in std_logic;
m1,m2 : buffer std_logic_vector(3 downto 0);
spk : out std_logic;
h1,h2,s1,s2 : out std_logic_vector(3 downto 0)
);
end component;
begin
-- instance
u_zdbs : zdbs port map (
clk => sig_clk,
13
clk_1024 => sig_clk_1024, rst => sig_rst,
h1 => sig_h1,
h2 => sig_h2,
m1 => sig_m1,
m2 => sig_m2,
spk => sig_spk,
s1 => sig_s1,
s2 => sig_s2
);
process
begin
sig_clk
sig_rst
3. 设计生成的RTL 电路图
14
after 8 ns; after 20 ns;
附表:程序生成RTL 电路总图
八、指导教师评语
15
目录
一、设计题目................................................................................2
二、设计任务和要求……………………………………………2
三、EDA 设计…………………………………………………...2
1. 设计的总体原理………………………………………….2
2. 仿真波形………………………………………………...3
四.硬件测试……………………………………………………3
1. 给出硬件实现 实验步骤…………………………………3
2. 硬件仿真结果 …………………………………………..5
五、实验困难问题及解决措施…………………………………6
六、实验参考文献………………………………………………7
七、附录…………………………………………………………8
1. 源程序…………………………………………………….8
2. 测试平台………………………………………………….12
3. 设计生成的RTL 电路图 ………………………………...14
八、指导教师评语………………………………………………15
一、设计题目
整点报时电路
二、设计任务及要求
此次的EDA 课程设计任务是整点报时电路,其主要目的是设计一个能够在整点时报时的程序,也是培养我们的实际动手能力,加深我们对EDA 这门课程的理解,增强我们对EDA 程序设计流程的掌握。这个课题还要求我们掌握计数器的设计,六十进制计数器和二十四进制计数器的设计方法,以及各个进制之间的连接关系。同时学习了复位功能实现的方法。
设计要求:
1. 具有时、分、秒,计数显示功能,以二十四时制循环计;
2. 设置复位开关,以满足重新运行功能;
3. 要求计时精度为0.01秒,最长时间为24H ;
4. 每当时钟运行到整点时,要求电路能推动扬声器发出与整点数目相等的音响声。例如:时钟到达10点,扬声器响10下
三、EDA 设计
1. 设计的总体原理 :
要实现一个整点报时系统,整个系统有数字钟,整点报时系统和复位系统组成。数字钟正常运行,每当分为零时将时的数值赋予蜂鸣器响应系统,就实现了整点报时,且扬声器发出与整点数目相等的音响声。
2. 仿真波形
图1 时序波形图
由程序及仿真波形图可以看出该时钟系统是由两个60进制计数器和一个24进制计数器组成,分和秒是60进制,时是24进制。当s1计数到9时s2增加1。,而s1变为0,当s2增加到5,而且s1为9时,s1,s2变为0,c1增加1向分计数器进位,提供一个分计数器的时钟信号。当c1计数到9时c2增加1。,而c1变为0,当c2增加到5,而且c1为9时,c1,c2变为0,h1增加1向时计数器进位,提供一个时计数器的时钟信号。当h1计数到9时s2增加1。,而s1变为0,当s2增加到2,而且s1为4时,,h1,h2变为0. 此时完成一个完整的计数周期。
四、硬件测试
1. 给出硬件实现 实验步骤:
⑴打开Quartus Ⅱ9.0软件,建立进程,进程的名字和程序的名字相同;
⑵打开新建选择VHDL File,然后把程序输入进去;
⑶保存文件点击软件页面上方的编译按键进行编译;
⑷编译成功后,进行软件仿真,点击File 选择Vector Waveform File,然后点击鼠标右键选inset node or bus键,把脚码输入进去,再进行脚码设定;
⑸然后保存,点击Assigment 中的settings 选择时序仿真,进行程序的时序仿真;
⑹时序仿真成功后,点击上方Assigment Editor键进行脚码锁定;脚码锁定中我们用了模式五。
图2 脚码锁定图
2. 硬件仿真结果
在这次设计中刚开始由于种种原因我们的硬件仿真结果没能够正常的显示出来, 经多次的努力我们修改了程序后, 最终仿真结果显示是正确的。下面我照了一些我们仿真的硬件结果, 如下图所示
:
图3 硬件仿真
1
图4 硬件仿真2
经过实际运行,此整点报时电路符合要求。键5为复位键,频率分别选择1024HZ 和1HZ 。为方便演示,数字钟从15时59分50秒开始运行,运行10秒后到16时0分0秒,蜂鸣器开始报时,一秒报一下,当运行到16时0分16秒的时候停止报时,正好报时17声。符合设计要求. 然后复位,恢复到15时59分50秒。
五、实验困难问题及解决措施
经过老师的指导和同学们的帮助,我对VHDL 这门课程逐步加深了了解,增加了我们的动手能力。但是在设计中遇到一些问题,在程序设计方面的问题在我们查阅大量相关资料后的到了解决,在程序软件的实现过程中所遇到的问题经过讨论最后也得到了圆满的解答。
我通过两个六十进制计数器和一个24小时计数器实现了时钟功能,其中秒和分计数器是六十进制计数器,时计数器是二十四计数器,并且秒和分各有一个进位端,秒到59时向分进一位,分到59时向时进一位,这个设计中的主要问题是时整点报时,并且几点报几下,开始想了很多种办法,都无法实现。后来我们经过商讨,让分为0,秒小于时的时候蜂鸣器报时,报时频率和时钟一致,最终实现了几点报几下的功能。
通过这次设计,我更加了解了VHDL 语言,并将课本上的知识形象化,提升了对这门课的兴趣,对这门课进行了一个系统的总结,加强了动手能力,增加了对GW48系列sopc/eda实验开发体统试验箱的认识和使用能力。
六、参考文献
[1] 潘松、黄继业,EDA 技术与VHDL[M],北京:清华大学出版社,2005 [2] 潘 松,EDA 技术实用教程[M],北京:科学出版社,2002
[3] 谭京生,EDA 技术及应用[M],西安:西安电子科技大学出版社,2001 [4] 徐志军,CPLD/FPGA的开发与应用[M],北京:电子工业出版社,2001 [5](美)Mark D.Birnbaum,电子设计自动化基础(英文影印版)[M],北京:机械工业出版社,2005
[6] 朱正伟,EDA 技术与应用[M],北京:清华大学出版社,2005 [7] 王金明,数字系统设计与Verilog HDL[M],北京:电子工业出版社,2000 [8] 潘 松,VHDL 实用教程[M],成都:电子科技大学出版社,2001 [9] 周祖成,电子设计硬件描述语言VHDL [M],北京:北京学苑出版社,2000 [10] 侯伯亭,VHDL 硬件描述语言与数字逻辑电路设计[M],西安:西安电子科技大学出版社,2001
[11] 边计年、薛宏熙,用VHDL 设计电子线路[M],北京:清华大学出版社,2000
[12] 任爱锋,基于FPGA 的嵌入式系统设计[M],西安:西安电子科技大学出版社,2004
七、附录
1. 源程序
Library ieee; --库说明 use ieee.std_logic_1164.all; --前面这几行,是用的package 即数据库
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity zdbs is --实体说明,zdbs 实体名
port --端口
(clk,rst :in std_logic;--clk、rst 为端口名,in 为端口类型,为输入,std_logic指的是标准逻辑数据类型。
clk_1024: in std_logic; --同上
spk: out std_logic; --为输出端口
h1,h2,s1,s2: out std_logic_vector(3 downto 0);
m1,m2: buffer std_logic_vector(3 downto 0));
end zdbs; --结束实体
architecture rtl of zdbs is --结构体rtl 为结构体名,zdbs 为上边的实体名
signal h,s:integer range 0 to 59;--h 、s 为整数从0到59 signal aleart : std_logic; --aleart为端口名
begin
process(clk) --开始进程
variable temp1:std_logic_vector(3 downto 0):="0001"; -- 定义了一个变量temp1,为“0001”
variable temp2:std_logic_vector(3 downto 0):="0101"; -- 定义了一个变量temp2,为“0101”
variable temp3:std_logic_vector(3 downto 0):="0101"; -- 定义了一个变量temp3,为“0101”
variable temp4:std_logic_vector(3 downto 0):="1001"; -- 定义了一个变量temp4,为“1001”
variable temp5:std_logic_vector(3 downto 0):="0101"; -- 定义了一个变量temp5,为“0101”
variable temp6:std_logic_vector(3 downto 0):="0000"; -- 定义了一个变量temp6,为“0000”
begin
if rst='1' then --当复位键rst 为1时,执行以下语句 temp1:="0001";
temp2:="0101";
temp3:="0101";
temp4:="1001";
temp5:="0101";
temp6:="0000";
else if (clk'event and clk='1') then --在当前一个相当小的时间间隔内,事件发生了,并且clk 为逻辑值1,然后执行下边的语句 temp6:=temp6+1; --让temp6加1
if(temp6=10)then
temp6:=(others=>'0');
temp5:=temp5+1; --让temp5加1
if (temp5=6)then
temp5:=(others=>'0');
temp4:=temp4+1; --让temp4加1
if(temp4=10)then
temp4:=(others=>'0');
temp3:=temp3+1; --让temp3加1
if(temp3=6)then
temp3:=(others=>'0');
temp2:=temp2+1; --让temp2加1
if(temp2=10)then
temp2:=(others=>'0');
temp1:=temp1+1; --让temp1加1
end if; --结束if 语句
if ((temp1=2)and(temp2=4)) then --当变量为temp1为2,temp2为4时,执行以下语句
temp1:=(others=>'0');
temp2:=(others=>'0');
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
end if; --结束if 语句
h
s
h1
h2
m1
m2
s1
s2
end process; --结束process 进程
process(m1,m2,h,s) --开始进程
begin
if ((m1=0)and(m2=0)and(s
aleart
11
else
aleart
end if; --结束if 语句
end process; --结束process 进程
process(aleart,clk,clk_1024) --开始进程
begin
if (aleart='1') then
spk
else
spk
end if; --结束if 语句
end process; --结束process 进程
end rtl; --结束rtl 结构体
2. 测试平台
Library ieee;
use ieee.std_logic_1164.all;
entity test is
end test;
architecture behaviour of test is
signal sig_clk : std_logic :='0' ;
signal sig_clk_1024 : std_logic :='1';
signal sig_rst : std_logic :='0';
signal sig_h1 : std_logic_vector(3
12
downto 0);
signal sig_h2 : std_logic_vector(3 downto 0); signal sig_m1 : std_logic_vector(3 downto 0); signal sig_m2 : std_logic_vector(3 downto 0); signal sig_s1 : std_logic_vector(3 downto 0); signal sig_s2 : std_logic_vector(3 downto 0); signal sig_spk : std_logic;
constant period : time :=5 ns;
component zdbs port (
clk,clk_1024,rst : in std_logic;
m1,m2 : buffer std_logic_vector(3 downto 0);
spk : out std_logic;
h1,h2,s1,s2 : out std_logic_vector(3 downto 0)
);
end component;
begin
-- instance
u_zdbs : zdbs port map (
clk => sig_clk,
13
clk_1024 => sig_clk_1024, rst => sig_rst,
h1 => sig_h1,
h2 => sig_h2,
m1 => sig_m1,
m2 => sig_m2,
spk => sig_spk,
s1 => sig_s1,
s2 => sig_s2
);
process
begin
sig_clk
sig_rst
3. 设计生成的RTL 电路图
14
after 8 ns; after 20 ns;
附表:程序生成RTL 电路总图
八、指导教师评语
15