北邮数字电路逻辑设计实验报告

时间:2024.4.14

20##~2014第一学期

数字电路与逻辑设计实验

--简易自动售货机

姓名:

班级:

学号:

一、 设计课题的任务要求

基本要求:

1、用 2 个数码管(disp5,disp4)显示钱数,以元为单位。用3 个按键(btn0,btn1,

btn2)分别表示一元、五元、十元,每按一次按键,增加一次相应的钱数,上限99

元。

2、再用 3 个按键(btn3,btn4,btn5)分别对应3 种商品,其中,商品甲售价3 元、商

品乙售价8 元、商品丙售价12 元;

3、买东西时,先输入钱币,再按对应的商品键。每按一次商品键,钱数要相应地减少,

同时有声光(蜂鸣器或发光二极管)提示购买成功。剩余钱数大于3 元可继续按商

品键再次购买;当剩余钱数少于3 元时,表示钱数的数码管disp5,disp4 显示为零,

同时用数码管disp0 显示退出的钱数。

4、买东西时,按下商品键,若输入的钱数少于商品的价格,表示钱数的数码管 disp5,

disp4 显示为零,同时用数码管(disp1、disp0)显示退出的钱数,并用蜂鸣器或发

光二极管闪烁表示购买失败。

5、按下商品键时,用数码管disp2 表示当前购买的商品,1 代表商品甲,2 代表商品乙,

3 代表商品丙。

6、用 btn7 做为退出功能键,退出键可以随时按下,按下后,数码管(disp5,disp4)显

示为零,同时数码管(disp1、disp0)显示退出的钱数,表示结束购买,钱款全部退

出。

提高要求:

1、用点阵设计显示投币动画、出货动画,购买成功/失败动画;

2、允许随时输入钱币,购买时,钱款不足有声光报警并等待追加钱币或选择别的商品;

3、商品数量管理,有缺货提示;

4、用点阵动态显示商品名称和库存数量等。

5、自拟其它功能。

二、 系统设计

1、 设计思路

由于这个题目有数码管显示和按键输入,因此需要两种频率的时钟。高频时钟1kHz控制数码管显示,利用视觉暂留效果造成几个数码管同时显示的效果。低频时钟2Hz控制按键,每当一个上升沿来临时检测按键的值,若此时按键为1则表示按键被按下一次。这两个频率的时钟通过将实验板的50MHz时钟分频得到。

由于要实现自动售货机功能,所以要有投币和显示模块。投币模块根据题目要求,按下不同按键时在总钱数和剩余钱数上进行相应的加减,用LED灯提示购买成功或失败,并且输出选择的商品种类。显示模块接收高频时钟和投币模块的数据,将总钱数、剩余钱数、商品种类在数码管上进行显示。这三个模块通过一个总程序进行整合。

2、 总体框图

(1)逻辑流程图

(2)逻辑划分方框图

3、 分块设计

(1)分频模块

