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知识运用到更多的地方。