EDA技术(VHDL)——0~9999的计数器电路的设计

EDA技术实验—— 0~9999的计数器电路的设计

一名南方不知名大学生的分享:始于模仿,成于创新 。

一、实验目的

1、学习Quartus II软件的基本使用方法。
2、学习北京革新GX-BICE-EDA/SOPC实验开发系统的基本使用方法。
3、学习Verilog HDL程序的基本结构和基本语句的使用。

二、实验内容

设计并完成一个计数范围为0~9999的4位10进制动态扫描显示电路DTCNT9999的设计、调试和硬件验证,并用北京革新GX-BICE-EDA/SOPC实验开发系统(具体芯片为EP3C55-FBGA484)进行硬件验证。

三、实验条件

开发软件Quartus II 13.1
实验设备GX-BICE-EDA/SOPC实验开发系统
拟用芯片EP3C55-FBGA484

四、 实验设计

1、系统原理框图

为了简化设计并便于显示,该计数动态扫描显示电路分为两个层次,底层电路包括四个十进制计数器模块CNT10、动态显示控制信号产生模块CTRLS、数据动态显示控制模块DISPLAY等六个模块,再由着六个模块按照图所示的原理图构成顶层电路DTCNT9999。

Alt

DTCNT9999顶层原理图
2、主要模块的VHDL源程序
1) CNT10的VHDL源程序
// ——CNT10.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
 PORT(CLK:IN STD_LOGIC;
      CLR:IN STD_LOGIC;
      ENA:IN STD_LOGIC;
      CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
      CO:OUT STD_LOGIC);
END ENTITY CNT10;
ARCHITECTURE ART OF CNT10 IS
 SIGNAL CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);
 BEGIN
 PROCESS(CLK,CLR,ENA) IS
  BEGIN 
  IF CLR='1' THEN CQI<="0000";
  ELSIF CLK'EVENT AND CLK='1' THEN 
   IF ENA='1' THEN
    IF CQI="1001" THEN
     CQI<="0000";
    ELSE 
     CQI<=CQI+'1';
    END IF;
   END IF;
  END IF;
 END PROCESS;
 PROCESS(CLK,CQI) IS
  BEGIN
  IF CLK'EVENT AND CLK='1' THEN
   IF CQI<"1001" THEN
    CO<='0';
   ELSE
    CO<='1';
   END IF;
  END IF;
 END PROCESS;
 CQ<=CQI;