将原始时钟 CLK_IN(50MHz)设为输入,CLKS(1kHz)和CLK(2Hz)作为输出。定义一个信号COUNT:STD_LOGIC_VECTOR(22 DOWNTO 0),每当原始时钟出现一个上升沿时count+1,CLK取COUNT的首位,CLKS取COUNT的第15位(从低向高数)。这样就得到相应频率的时钟输出。

      (2)投币、购买模块

          低频时钟CLK作为输入,ONE、FIVE、TEN、代表投币一元、五元、十元;JIA、YI、BING代表三种商品甲、乙、丙;MONEY表示现有的钱数;OVER表示退出键是否被按下;OOVER、LIGHTGREEN、LIGHTRED、CHOICE作为输出,分别表示退出信号,绿灯点亮信号,红灯点亮信号和选择的商品种类信号。

           检测时钟CLK的上升沿,如果CLK处在上升沿,则检测各个输入的值。ONE、FIVE、TEN、为1分别表示投入了1元、5元、10元钱。JIA、YI、BING分别表示购买了甲、乙、丙三种商品。购买时检测剩余钱数,若剩余钱数足够,则绿灯点亮信号置为1,同时CHOICE信号置为相应的值。若剩余钱数不够,则红灯点亮信号置为1,CHOICE置为”000”.

      (3)显示模块

           高频时钟CLK作为输入,OOVER、MONEY、CHOICE也作为输入。DISP:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)和DENG:OUT STD_LOGIC_VECTOR(6 DOWNTO 0))作为输出,控制数码管的显示。

           根据CLKS的上升沿控制DISP,使六个数码管循环往复依次点亮。利用人的视觉暂留效果造成几个数码管同时点亮的效果。投币时,若MONEY小于3,,则钱数在表示退出钱数的两个数码管显示;若MONEY大于等于3,则钱数在表示现有钱数的两个数码管显示。根据CHOICE信号的不同,表示商品选择的数码管显示1、2、3或不显示。如果CHOICE信号代表的商品价格大于现有钱数,则表示现有钱数的数码管显示为0,钱数显示在表示退出钱数的两个数码管内。如果OOVER信号为1,则表示现有钱数的数码管显示为0,钱数显示在表示退出钱数的两个数码管内。

三、 仿真波形

这里将分频系数调低,以便仿真。

1、 数码管显示

图中可以看出DISP分别控制六个数码管循环依次点亮

2、 投币

图中可以看出,投入一元钱后,由于总钱数没有达到3元,因此表示退出钱数个位的数码管显示‘1’。再投入十元钱后,总钱数达到11元,因此现有钱数的个位,十位分别显示‘1’。

3、 购买

下图中,只投入了一元钱,却购买了价值三元的商品甲。因此不扣钱,钱数在退出钱数的数码管显示,表示商品种类的数码管显示‘1’来代表商品甲。同时红灯点亮一段时间,表示钱数不够,购买失败。

下图中,投了十块钱,购买了价值三元的商品甲。因此扣掉三块钱,表示现有钱数个位的数码管显示‘7’。表示商品种类的数码管显示‘1’来代表商品甲。同时绿灯点亮一段时间表示购买成功

4、退出

从图中可以看出,投入了十元钱后,表示现有钱数十位的数码管显示‘1’。按下OVER键以后,现有钱数在表示退出钱数的数码管显示。此时表示现有钱数的数码管显示‘00’,表示退出钱数的数码管显示‘10’。

  

四、源程序

1、分频模块

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity FREQ is

PORT(

       CLK_IN:IN STD_LOGIC;                             --原始时钟

    CLKS:OUT STD_LOGIC;                             --高频时钟

    CLK:OUT STD_LOGIC);                             --低频时钟

End FREQ;

Architecture FR_EQ of FREQ is

SIGNAL COUNT:STD_LOGIC_VECTOR(22 DOWNTO 0);

SIGNAL A:STD_LOGIC;

SIGNAL B:STD_LOGIC;

Begin

  Process(CLK_IN)

BEGIN

if(CLK_IN'event and CLK_IN='1')then                     --检测输入时钟的上升沿

  if(COUNT="11111111111111111111111") THEN

    COUNT<="00000000000000000000000";

  ELSE

    COUNT<=COUNT+1;

  END IF;

A<=COUNT(22);                                     --低频时钟取COUNT的首位

B<=COUNT(14);                                     --高频时钟取COUNT的第15位

END IF;

end process;

CLK<=A;

CLKS<=B;

end FR_EQ;

2、投币、购买模块

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY TOUQIAN IS

PORT(

       CLK,ONE,FIVE,TEN:IN STD_LOGIC;                     --低频时钟,三种钱

        MONEY: OUT integer range 0 to 99;                --当前总钱数

        JIA,YI,BING:IN STD_LOGIC;                       --三种商品(3,8,12)

        OVER:IN STD_LOGIC;                           --退出

        OOVER:OUT STD_LOGIC;

        LIGHTGREEN:OUT STD_LOGIC;                   --绿灯表示购买成功

        LIGHTRED:OUT STD_LOGIC;                      --红灯表示购买失败

        CHOICE:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));    --选择的商品种类

