当前位置:文档之家› VHDL实验报告论文

VHDL实验报告论文

硬件描述语言期末实验报告题目:硬件描述语言实现秒表功能姓名xxxx学号xxxxxxxxxx年级专业xxxxxxxxxxxxx指导教师xxxx2012年6月20日河北大学本科生VHDL硬件实验论文(设计)硬件描述语言实现秒表功能摘要应用VHDL语言设计数字系统,很多设计工作可以在计算机上完成,从而缩短了数字系统的开发时间。

我们尝试利用VHDL为开发工具设计数字秒表。

秒表的逻辑结构较简单,它主要由十进制计数器、六进制计数器、数据选择器、和显示译码器等组成。

在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外整个秒表还需有一个启动信号,暂停信号和一个清零信号,以便秒表能随意停止及启动。

关键词:VHDL语言数字秒表时序仿真图目录一、实验目的 (1)二、硬件要求 (1)三、引脚说明 (1)四、模块介绍 (2)4.1.计数器(六、十进制) (2)4.2.蜂鸣器 (2)4.3.译码器 (3)4.4.控制器 (4)五、整体连接图 (5)六、实验结果 (6)七、实验总结 (6)八、谢辞 (7)九、附录 (7)一实验目的学习使用VHDL语言,以及EDA芯片的下载仿真。

二硬件要求(1)主芯片EPF10K10LC84-4。

(2)蜂鸣器。

(3)8位八段扫描共阴极数码显示管。

(4)二个按键(暂停,开关)。

三引脚说明3.1引脚设置3.2信号说明signal q:std_logic_vector(3 downto 0);--q是用于分频的信号。

signal state: std_logic_vector(3 downto 0);--state为状态信号,state为1时为暂停记录状态,为0时为正常显示计数状态。

signal led: std_logic_vector(3 downto 0);--led为数码管扫描信号,通过对d1~d6的选择使数码管发光。

signal data,data1,data2,data3,data4,data5,data6,data7,data8:std_logic_vector(3 downto 0);--data1~data8这些信号为计数器所记录的数值,data为传入译码器的变化值。

signal pause1,pause2,pause3,pause4,pause5,pause6:std_logic_vector(3 downto 0); --这些信号为实现暂停功能寄存信号。

signal output:std_logic_vector(6 downto 0);--output为译码输出的信号总线。

signal sound:std_logic_vector(3 downto 0)--sound为蜂鸣器的输入分频器。

signal sound_sout:std_logic_vector(15 downto 0);--data1~data4的总线。

signal sound_star:std_logic;--为蜂鸣器输入频率的开关。

四模块介绍时钟的设计共化分为5个模块:六进制计数电路,报时电路,扫描电路,译码电路。

下面具体分析各个模块的原理、内容和功能。

4.1计数器if(count=X)then --‘X’为进制数,为5即为6进制,为9就是10进制。

count<="0000";next_count_clk<='1';--为下一个计数器的时钟信号输入。

elsecount<=count+'1'; --实现计数功能。

next_count_clk<='0';end if;4.2蜂鸣器process(data6,data5,data4,data3,data2,data1)beginsound_sout<=data4&data3&data2&data1; --实现整点报时的标识。

if(sound_sout=0)thenif(data5>=1)thensound_star<='1'; --开始报时的信号elsif(data6>=1)thensound_star<='1';end if;end if;if(sound_star='1')thenif(sound=1)thensr_out<='1';elsesr_out<='0';end if;end if;if(data3=5)thensound_star<='0'; --结束报时的信号end if;end process;4.3译码器process (data)begincase (data) is --低电平有效when "0000" => output <= "0000001";--显示0when "0001" => output <= "1001111";--显示1when "0010" => output <= "0010010";--显示2when "0011" => output <= "0000110";--显示3when "0100" => output <= "1001100";--显示4when "0101" => output <= "0100100";--显示5when "0110" => output <= "0100000";--显示6when "0111" => output <= "0001111";--显示7when "1000" => output <= "0000000";--显示8when "1001" => output <= "0000100";--显示9when others => output <= "0000110";end case;end process;a <= output(6);b <= output(5);c <= output(4);d <= output(3);e <= output(2);f <= output(1);g <= output(0);4.4控制器--输出控制器case (led) iswhen "0000" => data <=data1;--将百分秒位赋值于data。

d1<='0';d2<='1';d3<='1';d4<='1';d5<='1';d6<='1';dp<='1';--(从右到左)选择第一个数码管。

pause1<=data1;--寄存现在的数值。

when "0001" => data <=data2;--十分秒位d1<='1';d2<='0';d3<='1';d4<='1';d5<='1';d6<='1';dp<='1';--第二个数码管pause2<=data2;--寄存when "0010" => data <=data3;--秒低位d1<='1';d2<='1';d3<='0';d4<='1';d5<='1';d6<='1';dp<='0';--第三个数码管pause3<=data3;--寄存when "0011" => data <=data4;--秒高位d1<='1';d2<='1';d3<='1';d4<='0';d5<='1';d6<='1';dp<='1';--第四个数码管pause4<=data4;--寄存when "0100" => data <=data5;--分低位d1<='1';d2<='1';d3<='1';d4<='1';d5<='0';d6<='1';dp<='0';--第五个数码管pause5<=data5;--寄存when "0101" => data <=data6;--分高位d1<='1';d2<='1';d3<='1';d4<='1';d5<='1';d6<='0';dp<='1';--第六个数码管pause6<=data6;--寄存when others => data <="1000";end case;process(pause_clk,stop) --状态控制器beginif(pause_clk'event and pause_clk='1')thenif(state="0001")thenstate<="0000"; --计时显示状态elsestate<=state+1; --暂停状态end if;end if;end process;五整体连接图六实验结果器件上六个数码管上各自显示这一个数值,当左侧第一个开关为1时便清零停止,为0时便开始计数,从00.00.00开始,记录到59.59.99时会变为01.00.00,此时记录为时位、分位和秒位,直到23.59.59时才会自动清零,又从头开始计数。

相关主题