1、4.1分频模块设计分频模块主要利用2Khz的时钟信号进行分频。得到1s的clock 时钟信号,用于计数模块的时钟信号。分频程序端口图如下: 4.2 时间设置模块设计时间设定模块主要用于对时间设定初始值而用,其中设有clk 和clock 两时钟信号,分别用于外接按钮信号和减计数。设定时间采用四个按钮控制,sec1、sec10、min1、min10 分别为 一秒,十秒,一分,十分的控制信号。而信号 tSec1、tSec10、tMin1、tMin10 为传递信号,传递给显示模块。时间设置模块端口图:clk 信号 用于检测按钮的状态 ,当有按钮按下时,则相应的时间信号 加一 。 但 sec1 、 mi
2、n1 、min10最大为 9 ,累加至9后,再次按下按钮累加则置0。sec10 为十秒位 所以最大为 5 ,再次按下累加则置零。 4.3减计数模块设计当 检测到 start 按钮按下时 则启动减计数程序 开始减计数。 减计数模块端口图:( 1 ) 开始减计数后,判断,秒位是否为0000,不为零则依据 clock 时钟开始递减。为零则置位 借位判断位 borrow ,向十秒为借位。( 2 ) 当十秒为不为零时,如果 borrow 位 为1 则 减一后清零借位信号 borrow ,置位 一秒位为 1001 即为 9 。如果十秒位为零 borrow 为 1 ,则向一分位借位 。( 3 ) 当一分不为
3、零 ,如果borrow 信号为 1 则 减一 清零借位信号borrow ,置位 十秒为 0101 即为 5 ,置位 一秒位 为 1001如果一分位为零 borrow 为 1 ,则向十分位借位 。( 4 ) 当十分位不为零 ,如果 borrow 位 为 1 则 减一后清零借位信号 borrow ,置位 一分位和 一秒位 为 即为 9 ,置位 十秒位 为 。为零则 减计数完毕 。置位 tSec1 、tSec10 、 tMin1 、tMin10 为 1111结束减计数程序。 4.4显示译码模块 显示译码模块采用动态扫描位选输出数据,不需对四个数码管都进行绑定。同时负责 test 信号的处理。当 te
4、st 按钮按下时 ,不再接收进程间传递信号tSec1、tSec10、tMin1、tMin10 的数据 ,直接给数码管送段码显示 1111111显示译码模块端口图:显示译码负责对 0 - 9 的数字进行编码 编码表如下:还需对 完成信号 CDEF 进行编码 :C 为 0111001;D 为 0111111E 为 1111001F 为 1110001显示译码模块的设计,由于加热完毕需要显示为所以采用了对每一位数码管单独设计译码模块。 检测到 时,各位显示对应的字符。还需要注意对其他状态的处理,每个数码管只需要显示 0-9 和 一个 状态,还需对其他状态 置零处理 。5 各模块的时序仿真图5.1分频
5、时序仿真:软件仿真采用的时钟周期为 1us,所以分频后得到的时间为2ms 。5.2 时间初始化时序图仿真其中t0,t1,t2,t3 为输出显示信号,为方便观察tSec1,tSec10,tMin1,tMin10的数据,加入的测试信号 5.3 减计数时序仿真:5.4动态扫描仿真:5.5软件仿真其中t0,t1,t2,t3 为输出显示信号,为方便观察tSec1,tSec10,tMin1,tMin10的数据,加入的测试信号5.6程序和代码Library ieee ;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_
6、logic_unsigned.all;entity microwave is port( clk,start,reset,test: in std_logic; min10,min1,sec10,sec1 : - 为设定时间的10分钟位 1分钟位 10秒钟位 light: out std_logic; - 启动输出显示灯 selectLed: out std_logic_vector( 2 downto 0); - 数码管位选控制信号 led : out std_logic_vector(6 downto 0) - 数码管 段码 );end microwave;architecture con
7、troller of microwave is signal tMin10,tMin1,tSec10,tSec1 : std_logic_vector(3 downto 0);- 最大设定时间为 99分59秒 signal clock : std_logic; begin setClock:process(clk,reset) - 分频模块 - variable setFreq : integer range 2002 downto 0 ; - 设置选定频 begin if reset = 1 then clock = 0 setFreq := 0 ; elsif clkevent and c
8、lk = = setFreq + 1; if setFreq = 2000 then setFreq := 0; clock = not clock ; end if; end if; end process; - 显示时间处理模块 - setTime:process(min10,min1,sec10,sec1,reset,test,start,clock) variable time0,time1,time2,time3 :- 最大设定时间为 99分59秒(5999s) variable timeTotal : std_logic_vector(15 downto 0); variable
9、turnOn : if start = turnOn : ; light elsif reset = if turnOn = if reset = time3 := - 复位处理 elsif min10event and min10 = then - 设置十分位时间 if time3 9 then time3 := time3 + 1; else - 十分位最大为9,超过置0 end if; time2 : elsif min1event and min1 = then - 设置一分位时间 if time2 time2 := time2 + 1; - 一分位最大为9,超过置0 time1 :
10、elsif sec10event and sec10 = then - 设置十秒位时间 if time1 5 then - 十秒位最大为5 time1 := time1 + 1; else - 十秒位最大为5,超过置0 time0 : elsif sec1event and sec1 = then - 设置一秒位时间 if time0 time0 := time0 + 1; - 一秒位最大为9,超过置0 elsif clockevent and clock = if turnOn = then timeTotal := time3&time2&time1&time0; - 并置各个时间位 if
11、 timeTotal 0 then time0 := time0 - 1;- 不需要借位则直接用一秒位减一 end if; tSec1 = time0; tSec10 = time1; tMin1 = time2; tMin10 led3 :000100001100010101101100111001111010011001101101101011011111010111000011110001101111 -加热完毕 输出 C when others = - 异常情况都输出 end case; case tMin1 is - 显示译码模块 led2 :D case tSec10 is - 显
12、示译码模块 led1 : -10秒位最大为5E case tSec1 is - 显示译码模块 led0 :Fwhen others = if clk then - 扫描显示 if count = 011 then - 只需四个数码管, count :000 else count := count + 1; selectLed = count; if testOn = led case count is - 依据位码选择对应数码管显示 when led null; end case; end controller;6总结这门语言更难以控制,即使实现很简单的功能,都很可能出现错误。在处理一个个错误
13、的过程中,也开始逐渐熟悉这门语言。明白VHDL的 相对硬件实现的便利和强大。整个设计中,只是用了三个进程。一个用于分频,产生1s的clock 信号。一个用于设定时间和减计数。还有一个用于译码显示。三个进程中通过clock 信号 传递时钟信号,通过 tSec1 、 tSec10 tMin1 、 tMin10 传递数码管各位的数值。随这科学技术的不断发展,EDA已经成为硬件设计的重要部分。实习中也逐渐认可这一点。学好这一门课必将为以后的发展打下很好的基础。两周实习,的确比在上课所学到的多得多。7 参考文献1. 潘松,黄继业. EDA技术与VHDL. 北京:清华大学出版社,20052. 赵全利,秦春.EDA技术及应用教程.机械工业出版社,2012
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1