END TOUQIAN;

ARCHITECTURE TOU_QIAN OF TOUQIAN IS

SIGNAL D: integer range 0 to 99;

SIGNAL CH_OICE: STD_LOGIC_VECTOR(2 DOWNTO 0) :="000";

SIGNAL OO_VER:STD_LOGIC:='0';

SIGNAL LIGHT_GREEN:STD_LOGIC:='0';

SIGNAL LIGHT_RED:STD_LOGIC:='0';

BEGIN

  P1:PROCESS(CLk,ONE,FIVE,TEN,JIA,YI,BING,OVER)

  BEGIN

  IF(clk'event AND clk='1') THEN              --检测低频时钟的上升沿

    IF (ONE='1')THEN                      --投一块钱

      CH_OICE<="000";

      OO_VER<='0';

      D<=D+1;                           --钱数加一

    ELSIF(FIVE='1')THEN                    --投五块钱

      CH_OICE<="000";

      OO_VER<='0';

      D<=D+5;                           --钱数加五

    ELSIF(TEN='1')THEN                    --投十块钱

      CH_OICE<="000";

      OO_VER<='0';

      D<=D+10;                          --钱数加十

    ELSIF (JIA='1') THEN                    --购买商品甲

      CH_OICE<="001";                    --GHOICE信号置为“001”

      OO_VER<='0';

      IF (D>=3) THEN                      --如果钱数大于等于三则扣钱,并点亮绿灯

        D<=D-3;

        LIGHT_GREEN<='1';

      ELSIF (D<3) THEN                    --如果钱数小于三则不扣钱,并点亮红灯

        LIGHT_RED<='1';

      END IF;

    ELSIF(YI='1') THEN                     --购买商品乙

      CH_OICE<="010";                   --CHOIE信号置为“010”

      OO_VER<='0';

      IF(D>=8) THEN                      --如果钱数大于等于八则扣钱,并点亮绿灯

        D<=D-8;

        LIGHT_GREEN<='1';

      ELSIF (D<8) THEN                    --如果钱数小于八则不扣钱,并点亮红灯

        LIGHT_RED<='1';

      END IF;

    ELSIF(BING='1') THEN                   --购买商品丙

      CH_OICE<="100";                    --CHOICE信号置为“100”

      OO_VER<='0';

      IF(D>=12) THEN                     --如果钱数大于等于12则扣钱,并点亮绿灯

        D<=D-12;

        LIGHT_GREEN<='1';

      ELSIF (D<12) THEN                   --如果钱数小于12则不扣钱,并点亮红灯

        LIGHT_RED<='1';

      END IF;

    ELSIF(OVER='1') THEN

      OO_VER<='1';

    ELSIF(D>99) THEN                      --如果投入的钱数大于99则自动退出

      OO_VER<='1';

    ELSE

      LIGHT_GREEN<='0';

      LIGHT_RED<='0';

    END IF;

  END IF;

CHOICE<=CH_OICE;

OOVER<=OO_VER;

MONEY<=D;

LIGHTGREEN<=LIGHT_GREEN;

LIGHTRED<=LIGHT_RED;

END PROCESS;

END TOU_QIAN;

3、显示模块

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity display is

port(

      clks:in std_logic;                            --高频时钟

      OOVER:IN STD_LOGIC;                       --推出信号

      MONEY:IN INTEGER RANGE 0 TO 99;            --钱数

      disp:out std_logic_vector(5 downto 0);          --数码管位置

      CHOICE:IN STD_LOGIC_VECTOR(2 DOWNTO 0);   --购买商品种类

      deng:out std_logic_vector(6 downto 0));         --数码管显示的内容

end entity;

architecture Behavioral of display is

  

   signal en1:std_logic_vector(5 downto 0);

begin

p1:process(clks)

variable a:integer range 0 to 5;

begin

   if clks'event and clks='1'  then                --依次点亮六个数码管

     if a=5 then

       a:=0;

       en1<="111110";

     else

      case a is

       when 0=>en1<="011111";

       when 1=>en1<="101111";

       when 2=>en1<="110111";

       when 3=>en1<="111011";

       when 4=>en1<="111101";

       when 5=>en1<="111110";

      end case;

      a:=a+1;

     end if;

   end if;

end process p1;

 P2:PROCESS(en1,MONEY,CHOICE,OOVER)    --DISP=1,2表示剩余钱数,DISP等于3,4表示退出钱数

BEGIN

IF en1="011111" THEN                            --投入钱数的个位

  IF OOVER='1' THEN                             --如果退出信号是1则数码管显示‘0’

     DENG<="1111110";

  ELSIF MONEY<3 THEN                           --如果钱数小于三则数码管显示‘0’

     DENG<="1111110";

  ELSIF ((CHOICE="010") AND (MONEY<8)) THEN    --如果钱数小于8且购买商品乙则显示‘0’

       DENG<="1111110";

  ELSIF ((CHOICE="100") AND (MONEY<12)) THEN  --如果钱数小于12且购买商品丙则显示‘0’

       DENG<="1111110";

  ELSE

  CASE MONEY-10*(MONEY/10) IS                --否则计算钱数的个位,显示在数码管上

    WHEN 0=>DENG<="1111110";

    WHEN 1=>DENG<="0110000";

    WHEN 2=>DENG<="1101101";

    WHEN 3=>DENG<="1111001";

    WHEN 4=>DENG<="0110011";

    WHEN 5=>DENG<="1011011";

    WHEN 6=>DENG<="1011111";

    WHEN 7=>DENG<="1110000";

    WHEN 8=>DENG<="1111111";

    WHEN 9=>DENG<="1111011";

    WHEN OTHERS => DENG<="0000000";

  END      CASE;

  END IF;

 

ELSIF en1="101111" THEN   --投入钱数的十位

  IF OOVER='1' THEN                           --如果退出信号是1则数码管显示‘0’

     DENG<="1111110";

  ELSIF ((CHOICE="010") AND (MONEY<8)) THEN    --如果钱数小于8且购买商品乙则显示‘0’

    DENG<="1111110";

  ELSIF ((CHOICE="100") AND (MONEY<12)) THEN  --如果钱数小于12且购买商品丙则显示‘0’

    DENG<="1111110";

  ELSE

    CASE MONEY/10 IS                        --否则计算钱数的十位,显示在数码管上

    WHEN 0=>DENG<="1111110";

    WHEN 1=>DENG<="0110000";

    WHEN 2=>DENG<="1101101";

    WHEN 3=>DENG<="1111001";

    WHEN 4=>DENG<="0110011";

    WHEN 5=>DENG<="1011011";

    WHEN 6=>DENG<="1011111";

    WHEN 7=>DENG<="1110000";

    WHEN 8=>DENG<="1111111";

    WHEN 9=>DENG<="1111011";

    WHEN OTHERS => DENG <="0000000";

    END CASE;

  END IF;

   

ELSIF en1="110111" THEN                        --退出钱数的个位

IF OOVER='1' THEN              --如果OOVER信号为1,则将现有钱数显示在退出钱数里 

    CASE MONEY-10*(MONEY/10) IS

    WHEN 0=>DENG<="1111110";

    WHEN 1=>DENG<="0110000";

    WHEN 2=>DENG<="1101101";

    WHEN 3=>DENG<="1111001";

    WHEN 4=>DENG<="0110011";

    WHEN 5=>DENG<="1011011";

    WHEN 6=>DENG<="1011111";

    WHEN 7=>DENG<="1110000";

    WHEN 8=>DENG<="1111111";

    WHEN 9=>DENG<="1111011";

    WHEN OTHERS => DENG<="0000000";

    END CASE;

ELSIF ((CHOICE="010") AND (MONEY<8)) THEN  --如果钱数小于8且购买商品乙

  CASE MONEY-10*(MONEY/10) IS           --则将现有钱数显示在退出钱数里

    WHEN 0=>DENG<="1111110";

    WHEN 1=>DENG<="0110000";

    WHEN 2=>DENG<="1101101";

    WHEN 3=>DENG<="1111001";

    WHEN 4=>DENG<="0110011";

    WHEN 5=>DENG<="1011011";

    WHEN 6=>DENG<="1011111";

    WHEN 7=>DENG<="1110000";

    WHEN OTHERS=> DENG <="1111110";

  END CASE;

ELSIF ((CHOICE="100") AND (MONEY<12)) THEN  --如果钱数小于12且购买商品丙

    CASE MONEY-10*(MONEY/10) IS          --则将现有钱数显示在退出钱数里

    WHEN 0=>DENG<="1111110";

    WHEN 1=>DENG<="0110000";

    WHEN 2=>DENG<="1101101";

    WHEN 3=>DENG<="1111001";

    WHEN 4=>DENG<="0110011";

    WHEN 5=>DENG<="1011011";

    WHEN 6=>DENG<="1011111";

    WHEN 7=>DENG<="1110000";

    WHEN 8=>DENG<="1111111";

    WHEN 9=>DENG<="1111011";

    WHEN OTHERS => DENG <="0000000";

    END CASE;

ELSE

  CASE MONEY IS                      --如果钱数小于等于3,则显示在退出钱数里

    WHEN 0=>DENG<="1111110";

    WHEN 1=>DENG<="0110000";

    WHEN 2=>DENG<="1101101";

    WHEN OTHERS => DENG<="1111110";

  END CASE;

END IF;

ELSIF en1="111011" THEN              --退出钱数的十位

  IF OOVER='1' THEN             --如果OOVER信号为1,则将现有钱数显示在退出钱数里

    CASE MONEY/10 IS

    WHEN 0=>DENG<="1111110";

    WHEN 1=>DENG<="0110000";

    WHEN 2=>DENG<="1101101";

    WHEN 3=>DENG<="1111001";

    WHEN 4=>DENG<="0110011";

    WHEN 5=>DENG<="1011011";

    WHEN 6=>DENG<="1011111";

    WHEN 7=>DENG<="1110000";

    WHEN 8=>DENG<="1111111";

    WHEN 9=>DENG<="1111011";

    WHEN OTHERS => DENG <="0000000";

    END CASE;

  ELSIF ((CHOICE="100") AND (MONEY<12)) THEN  --如果钱数小于12且购买商品丙

    CASE MONEY/10 IS                       --则现有钱数显示在退出钱数里

    WHEN 0=>DENG<="1111110";

    WHEN 1=>DENG<="0110000";

    WHEN 2=>DENG<="1101101";

    WHEN OTHERS => DENG<="1111110";

    END CASE;

  ELSE

    DENG<="1111110";

  END IF;

 

ELSIF en1="111101" THEN                      --商品选择

CASE CHOICE IS                               --甲,乙,丙分别对应数码管上的1,2,3

    WHEN "001"=>DENG<="0110000";

    WHEN "010"=>DENG<="1101101";

    WHEN "100"=>DENG<="1111001";

    WHEN OTHERS => DENG <="0000000";

  END CASE;

ELSIF en1="111110" THEN

  DENG<="0000000";

ELSE NULL;

END IF;

END PROCESS;

 disp<=en1;

end Behavioral;

总程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_SIGNED.ALL;

ENTITY BASEBAND IS

PORT(

CLK_IN:IN STD_LOGIC;

ONE,FIVE,TEN:IN STD_LOGIC;                  --三种钱

JIA,YI,BING:IN STD_LOGIC;                     --三种商品

OVER:IN STD_LOGIC;

LIGHTGREEN:OUT STD_LOGIC;

LIGHTRED:OUT STD_LOGIC;

DISP: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);   --定义数码管显示位置

DENG:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));   --定义数码管显示数字

