一、实验目的
(1) 熟悉EDA软件,并能熟练使用。
(2) 分析设计任务,根据任务要求完成设计内容。
(3) 利用软件对设计内容进行仿真调试,得到正确运行结果。
二、实验要求
(1)设计具有异步清零,同步使能的60进制计数器,并用VHDL语句进行例化
(2)设计七段译码器的VHDL代码,利用元件例化的方式实现计数译码器的设计
三、实验步骤
(1) 建立工作库文件夹和编辑设计文件
File->New Project Wizard
(2) 创建工程
File->New->Verilog HDL File
(3) 全程编译
![](https://i-blog.csdnimg.cn/blog_migrate/450c6496431bbd0e4b4ec659fa865c1d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d56d3a72ee5f18c36844fae86cd74335.png)
![](https://i-blog.csdnimg.cn/blog_migrate/08904185d4873da8e39e1903bab37f24.png)
(4) 时序仿真
![](https://i-blog.csdnimg.cn/blog_migrate/7a22eecf19bc1c906ea6e722a112779d.png)
由上图可知,当时钟使能端信号到来时,低四位会加1;
当低四位加到1001(数字9)时,高四位会加1;
符合计数器规律。
当高四位为0101(5)且低四位为1001(9)时,会产生一个进位信号,
且下一个时钟信号来之后,高四位低四位都会清零。
当RST为1时,低四位高四位全清零。
综合分析可知,这是一个60进制计数器。
![](https://i-blog.csdnimg.cn/blog_migrate/da94b545f6b2690094457343b9f2635b.png)
由上图可知,当时钟信号到来时,DOUT会加1;
当DOUT到1001(数字9)时,COUT进位会加1;
符合10进制计数器规律。
![](https://i-blog.csdnimg.cn/blog_migrate/0737b6bb46f091967e5e8b4d7fb49652.png)
由仿真波形可知,数字0-9均可用八位二进制数表示出来,且结果是一一对应的;
当输入大于9时,输出为空,保持不变;
当时钟信号继续增加时,译码器会循环输出0-9的二进制数,可以看出来这是一个七段译码器。
![](https://i-blog.csdnimg.cn/blog_migrate/f986a2a0a0f51234894aff2cde7395b8.png)
由仿真波形可知,CLK为1,EN使能端为1时,输出加1,且表示为译码形式;
当RST0为高电平时,计数归零。
四、VHDL程序文本
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT60 IS --60进制计数器
PORT (
CLK,RST,EN:IN STD_LOGIC;
DHOUT:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0); --高四位输出
DLOUT:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0); --低四位输出
COUT:OUT STD_LOGIC);
END ENTITY CNT60;
ARCHITECTURE behave OF CNT60 IS
BEGIN
COUT<='1'WHEN(DHOUT="0101" AND DLOUT="1001")ELSE '0'; --确定进位条件
PROCESS(CLK,EN,RST)
BEGIN
IF RST='1' THEN DHOUT<="0000";DLOUT<="0000"; --异步清零
ELSIF CLK'EVENT AND CLK ='1' THEN
IF EN='1' THEN DLOUT<=DLOUT+1;END IF; --同步使能
IF(DLOUT=9)THEN DLOUT<="0000";DHOUT<=DHOUT+1;END IF; --低四位归零设置
IF(DHOUT=5 AND DLOUT=9) THEN DHOUT<="0000"; END IF; --高四位归零设置
END IF;
END PROCESS;
END ARCHITECTURE behave;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL ;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SEG7 IS --七段译码器
PORT (INDATA: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入,4位数,表示0-9
ODATA: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));--输出,八位,对应数码管上八段
END ENTITY SEG7;
ARCHITECTURE BHV OF SEG7 IS
BEGIN
PROCESS (INDATA)
BEGIN
CASE (INDATA) IS
WHEN "0000" => ODATA<= "0111111" ; --数字0的高电平点亮(公共端共阴极)二进制表示方法
WHEN "0001" => ODATA<= "0001110" ; --1
WHEN "0010" => ODATA<= "1011011" ; --2
WHEN "0011" => ODATA<= "1001111" ; --3
WHEN "0100" => ODATA<= "1100110" ; --4
WHEN "0101" => ODATA<= "1101101" ; --5
WHEN "0110" => ODATA<= "1111101" ; --6
WHEN "0111" => ODATA<= "0000111" ; --7
WHEN "1000" => ODATA<= "1111111" ; --8
WHEN "1001" => ODATA<= "1101111" ; --9
WHEN OTHERS => NULL; --其他情况,输出为空
END CASE; --结束case
END PROCESS;
END ARCHITECTURE BHV;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT_10 IS --10进制计数器
PORT (
CLK,RST,EN:IN STD_LOGIC;
DOUT:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT:OUT STD_LOGIC);
END ENTITY CNT_10;
ARCHITECTURE behave OF CNT_10 IS
BEGIN
COUT<='1'WHEN(DOUT="1010" )ELSE '0'; --确定进位条件
PROCESS(CLK,EN,RST)
BEGIN
IF RST='1' THEN DOUT<="0000";
ELSIF CLK'EVENT AND CLK ='1' THEN
IF EN='1' THEN DOUT<=DOUT+1;END IF;
IF(DOUT=9)THEN DOUT<="0000";END IF;
END IF;
END PROCESS;
END ARCHITECTURE behave;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY CNT_10_LED IS --计数译码器
PORT (CLK0,RST0,EN0: IN STD_LOGIC;
DOUT0:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END ENTITY CNT_10_LED;
ARCHITECTURE BHV OF CNT_10_LED IS
COMPONENT CNT_10 --计数器
PORT (CLK,RST,EN:IN STD_LOGIC;
DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT CNT_10;
COMPONENT SEG7 --7段译码器
PORT (INDATA: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
ODATA: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END COMPONENT SEG7;
SIGNAL IKUN:STD_LOGIC_VECTOR(3 DOWNTO 0); --IKUN🤣 敏感信号
BEGIN
U1:CNT_10 PORT MAP(CLK=>CLK0,RST=>RST0,EN=>EN0,DOUT=>IKUN);
U2:SEG7 PORT MAP(INDATA=>IKUN,ODATA=>DOUT0);
END ARCHITECTURE BHV ;
五、遇到的问题及解决办法
- Q10版本之后的Quartus在New中不直接提供软件波形仿真,一般需要调用ModelSim软件进行操作:
解决办法:按照图示依次点击Tools->Options->General->EDA Tool Options->ModelSim 把路径设置为ModelSim软件所在处。
- VHDL文本正确,工程路径都没问题,波形输出失败,提示ModelSIM调用失败:
解决办法:检查问题1是否已经解决,解决后关闭软件,以管理员身份启动软件,再次仿真。