END ARCHITECTURE ART;
2) CTRLS的VHDL源程序
——CTRLS.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CTRLS IS
  PORT(CLK: IN STD_LOGIC;      
  SEL: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END ENTITY CTRLS;
ARCHITECTURE ART OF CTRLS IS
  SIGNAL CNT: STD_LOGIC_VECTOR(2 DOWNTO 0);
  BEGIN
  PROCESS(CLK) IS
    BEGIN
    IF CLK'EVENT AND CLK='1' THEN
      IF CNT="111" THEN 
         CNT<="000";
       ELSE 
         CNT<=CNT+'1';
      END IF ;
   END IF;
  END PROCESS;
  SEL<=CNT;
END ARCHITECTURE ART;
3) DISPLAY的VHDL源程序
——DISPLAY.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DISPLAY IS
  PORT(SEL: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
       DATAIN: IN STD_LOGIC_VECTOR(15 DOWNTO 0);
       COM: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
       SEG: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY DISPLAY;
ARCHITECTURE ART OF DISPLAY IS
  SIGNAL DATA:STD_LOGIC_VECTOR(3 DOWNTO 0);
  BEGIN
  PROCESS(SEL) IS
    BEGIN
    CASE SEL IS
      WHEN "000" => COM<="11111110";
      WHEN "001" => COM<="11111101";
      WHEN "010" => COM<="11111011";
      WHEN "011" => COM<="11110111";
      WHEN "100" => COM<="11101111";
      WHEN "101" => COM<="11011111";
      WHEN "110" => COM<="10111111";
      WHEN "111" => COM<="01111111";
      WHEN OTHERS => COM<="11111111";
    END CASE ;
  END PROCESS;
  PROCESS(SEL) IS
    BEGIN
    CASE SEL IS
      WHEN "000" =>DATA<=DATAIN(3 DOWNTO 0);
      WHEN "001" =>DATA<=DATAIN(7 DOWNTO 4);
      WHEN "010" =>DATA<=DATAIN(11 DOWNTO 8);
      WHEN "011" =>DATA<=DATAIN(15 DOWNTO 12);
      WHEN OTHERS=>DATA<="0000";
    END CASE;
       CASE DATA IS
      WHEN "0000" => SEG<="00111111";--3FH
      WHEN "0001" => SEG<="00000110";--06H
      WHEN "0010" => SEG<="01011011";--5BH
      WHEN "0011" => SEG<="01001111";--4FH
      WHEN "0100" => SEG<="01100110";--66H
      WHEN "0101" => SEG<="01101101";--6DH
      WHEN "0110" => SEG<="01111101";--7DH
      WHEN "0111" => SEG<="00000111";--07H
      WHEN "1000" => SEG<="01111111";--7FH
      WHEN "1001" => SEG<="01101111";--6FH
      WHEN OTHERS => SEG<="00000000";--00H
   END CASE ;
 END PROCESS;
END ARCHITECTURE ART;
4)DTCNT9999的VHDL源程序
 --DTCNT9999.VHDL
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY DTCNT9999 IS
	PORT(CLK1:IN STD_LOGIC;
		  CLR:IN STD_LOGIC;
		  ENA:IN STD_LOGIC;
		  CLK2:IN STD_LOGIC;
		  COM:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
		  SEG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY DTCNT9999;

ARCHITECTURE ART OF DTCNT9999 IS
	COMPONENT CNT10 IS
		PORT(CLK:IN STD_LOGIC;
			  CLR:IN STD_LOGIC;
			  ENA:IN STD_LOGIC;
			  CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
			  CO:OUT STD_LOGIC);
	END COMPONENT CNT10;
	
	COMPONENT CTRLS IS
		PORT(CLK:IN STD_LOGIC;
			  SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
	END COMPONENT CTRLS;
	
	COMPONENT DISPLAY IS
		PORT(SEL:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
			  DATAIN:IN STD_LOGIC_VECTOR(15 DOWNTO 0);
			  COM: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
			  SEG: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
	END COMPONENT DISPLAY;
	
	SIGNAL S1,S2,S3,S4,S5:STD_LOGIC;
	SIGNAL S:STD_LOGIC_VECTOR(2 DOWNTO 0);
	SIGNAL DOUT:STD_LOGIC_VECTOR(15 DOWNTO 0);
	BEGIN
	U1:CNT10  PORT MAP(CLK1,CLR,ENA,DOUT(3 DOWNTO 0),S1);
	U2:CNT10  PORT MAP(S1,CLR,ENA,DOUT(7 DOWNTO 4),S2);
	U3:CNT10  PORT MAP(S2,CLR,ENA,DOUT(11 DOWNTO 8),S3);
	U5:CNT10  PORT MAP(S3,CLR,ENA,DOUT(15 DOWNTO 12));
	U10:CTRLS  PORT MAP(CLK2,S(2 DOWNTO 0));
	U11:DISPLAY PORT MAP(S,DOUT,COM,SEG);
END ARCHITECTURE ART;

五、实验结果及总结

1、 仿真波形

本设计包括两个层次,先进行底层模块十进制计数器CNT10的仿真,再进行顶层模块DTCNT9999的仿真。

2、系统仿真结果

预期结果:每一个时钟上升沿来临时计数结果CQ+1,且CQ=9时产生进位。

Alt

CNT10的仿真结果如图所示

Alt

DTCNT9999的仿真结果如图所示
3、管脚锁定文件

根据DTCNT9999的电路结构图确定引脚的锁定如下图所示:
Alt

4、逻辑综合结果

使用Quartus II 13.0进行逻辑综合后,DTCNT9999的RTL视图如图所示:
Alt

六、实验总结

  • 经过本次实验,对Quratus II有了更深入的了解,学会并掌握了更多功能的操作。学会自己编写动态显示控制信号产生模块CTRLS以及数据动态显示控制模块DISPLAY。

  • 目前的学习仍是在老师的讲解、参考别人学习成果的基础上,对实验设计进行修改。例如:增加DISPLAY模块使实验能够在北京革新GX-BICE-EDA/SOPC实验开发系统上进行硬件验证。

  • 关于顶层电路原理图的画法请自行在网络上查找资料学习,关于管脚锁定我将专写一篇文章来记录学习过程中的收获。

  • 0~9999的4位10进制动态扫描显示电路DTCNT9999的VHDL程序包我已发布在CSDN资源中,链接:DTCNT9999.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值