END BASEBAND;

ARCHITECTURE A OF BASEBAND IS

SIGNAL CLKUSE:STD_LOGIC;

SIGNAL CLKSUSE:STD_LOGIC;

SIGNAL MONEY_USE:INTEGER RANGE 0 TO 99;

SIGNAL CHOICE_USE:STD_LOGIC_VECTOR(2 DOWNTO 0);

SIGNAL OOVERUSE:STD_LOGIC;

COMPONENT FREQ

PORT(

       CLK_IN:IN STD_LOGIC;            --原始时钟

    CLKS:OUT STD_LOGIC;            --高频时钟

    CLK:OUT STD_LOGIC);           --低频时钟

END COMPONENT;

COMPONENT TOUQIAN

PORT(

     CLK,ONE,FIVE,TEN:IN STD_LOGIC;

     MONEY: OUT integer range 0 to 99;

     JIA,YI,BING:IN STD_LOGIC;              --三种商品(3,8,12)

     OVER:IN STD_LOGIC;

     LIGHTGREEN:OUT STD_LOGIC;

     LIGHTRED:OUT STD_LOGIC;

     OOVER:OUT STD_LOGIC;

     CHOICE:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));

END COMPONENT;

COMPONENT DISPLAY

PORT(

CLKS:IN STD_LOGIC;                    --高频时钟

MONEY:IN INTEGER RANGE 0 TO 99;

CHOICE:IN STD_LOGIC_VECTOR(2 DOWNTO 0);   --购买商品种类

OOVER:IN STD_LOGIC;

DISP: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);   --定义数码管显示位置

