2.3 使能信号转换模块
数字秒表输入的开始和停止信号是单个脉冲信号, 而计数器要持续计数所需的使能信号是持续的高电平, 所以需要通过使能控制电路实现使能信号的转换。该模块的VHDL源程序以及Model-Sim仿真输出结果如下:
该模块源程序:
process (enablein)
begin
if (enablein'event and enablein='1') then
temp<= not temp;
end if ;
end process;
2.4 译码显示模块
由上面的设计可知, 计数器输出为二进制码,不能直接点亮数码管, 要想将计数结果通过数码管显示必须再设计一个七段译码电路, 以便将计数结果输出。通过分析可知该译码器是一个4输入, 7输出元件, 其真值表如表1所示:
根据以上真值表可写出译码电路VHDL源程序如下:
process (datainput)
begin
case datainput is
when " 0000" =>dataoutput<=" 0000010" ;
when " 0001" =>dataoutput<=" 1001111" ;
when " 0010" =>dataoutput<=" 0010001" ;
when " 0011" =>dataoutput<=" 0000101" ;
when " 0100" =>dataoutput<=" 1001100" ;
when " 0101" =>dataoutput<=" 0100100" ;
when " 0110" =>dataoutput<=" 0100000" ;
when " 0111" =>dataoutput<=" 0001111" ;
when " 1000" =>dataoutput<=" 0000000" ;
when " 1001" =>dataoutput<=" 0000100" ;
when others=>dataoutput<=" 1111111" ;
end case;
end process;
3 功能验证以及下载实现
完成以上各个子模块的设计后, 该数字秒表的模块设计就基本完成了, 剩下的工作就是通过一个顶层文件将各个子模块连接起来。在顶层文件中可以将以上各个子模块看作一个个黑匣子,只将其输入输出端对应相连就可以了。下面是该顶层文件的VHDL源程序:
architecture Behavioral of topfile is
signal clk:std_logic:='0';
signal enableout:std_logic:='0';
signal data0,data1,data2,
data3,data4,data5:std_logic_vector (3
downto 0) :=" 0000" ;
component abc
port (clk:in std_logic;
dout:out std_logic) ;
end component;
component enable
port (enablein:in std_logic;
enableout:out std_logic) ;
end component;
component highlevel
port (rst,clk,clear:in std_logic;
output1,output2,output3,
output4,output5,output6:out
std_logic_vector (3 downto 0) ;
carryout:out std_logic) ;
end component;
component yima
port (datainput:in std_logic_vector (3 downto 0) ;
dataoutput: out std_logic_vector (6 downto 0)) ;
end component;
begin
u0:abc port map (clkin,clk) ;
u1:enable port map (enablein,enableout) ;
u2:highlevel port map ( enableout,clk,clear,data0,data1,
data2,data3,data4,data5) ;
u3:yima port map (data0,dataout0) ;
u4:yima port map (data1,dataout1) ;
u5:yima port map (data2,dataout2) ;
u6:yima port map (data3,dataout3) ;
u7:yima port map (data4,dataout4) ;
u8:yima port map (data5,dataout5) ;
end Behavioral;
由于各个子模块都已经经过验证无误, 并且顶层文件中不涉及复杂的时序关系, 相当于只是将各个模块用导线连接起来, 只要各个端口的连接对应正确即可, 所以不需写专门的test bench进行验证。完成以上设计后, 即可进行逻辑综合,综合无误后进行管脚适配, 生成.bit文件然后下载到实验板上测试。经过反复多次测试, 以上设计完全满足了预期的设计指标, 开始/停止按键和清零按键都能准确的控制秒表的运行, 七段显示数码管也能够准确的显示计时结果。通过与标准秒表对比, 该设计的计时误差在0.03s以内, 而这其中也包括实验板上晶振由于长期使用所带来的误差。
4 结束语
本文所介绍数字秒表设计方法, 采用了当下最流行的EDA设计手段。在Xinlinx FPGA开发环境下, 采用至上而下的模块化设计方法, 使得系统开发速度快、成本低、系统性能大幅度提升。通过实验验证, 本文设计的数字秒表计时准确、性能稳定, 可以很容易嵌入其他复杂的数字系统,充当计时模块。
利用EDA设计工具, 结合基于FPGA的可编程实验板, 轻松实现电子芯片的设计, 现场观察实验结果, 大大缩短了产品的设计周期和调试周期,提高了设计的可靠性和成功率, 体现了逻辑器件在数字设计中优越性。
评论
查看更多