可加wechat 号:comprehensivable   询问获取相关资料!

目录

1、EDA的介绍:

2、实验要求:

3、主要的VHDL程序:

3.1.CNT10的程序

3.2 CTRLS的VHDL源程序

3.3   DISPALY的VHDL源程序

3.4   DTCNT9999的源程序

4、硬件实验现象

5、对源程序部分主要代码的分析:

5.1   CNT10的分析:

5.2、CTRLS代码分析

5.3.DISPLAY代码分析(动态显示,最重要)

6、引脚锁定部分

7、DTCNT99999999999分析


1、EDA的介绍:

   所谓EDA技术(EI ectronic Des ign Automat ion Technology,电子设计自动化技术),简单地讲就是使用大规模可编程逻辑器件,应用硬件描述语言作为主要逻辑描述方式,通过EDA开 发软件,EDA实验开发系统,用软件的方式自动地设计集成电子系统或专用集成电路的一门技术。

    利用VHDL语言可以实现以下功能。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

2、实验要求:

能够动态的显示0-9999的4位十进制计数电路,在不同频率下不同速率的显示。

实验RTL图:可以看出系统运行的整体过程,其过程由四个CNT10、一个动态扫描CTRLS和一个动态显示DISPLAY这六个模块组成。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

3、主要的VHDL程序:

3.1.CNT10的程序

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

3.2 CTRLSVHDL源程序

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

3.3   DISPALYVHDL源程序

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

3.4   DTCNT9999的源程序

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

4、硬件实验现象

视频来源:谭会生教授 知到公开课

EDA实验/来自谭会生老师

5、对源程序部分主要代码的分析

5.1   CNT10的分析:

 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';

CO为进位,从第一个CNT10计数模块达到第二位计数器 的模块

IF CQI<"1001" THEN

    CO<='0';

   ELSE

    CO<='1';

由于是十进制计数器,计数为0-9,当CNT为1001二进制为9时向前进一位并且重新从零开始计数,第一个CNT10接 下一个CNT10模块,达到进位的效果。

就可以把CNT模块比作计数的过程,从0开始到9则变成了10,进了一位,然后从10-19依次类推。类推0-99然后到4个CNT10模块 0-9999

5.2、CTRLS代码分析

 IF CLK'EVENT AND CLK='1' THEN

      IF CNT="111" THEN

        CNT<="000";

       ELSE

        CNT<=CNT+'1';

CTRLS其实就是一个三八译码器的原理

控制着8个数码管的亮灭,111换为十进制就是7就是代表第8个数码管(因为0代表第一个数码管,所以数码管亮是对应十进制加1)

然后如此循环,达到第一个数码管到第八个数码管可以依次点亮

5.3.DISPLAY代码分析(动态显示,最重要)

要搞清楚中间信号是需要信号线去传递的,每一位信号都需要信号线,如4位二进制1111则需要四根信号线,由于只需控制四个数码管中显示数据,所以控制数字端口的只需要4*4=16根。但是控制数码管是否点亮还是需要控制八个数码管所以需要8个信号

打个比方:你要去坐火车,需要进入候车厅前进行身份证扫描就是CTRLS,用来核验你是否能进入候车厅等待火车,000代表第一个闸机可以通过,以此类推,当每个闸机所隔时间很短就相当于八个闸机都打开了可以通行。  数码管也是如此,当频率超过人类视觉的范围,则没有依次点亮的现象,而是八个管子同时点亮。

      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";

为了能够控制数码管中数字的显示,于是引入了中间变量DATA用来传递信息,由于只用到了四个数码管所以只用到了四个传递。

    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);

由于数字显示是0-9,如果二进制只有三位那么最大是7,所以需要利用四位二进制。

可以把数码管中显示数字比作检票口,总共有8个检票口,但是只用到了四个检票口,另外四个今天“休息”。而四个检票口中某一个检票口又有你目的地的出发时间。

而具体数码管显示数字是多少,由于数码管是共阴的,所以给一个高电平则点亮这部分,具体显示为多少,可以参考数码管的分布。

    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        

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

其中hgefdcba对应第八位-第一位,00111111对应是abcdef点亮,刚好对应数字0

所以要搞清楚一点的是CTRLS是前端控制,而DISPLAY是后端控制,俩者是用不同的控制端的。CTRLS是让你能够进入候车厅,而DISLAY是根据你的购票信息确定你的登机口和上火车的时间点。通过这个例子需要大家能够稍微得到一些理解

对于最后的部分,即DTCNT9999只需要把他们连接起来,就像拼乐高一样,利用元件例化把他们相组合即可

6、引脚锁定部分

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

引脚锁定的管脚号可以通过自己双击Location的部分手动打入。其中控制数码管和点亮显示数码管数字的引脚是基本使用以下管脚的,即COM对应数码管的公共端,SEG对应数码管的驱动端,驱动端对应数码管中数字的显示,公共端控制是否点亮数码管。大家记住即可,后续关于数码管的都可以以此来锁定引脚。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

而关于时钟、按键开关的则需要自己配置引脚,这里我选择了使用按键1和按键8来配置,大家也可以选择其他按键来配置。时钟的话我选择了6号IO口和8号IO口。对应IO的配置如果学过单片机的肯定很容易,其实就是相当于我要吃红烧牛肉面,那么我就先找好牌子然后在对应牌子中找到该种类,道理是一样的。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

当引脚锁定后一定要重新编译一次程序,然后进入硬件验证,验证前需要下好对应串口驱动,然后再左上角连接好线,选中第一个方框,然后点击Start(当连接到硬件时候,可以下来选择)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

7、DTCNT99999999999分析

对应12个9相比于4个9就是多了八个9,但是由于一般的板子只有8个数码管,所以就需要一个拨码开关的代码部分,就是相当于你吃中午选择吃面还是吃饭,由于你的胃不能承受这俩种食物,那么你就要进行一个选择。

所以相比于4个9就是多了几串代码。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

对应DTCNT12个9中也需要加入这个拨码开关的代码,对应是PORT部分和DISPLAY部分

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_18,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_18,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55S15a2Q5bygc2ly,size_20,color_FFFFFF,t_70,g_se,x_16

                                     对应的RTL图

12个9就是相当于多了一个开关,所以以后大家写19个9或者更多的思想也是如此。

注:本人为电子技术本科的一名学生,本着互相学习的想法将本科期间学到的相关思想和大家分享,也希望大家能够互相学习,提出宝贵的建议。大家还会遇到一些其他问题可以在底下提出,大家互相交流学习。(如果需要源代码,后面我会进行开源)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