DENG:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));   --定义数码管显示数字

END COMPONENT;

BEGIN

PART1:FREQ

PORT MAP

(

  CLK_IN=>CLK_IN,

  CLKS=>CLKSUSE,

  CLK=>CLKUSE

);

PART2: TOUQIAN

PORT MAP

(

  CLK=>CLKUSE,

  OVER=>OVER,

  OOVER=>OOVERUSE,

  LIGHTGREEN=>LIGHTGREEN,

  LIGHTRED=>LIGHTRED,

ONE=>ONE,

FIVE=>FIVE,

TEN=>TEN,

JIA=>JIA,

YI=>YI,

BING=>BING,

CHOICE=>CHOICE_USE,

MONEY=>MONEY_USE

);

PART3: DISPLAY

PORT MAP

(

   CLKS=>CLKSUSE,

   OOVER=>OOVERUSE,

MONEY=>MONEY_USE,

CHOICE=>CHOICE_USE,

DISP=>DISP,

DENG=>DENG

);

END A;

五、功能说明及资源利用情况

1、功能说明

    我完成了题目要求的所有基础功能。用三个按键代表一元,五元,十元,每按一次键增加一次相应的钱数,上限99元。再用三个按键代表甲、乙、丙,其中甲三元,乙八元,丙十二元。输入钱币钱数相应增加,购买商品钱数相应减少,并用LED灯提示购买成功剩余钱数大于3 元可继续按商品键再次购买;当剩余钱数少于3 元时,表示钱数的数码管disp5,disp4 显示为零,同时用数码管disp0 显示退出的钱数。买东西时,按下商品键,若输入的钱数少于商品的价格,表示钱数的数码管 disp5,disp4 显示为零,同时用数码管(disp1、disp0)显示退出的钱数,并用蜂鸣器或发光二极管闪烁表示购买失败。按下商品键时,用数码管disp2 表示当前购买的商品,1 代表商品甲,2 代表商品乙,3 代表商品丙。用 btn7 做为退出功能键,退出键可以随时按下,按下后,数码管(disp5,disp4)显示为零,同时数码管(disp1、disp0)显示退出的钱数,表示结束购买,钱款全部退出。

   我还完成了一个提高要求,即允许随时投入钱币,购买时,钱款不足有声光报警并等待追加钱币或选择其它商品。

2、资源利用情况

(1)实验所用到的元器件

一块MAXII系列EPM1270T114C5开发板及下载线。开发板内用到了5个数码显示管,7个按键,2个LED灯。

(2)管脚分配

3、基本功能资源利用情况

六、故障及问题分析

    由于距离上学期数电实验时间较长,对VHDL的语法等方面有些已经记不太清楚,因此在刚开始写代码时遇到了许多问题。例如一个process的敏感信号表里不能有两个时钟,检测按钮被按下时不能用检测按钮上升沿的方法。一开始我以为检测按钮被按下只需要检测按钮的上升沿即可,并且使用这种方法时编译和仿真都没有问题。但是实际下载时这种方法并不可行。因此我换了一种方法,即检测低频时钟(2Hz)的上升沿。当上升沿来临时,若某个按钮的值为1则表示这个按钮被按下一次。由于实验板内部做了防抖,而且售货机若一次按键没有被识别,还可以再按一次,没有太大影响,所以没有写防抖程序。

第一次将程序下载到实验板时,几个数码管全部点亮并且对按键没有反应。经过计算得知低频时钟频率过低,导致无法短时间内检测到按键被按下。将此问题改正后数码管还是全部点亮。将实验板的50MHz时钟换成较低频率的时钟后,同一时间多个数码管同时点亮。原来disp为高电平时数码管不亮,disp为低电平时相应的数码管才被点亮。

最开始我将投币模块和购买模块分在两个entity写,但是在加入钱款不足报警功能时发现信号传输方面有些问题,主要的问题就是两个进程不能对同一个进程赋值,而为了完成题目要求不得不这样做。经过仔细的分析,我发现这两个entity功能相似,都是按键输入的模块,可以写在一块。将两个entity写在一起后功能实现更加简单,而且不存在信号传输的问题。

以上的问题全部解决后,我打算完成点阵显示的提高要求。但是由于最后一个周末做数电实验的同学们热情太过高涨,我没有抢到电脑,所以写好的代码没来得及下载到实验板中调试,不过想必也无伤大雅。

七、总结和结论

这个学期的数字电路与逻辑设计实验与上学期有很大的不同。上个学期的实验都是以完成一个简单的功能为目标,可能只需要用到一些简单的语句,程序也不长。但这次试验目标不像以往那么明确,要自己分析题目,设计好流程。流程设计的好与坏直接关系到程序编写的难度和最终效果。编程的时候,需要用到component语句,这也是上个学期没有用到的。如果说上个学期的数电实验让我们了解了VHDL的语法和基本知识,那么这个学期的实验让我们认识到了它强大的功能和实用性,用它可以方便地进行硬件编程,并且易于修改。

这次的数电实验还让我对VHDL语法有了更深入的了解,以前不太注意的小细节在这次试验中都体现出来。例如在一个进程的敏感信号表中,不能有两个不同信号的边沿触发。在上学期的实验中一般一段程序只需要一个时钟,这个问题体现不出来,但这个学期的实验需要两个不同的时钟,所以在编程时会遇到这类问题。有些问题在书上并不容易找到答案,通常情况下我都是上网查阅相关资料寻找答案,这也锻炼了我自主解决问题的能力。

这次数电实验的趣味性也较上学期有了很大增加。上学期的实验只能完成单一的,简单的功能,例如在数码管上显示几个数字。但做完这次试验以后,看着自己设计出来的“自动售货机”,还是很有成就感的。希望以后还有机会做类似的实验,将学到的VHDL知识运用到更多的地方。

更多相关推荐:
数字逻辑电路课程设计实验报告

数字逻辑电路课程设计报告数字逻辑电路课程设计多功能数字时钟班级信息安全1002姓名潘祥熙学号3100604048指导老师袁晓云时间20xx6251数字逻辑电路课程设计报告目录封面1目录2设计目的设计要求数字钟的...

数字逻辑电路实验报告

数字逻辑电路实验报告电子72班07051042冯天宇1数字逻辑电路实验报告计数器设计与应用学院电信学院班级电子72班姓名冯天宇学号07051042日期20xx年12月31日数字逻辑电路实验报告电子72班0705...

数字逻辑电路实验报告

数字逻辑电路实验报告实验二16进制译码器原理图GAL方程PLD16V8BASICGATES20xx0416LQYUSTCV01WXYZNCNCNCNCNCGNDNCABCDEFGNCVCCAWXYZWXYZWX...

数字逻辑电路实验报告模板

数字逻辑电路实验报告第次实验姓名学号级系班邮箱时间正文由下面八项内容评定每次实验报告成绩一实验目的本次实验预期要学习到的知识方法等二实验原理背景知识本次实验需要的理论知识背景实验环境和工具等前期准备知识预习时完...

数字逻辑电路实验报告

数字逻辑电路设计多功能数字钟学院计算机科学与通信工程专业姓名学号指导老师江苏大学计算机10数字逻辑电路设计报告多功能数字钟一设计任务及要求1拥有正常的时分秒计时功能2能利用实验板上的按键实现校时校分及清零功能3...

哈工大 数字逻辑电路与系统实验报告

HarbinInstituteofTechnology数字逻辑电路与系统课程名称院系班级姓名学号教师哈尔滨工业大学20xx年12月实验二时序逻辑电路的设计与仿真32同步计数器实验321实验目的1练习使用计数器设...

大连海事大学数字逻辑电路课程设计实验总结报告

数字逻辑电路课程设计实验总结报告题目一:用J-K触发器设计13进制加法计数器一、设计过程:参见设计实验报告(真值表,卡诺图)。二、逻辑电路图:三、电路图描述:4个J-K触发器同步接法,每一位J-K触发器的输出端…

数字逻辑电路实验报告(七巧板设计)

数字逻辑电路实验报告姓名车开达学号101220xx7系邮箱时间12月22日一实验目的这个实验是自己的个人的设计是从一本关于iphone的游戏设计中得到的灵感自己感觉这个实验能够将键盘和显示器联系起来并且实现不算...

数字逻辑电路红绿灯课程设计实验报告

题目红绿灯控制器指导教师莫琳设计人员学号谭晨曦110720xx44班级电信类111班日期20xx年5月25日目录一设计任务书二设计框图及整机概述三各单元电路的设计方案及原理说明四调试过程及结果分析五设计安装及调...

数字逻辑实验报告1

上海大学计算机学院《数字逻辑实验》报告1姓名XXX学号XXX教师XXX时间XXX地点XXX机位XX一、与非门74LS00的逻辑功能测试实验1、实验目的:1)测试与非门74LS00芯片的逻辑功能;2)了解测试的方…

西北工业大学数字逻辑实验报告(0123403034循环)

数字电路技术实验报告学号姓名日期一实验目的1用数码显示管实现01234030342用74LS905421BCD码实现模十计数二实验设备1数字电路试验箱2数字双踪示波器3函数信号发生器4集成电路74LS905集成...

数字逻辑实验报告(马钊+袁泉+杨晨笛+罗亚群)

北京邮电大学课程设计报告注评语要体现每个学生的工作情况可以加页数字逻辑与数字系统课程设计目录实验一简易电子琴3实验二简易频率计6实验三交通灯控制器设计11实验四电子钟设计17实验五药片装瓶系统设计26附数字逻辑...

数字逻辑电路实验报告(20篇)