99网
您的当前位置:首页硬件课程设计实验报告

硬件课程设计实验报告

来源:99网


课程设计说明书

硬件课程设计

2012年 8 月 31 日

1

目 录

第一部分:各题目设计报告 .................................................... 4

题目1 7段数码管显示设计报告 ...................................................4

1、程序功能框图 ......................................................................................................... 4 2、VHDL源程序 ............................................................................................................ 4 3、调试 ......................................................................................................................... 6 4、功能测试 ................................................................................................................. 6 5、硬件管教锁定 ......................................................................................................... 7 6、硬件验证结果 ......................................................................................................... 8 7、实验过程中出现的问题及解决办法 ..................................................................... 8

题目2 组合逻辑电路设计报告(可对4位数据进行大于、等于、小于比较) ................................................................................................9

1、程序功能框图 ......................................................................................................... 9 2、VHDL源程序 ............................................................................................................ 9 3、调试 ....................................................................................................................... 10 4、功能测试 ................................................................................................................11 5、硬件管教锁定 ....................................................................................................... 12 6、硬件验证结果 ....................................................................................................... 12 7、实验过程中出现的问题及解决办法 ................................................................... 14

题目3 时序逻辑电路设计报告(带清零的异步可逆(加1或减1)4进制计数器) ..................................................................................15

1、程序功能框图 ....................................................................................................... 15 2、VHDL源程序 .......................................................................................................... 15 3、调试 ....................................................................................................................... 17 4、功能测试 ............................................................................................................... 17 5、硬件管教锁定 ....................................................................................................... 18 6、硬件验证结果 ....................................................................................................... 18 7、实验过程中出现的问题及解决办法 ................................................................... 20

题目4 时序逻辑电路设计报告(带清零的双向移位串入/串出7位移位寄存器) ......................................................................................21

2

1、程序功能框图 ....................................................................................................... 21 2、VHDL源程序 .......................................................................................................... 21 3、调试 ....................................................................................................................... 23 4、功能测试 ............................................................................................................... 23 5、硬件管教锁定 ....................................................................................................... 24 6、硬件验证结果 ....................................................................................................... 25 7、实验过程中出现的问题及解决办法 ................................................................... 27

题目5 点阵显示设计报告 ............................................................28

1、程序功能框图 ....................................................................................................... 28 2、VHDL源程序 .......................................................................................................... 28 3、调试 ....................................................................................................................... 33 4、功能测试 ............................................................................................................... 34 5、硬件管教锁定 ....................................................................................................... 35 6、硬件验证结果 ....................................................................................................... 36 7、实验过程中出现的问题及解决办法 ................................................................... 37

题目6 4位二进制全加器设计报告 .............................................38

1、程序功能框图 ....................................................................................................... 38 2、VHDL源程序 .......................................................................................................... 38 3、调试 ....................................................................................................................... 40 4、功能测试 ............................................................................................................... 41 5、硬件管教锁定 ....................................................................................................... 42 6、硬件验证结果 ....................................................................................................... 42 7、实验过程中出现的问题及解决办法 ................................................................... 43

题目7 出租车计价器设计报告 ....................................................44

1、程序功能框图 ....................................................................................................... 44 2、VHDL源程序 .......................................................................................................... 44 3、调试 ....................................................................................................................... 50 4、功能测试 ............................................................................................................... 50 5、硬件管教锁定 ....................................................................................................... 51 6、硬件验证结果 ....................................................................................................... 51 7、实验过程中出现的问题及解决办法 ................................................................... 53

第二部分:设计个人体会 ...................... 错误!未定义书签。 附件 硬件课程设计任务书 .................. 错误!未定义书签。

3

第一部分:各题目设计报告

题目1 7段数码管显示设计报告

1、程序功能框图

用时钟信号clk控制片选信号del的计数累加,从而一个一个地选择8位不同的数码管显示,固定每一位数码管的显示内容,加大时钟脉冲频率,便可在8位数码管上显示出全部内容。

2、VHDL源程序 library ieee;

use ieee.std_logic_11.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity LED7 is --LED7为实体名

port( clk : in std_logic; --定义动态扫描时钟信号

4

时钟信号clk 片选信号del 1 0 1 0 0 1 3 1 8位7段数码管显示学号前4位和后4位 ledag : out std_logic_vector(6 downto 0);--定义七位输出信号

del : buffer std_logic_vector(2 downto 0)--定义八位数码管位置信号

); end LED7; --结束实体

architecture behave of LED7 is --behave为结构体名 begin --以begin为标志开始结构体的描述 process(clk) --进程,clk变化时启动进程

variable dount : std_logic_vector(2 downto 0); --计数 begin

if clk'event and clk='1' then--检测时钟上升沿 dount:=dount+1;--计数器dount累加 end if;

del<=dount; --片选信号 end process;--结束进程

process(del) --进程,del变化时启动进程 begin

case del is

when \"000\" => ledag <=\"0000110\"; when \"001\" => ledag <=\"0111111\"; when \"010\" => ledag <=\"0000110\"; when \"011\" => ledag <=\"0111111\"; when \"100\" => ledag <=\"0111111\"; when \"101\" => ledag <=\"0000110\";

5

when \"110\" => ledag <=\"1001111\"; when \"111\" => ledag <=\"0000110\"; end case;

end process; --结束进程 end behave; --结束结构体 3、调试

4、功能测试

6

硬件功能仿真结果如上图所示。clk为时钟信号;片选信号del根据始终信号一个个计数,并分别选择不同的数码管显示;ledag即为数码管显示内容。从图中可以看出,当del为0时,选择第一位数码管,显示学号的第一位数字1,其对应的数码管显示编码为“0000110”;当del为1时,选择第二位数码管,显示学号的第二位数字0,其对应的数码管显示编码为“0111111”。依次往下,功能测试结果正确。

5、硬件管教锁定

7

6、硬件验证结果

如图所示,将时钟信号clk调到一定高的频率后,八位数码管按要求显示学号前四位和后四位“10100131”,硬件验证结果正确。

7、实验过程中出现的问题及解决办法

由于本实验是第一个,初次实验对硬件还不是很熟悉。起初不知道如何循环显示八位数码管而只能显示一位,将每位数码管要显示的内容固定好后,用时钟信号控制片选信号的计数,便将每位数码管的内容一个一个显示了出来。但是后来却不知道如何调节时钟频率,通过老师和同学们的帮助,终于找到了时钟脉冲的管脚,便将8位学号数字以适当的时钟频率一个个显示出来,使得人眼看上去像是8位数字同时显示出来一样。

8

题目2 组合逻辑电路设计报告(可对4位数据进行大于、等于、小于比较)

1、程序功能框图

A>B A=B AB即YA为1,YA对应的LED灯亮;A=B即YC为1,YC对应的LED灯亮;A2、VHDL源程序 LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; ENTITY comp4_v1 IS

PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --四位数A B:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --四位数B YA,YB,YC: OUT STD_LOGIC); --输出A与B的大小关系

9

END comp4_v1;

ARCHITECTURE behave OF comp4_v1 IS BEGIN

PROCESS (A,B) --比较大小 BEGIN

IF (A > B) THEN --A>B YA <='1'; --YA高电平 YB <='0'; YC <='0';

ELSIF(A < B) THEN --AYB <='1'; --YB高电平 YC <='0'; ELSE --A=B YA <='0'; YB <='0';

YC <='1'; --YC高电平 END IF; END PROCESS; END behave; 3、调试

10

4、功能测试

硬件功能仿真结果如上图所示。A、B为要比较的两个数;YA、YB、YC分别输出A、B两数的大小情况。如A为2、B为13时,AB,YA为1等等。功能测试结果正确。

11

5、硬件管教锁定

6、硬件验证结果

如图所示,开关K1、K2、K3、K4为四位数A(K1为高位),开关开关K5、K6、K7、K8为四位数B(K5为高位),LED灯1、2、3分别为YA、YB、YC:

初始时A、B都为0,A=B,YC为1,LED灯3亮;

12

当A为“1000”,B为“0111”时,A>B,YA为1,LED灯1亮;

当A为“0011”,B为“0100”时,A13

7、实验过程中出现的问题及解决办法

经过上一个实验,大体掌握了硬件方面的使用,对硬件实验也比较熟悉了,本次试验比较简单,只需清楚用LED灯显示出两数的大小比较情况,将管脚分配好,便无其它问题了。

14

题目3 时序逻辑电路设计报告(带清零的异步可逆(加1或减1)4进制计数器)

1、程序功能框图

当清零端rd为0时清零,否则按时钟信号依次计数。当k为0时,加法计数,低位按时钟信号依次加1,并根据低位的变化向高位进位,计数加到3时,复位为0;当k为1时,减法计数,低位按时钟信号依次减1,高位根据低位的变化向低位退位,计数减到0时,复位为3。计数器则根据时钟信号以“0,1,2,3”或“3,2,1,0”循环显示。

2、VHDL源程序 LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; ENTITY acounter IS

15

清零端rd 加减控制端k k=0 k=1 加法计数 减法计数 低位按时钟信号加1 低位按时钟信号减1 低位向高位进位 高位向低位退位 PORT (Q : OUT STD_LOGIC_VECTOR(1 downto 0); --计数输出 k,rd,cp:IN STD_LOGIC); --k控制加减,rd清零,cp为时钟信号

END ENTITY acounter;

ARCHITECTURE behave OF acounter IS signal qn:STD_LOGIC_VECTOR(1 downto 0); signal qn0,qn1,qbn0,qbn1:STD_LOGIC; BEGIN

q<=\"00\" when rd='0' else qn; --rd为0时清零 PROCESS (cp,k,qn0,qn1,qbn0,qbn1,qn) begin

if k='0' then --加法计数 qn<=qn1&qn0;

else --减法计数 qn<=qbn1&qbn0; end if;

if (cp'event) and (cp='1')then qn0<= not qn0; --加法加1 qbn0<=not qbn0; --减法减1 end if;

if qn0'event and qn0='0' then qn1<=not qn1; --加法向高位进位 end if;

if qbn0'event and qbn0='1' then qbn1<=not qbn1; --减法向低位退位

16

end if; end process; end behave; 3、调试

4、功能测试

17

cp为时钟信号,rd为清零端。当k=0时,加法计数,输出Q以“0,1,2,3”循环显示;当k=1时,减法计数,输出Q以“3,2,1,0”循环显示。功能测试结果正确。

5、硬件管教锁定

6、硬件验证结果

如图所示,开关K2为加减控制端,置为0时执行加法计数;开关K1为清零端,置为1时,开始按时钟信号加法计数,循环显示“0,1,2,3”:

18

19

硬件验证结果正确。

7、实验过程中出现的问题及解决办法

本次实验中,开始不太了解同步计数器与异步计数器之间的区别和联系,也不熟悉触发器状态方程的表示方法。查阅相关资料后了解到,异步计数器不同于同步计数器,所有触发器的时钟信号都是各自的,提供的方式也有所不同,因此各触发器的状态变化不是同时发生的。计数器也不一定要用触发器状态方程来表示。本实验要求计数器可加可减,不能仅用一个两位数来计数,而必须要四个信号分别表示加法计数和减法计数的两位二进制数(qn0,qn1,qbn0,qbn1)。

20

题目4 时序逻辑电路设计报告(带清零的双向移位串入/串出7位移位寄存器)

1、程序功能框图

输出数据 空缺位补充数据d s=0, 左移 保留数据 空缺位补充数据d s=1, 右移 使能端k 清零端clr 当清零端clr为0时清零,使能端k打开(置1)后进行移位操作。用s控制左移或右移:当s=0时,进行左移,低位空缺位补充输入的数据d;当s=1时,进行右移,高位空缺位补充输入的数据d。使能端k关闭(置0)时,不进行移位操作,即保留原来的数据。

2、VHDL源程序 LIBRARY IEEE ;

USE IEEE.STD_LOGIC_11.ALL; ENTITY double_dir_shifter7 IS PORT (D, K, S, clk, clr: IN BIT;

21

Q : OUT BIT_VECTOR ( 6 DOWNTO 0 )); --输出7位数据

END ENTITY double_dir_shifter7;

ARCHITECTURE behave7 OF double_dir_shifter7 IS SIGNAL temp: BIT_VECTOR ( 6 DOWNTO 0); BEGIN

PROCESS ( clk, clr,s) BEGIN

IF ( clr = '0' ) THEN --清零 temp <=\"0000000\" ;

ELSIF ( clk ='1' AND clk'EVENT ) THEN IF ( K='1') THEN --使能端为1时移位 IF ( s='0') THEN -- 进行左移操作 temp (0) <= D ; -- 左移空缺位补充D FOR i IN 6 DOWNTO 1 LOOP

temp ( i ) <= temp ( i - 1 ) ; END LOOP ;

ELSE -- 进行右移操作 temp (6) <= D ; -- 右移空缺位补充D FOR i IN 0 TO 5 LOOP

temp ( i ) <= temp ( i + 1 ) ; END LOOP ; END IF ;

ELSE temp<=temp; --使能端为0时保留数据 END IF;

22

END IF ;

Q<=temp; --输出temp END PROCESS; END behave7 ; 3、调试

4、功能测试

23

clk为时钟信号,d为输入的数据,作为移位的空缺补充,s控制左移或右移,k为使能端,clr为清零端。如当清零端和使能端均置1时:s=0,数据输出Q按所给时钟信号一个一个往左移,并在右边空缺位补充输入的数据d;s=1,数据输出Q按所给时钟信号一个一个往右移,并在左边空缺位补充输入的数据d。功能测试结果正确。

5、硬件管教锁定

24

6、硬件验证结果

如图所示,K1为数据输入端,K2为左移或右移控制端,K3为使能端,K4为清零端,数据输出由7位LED灯表示:当清零端和使能端置1,K2为1时,数据输出Q按所给时钟信号一个个往右移,并在左边空缺一个个补充输入的数据K1(图中使能端K3为0,是为暂时保留数据以方便截图):

25

硬件验证结果正确。

26

7、实验过程中出现的问题及解决办法

在本次实验中,起初没有理解移位寄存器串入串出的具体含义,也不知道它和并入并出有什么区别,经过老师讲解后,明白了串入串出即一位一位地输入,一位一位地输出,而并入并出则是将多位数据一次性输入,一次性输出。后来为了控制数据停留而不移位,又修改了程序,加入了使能端,打开时则进行移位操作,关闭时则保留数据,使得程序的功能更加完善。

27

题目5 点阵显示设计报告

1、程序功能框图

显示汉字“陈” 显示汉字“圣” 显示汉字“灵” 列扫描频率 单个汉字扫描周期 时钟信号clk

用时钟信号clk控制列扫描频率和单个汉字显示周期。每个汉字都是一列一列显示出来的,设置好单个汉字的扫描周期,按事先编好的汉字点阵显示编码按一定的频率一列列扫描,一个个显示出来。

2、VHDL源程序 library ieee;

use ieee.std_logic_11.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity LedArray is -- LedArray为实体名 port( clk : in std_logic; --时钟输入

keyc : out std_logic_vector(15 downto 0); --点阵列控制

28

keyr : out std_logic_vector(15 downto 0) --点阵行显示

);

end LedArray;--结束实体

architecture behave of LedArray is --behave为结构体名 signal ccount : std_logic_vector(3 downto 0);--信号量,表示列扫描频率

signal count : std_logic_vector(8 downto 0);--计数 signal s : std_logic_vector(1 downto 0);--单个汉字的扫描周期

begin

process(clk) --显示时序控制 进程1 begin --以begin为标志开始结构体的描述 if clk'event and clk='1' then --上升沿 count<=count+1;--计数累加 if count=255 then if s=3 then s<=\"00\"; else s<=s+1; end if; s<=s+1; else s<=s; end if;

29

if ccount<15 then --控制列扫描频率 ccount<=ccount+1; else

ccount<=\"0000\"; end if; end if;

end process; --结束进程1 process(ccount,s)--进程2 汉字扫描 begin

case ccount is --列扫描频率

when \"0000\"=>keyc<=\"0000000000000001\"; --列选择 when \"0001\"=>keyc<=\"0000000000000010\";--列扫描 共扫描16列

when \"0010\"=>keyc<=\"0000000000000100\"; when \"0011\"=>keyc<=\"0000000000001000\"; when \"0100\"=>keyc<=\"0000000000010000\"; when \"0101\"=>keyc<=\"0000000000100000\"; when \"0110\"=>keyc<=\"0000000001000000\"; when \"0111\"=>keyc<=\"0000000010000000\"; when \"1000\"=>keyc<=\"0000000100000000\"; when \"1001\"=>keyc<=\"0000001000000000\"; when \"1010\"=>keyc<=\"0000010000000000\"; when \"1011\"=>keyc<=\"0000100000000000\"; when \"1100\"=>keyc<=\"0001000000000000\"; when \"1101\"=>keyc<=\"0010000000000000\";

30

when \"1110\"=>keyc<=\"0100000000000000\"; when \"1111\"=>keyc<=\"1000000000000000\"; when others=>keyc<=\"0000000000000000\"; end case;

if s=\"00\" then --汉字“陈”扫描时间 case ccount is

when \"0000\"=>keyr<=\"1111111111111111\"; --列显示陈 when \"0001\"=>keyr<=\"0000000000000001\"; when \"0010\"=>keyr<=\"1111101111011101\"; when \"0011\"=>keyr<=\"1111011110100101\"; when \"0100\"=>keyr<=\"1111100001111001\"; when \"0101\"=>keyr<=\"1101111111110111\"; when \"0110\"=>keyr<=\"1110111001110111\"; when \"0111\"=>keyr<=\"1111001010110111\"; when \"1000\"=>keyr<=\"1011111011000111\"; when \"1001\"=>keyr<=\"0111111011110000\"; when \"1010\"=>keyr<=\"1000000000010111\"; when \"1011\"=>keyr<=\"1111111011110111\"; when \"1100\"=>keyr<=\"1111101001110111\"; when \"1101\"=>keyr<=\"1110011011110011\"; when \"1110\"=>keyr<=\"1100111111110111\"; when \"1111\"=>keyr<=\"1111111111111111\"; when others=>keyr<=\"1111111111111111\"; end case;

elsif s=\"01\" then --汉字“圣”扫描时间

31

case ccount is

when \"0000\"=>keyr<=\"1011110111111111\"; --列显示圣 when \"0001\"=>keyr<=\"1011110111111111\"; when \"0010\"=>keyr<=\"1011111011111101\"; when \"0011\"=>keyr<=\"1011101011111001\"; when \"0100\"=>keyr<=\"1011101101110101\"; when \"0101\"=>keyr<=\"1011101101110101\"; when \"0110\"=>keyr<=\"1011101110101101\"; when \"0111\"=>keyr<=\"1000000011011101\"; when \"1000\"=>keyr<=\"1011101110101101\"; when \"1001\"=>keyr<=\"1011101110110101\"; when \"1010\"=>keyr<=\"1011100101110101\"; when \"1011\"=>keyr<=\"1011101101111001\"; when \"1100\"=>keyr<=\"1011111011111101\"; when \"1101\"=>keyr<=\"1001110011111111\"; when \"1110\"=>keyr<=\"1011111011111111\"; when \"1111\"=>keyr<=\"1111111111111111\"; when others=>keyr<=\"1111111111111111\"; end case;

else --汉字“灵”扫描时间 case ccount is

when \"0000\"=>keyr<=\"1111111111111111\"; --列显示灵 when \"0001\"=>keyr<=\"0111111111111111\"; when \"0010\"=>keyr<=\"0111111111011101\"; when \"0011\"=>keyr<=\"1011111011010101\";

32

when \"0100\"=>keyr<=\"1011110111010101\"; when \"0101\"=>keyr<=\"1101100111010101\"; when \"0110\"=>keyr<=\"1110111111010101\"; when \"0111\"=>keyr<=\"1111001111010101\"; when \"1000\"=>keyr<=\"1111110000010101\"; when \"1001\"=>keyr<=\"1111001111010101\"; when \"1010\"=>keyr<=\"1110111111010101\"; when \"1011\"=>keyr<=\"1101101111010101\"; when \"1100\"=>keyr<=\"1101110111010101\"; when \"1101\"=>keyr<=\"1011110010000000\"; when \"1110\"=>keyr<=\"0011111111111101\"; when \"1111\"=>keyr<=\"1011111111111111\"; when others=>keyr<=\"1111111111111111\"; end case; end if;

end process;--结束进程2 各个进程之间是并发执行的 end behave;--结束结构体behave 3、调试

33

4、功能测试

clk为时钟信号,keyc为列控制端,keyr为列显示端。keyc按时钟信号一列列往下选择,keyr则按照点阵显示编码显示当前选择的列的每个点 的亮灭情况(由1,0表示),从而显示出汉字“陈”,“圣”,“灵”。功能测

34

试结果正确。

5、硬件管教锁定

35

6、硬件验证结果

如图所示,16x16点阵按所给时钟信号以一定的扫描周期循环显示汉字“陈”,“圣”,“灵”。

36

硬件验证结果正确。

7、实验过程中出现的问题及解决办法

在本次实验中,由于老师给的指导书中有本题目详细解说,并给出了类似的vhdl源程序,所以只需修改其中点阵显示的汉字编码以及循环显示的扫描周期即可,其它并没有太大的问题。

37

题目6 4位二进制全加器设计报告

1、程序功能框图 cout 一位二 进制全加器 一位二进制全加器 一位二进制全加器 一位二进制全加器 cin 两个4位二进制数输入 一位二进制全加器可由vhdl编写,列举出所有两数相加情况,将其作为一个基本部件,将低位的进位输出作为高位的初始进位输入,用4个一位二进制全加器即可构成一个4位二进制全加器。

2、VHDL源程序

1位二进制全加器vhdl源程序: library ieee;

use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; entity add4 is

port ( a,b: in std_logic;

ci : in std_logic; --初始输入进位 co:out std_logic; --输出进位 s:out std_logic); --加法结果输出

38

一个4位二进制数输出 end add4;

architecture sample4 of add4 is begin

process(a,b,ci)

begin --加法情况列举

if(a='0' and b='0'and ci='0') then s<='0'; co<='0';

elsif (a='1' and b='0'and ci='0') then s<='1'; co<='0';

elsif (a='0' and b='1'and ci='0') then s<='1'; co<='0';

elsif (a='1' and b='1'and ci='0') then s<='0'; co<='1';

elsif (a='0' and b='0'and ci='1') then s<='1'; co<='0';

elsif (a='0' and b='1'and ci='1') then s<='0'; co<='1';

elsif (a='1' and b='0'and ci='1') then s<='0';

39

co<='1'; else s<='1'; co<='1'; end if; end process; end sample4;

4位二进制全加器图形输入方式:

3、调试

40

4、功能测试

a0,a1,a2,a3和b0,b1,b2,b3分别为要相加的两个4位二进制数(0为

41

低位,3为高位),cin为初始输入进位,cout为结果进位输出,s0,s1,s2,s3为加法结果(4位二进制数,0为低位,3为高位)。如当cin为0时,a3a2a1a0=0101,b3b2b1b0=0011,则s3s2s1s0=1000,cout=0。功能测试结果正确。

5、硬件管教锁定

6、硬件验证结果

42

如图所示,k4k3k2k1为a3a2a1a0,k8k7k6k5为b3b2b1b0,s1为cin,LED4—LED1为s3s2s1s0,LED5为cout。当a3a2a1a0=1100,b3b2b1b0=0000,cin=1时,s3s2s1s0=1101,cout=0。硬件验证结果正确。

7、实验过程中出现的问题及解决办法

在本次实验中,由于之前老师带我们一起做过相类似的图形输入方式的全加器,因此比较熟悉,只需把全加器的位数改为4位即可。图形输入方式像是连接电路一样,须将每根线都连接好,对上位,才不会出错。

43

题目7 出租车计价器设计报告

1、程序功能框图

前四位显示路程(单位:十米),后四位显示车费(单位:元) 两位路程米计数器 百米 脉冲 三位路程百米计数器 千米 脉冲 四位车费元计数器 车轮脉冲 车轮转一圈表示一米,用计数器累计车轮脉冲即可得出行驶路程;出租车起步价3元,超过部分1元/公里(不足1公里按1公里计算),用计数器累计千米脉冲即可得出计费数据。最后用时钟信号控制将两组数据显示在8位7段数码管上(与实验1相似),前四位显示路程(单位:十米),后四位显示车费(单位:元)。

2、VHDL源程序 library ieee;

use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; entity taxi is

44

port( clr :in std_logic; --清零端

clk0,clk1 :in std_logic;--clk0控制路程和车费计数,clk1控制数码管显示

q:out std_logic_vector(6 downto 0); --输出7段数码管 del:buffer std_logic_vector(2 downto 0)); --8位数码管片选信号

end entity;

architecture jifei of taxi is

signal s1,s2:std_logic_vector(3 downto 0);--s1、s2分别为路程个、十位(单位:米),两位路程米计数器

signal temp,d1,d2,d3:std_logic_vector(3 downto 0);--d1、d2、d3分别为路程百、千、万位(单位:米),三位路程百米计数器

signal d: std_logic_vector(3 downto 0);

signal p1,p2,p3,p4:std_logic_vector(3 downto 0);--p1、p2、p3、p4分别为车费个、十、百、千位(单位:元),四位车费元计数器

begin

process(clr,clk0) begin

if clr='0' then --清零 s1<=\"0000\"; s2<=\"0000\"; d1<=\"0000\"; d2<=\"0000\"; d3<=\"0000\"; p1<=\"0000\";

45

p2<=\"0000\"; p3<=\"0000\"; p4<=\"0000\"; temp<=d2;

elsif clk0'event and clk0='1'then --车轮脉冲

if p1=\"0000\" and p2=\"0000\" and p3=\"0000\" and p4=\"0000\" then p1<=\"0011\"; --按车轮脉冲开始计费 elsif temp/=d2 then

p1<=p1+'1'; --车费按千米脉冲加1(1元/公里) temp<=d2; end if;

if p1=\"1001\" and p2=\"1001\" and p3=\"1001\" and p4=\"1001\"then p1<=\"0000\"; p2<=\"0000\"; p3<=\"0000\"; p4<=\"0000\";

elsif p1=\"1001\" and p2=\"1001\" and p3=\"1001\" then p1<=\"0000\"; p2<=\"0000\"; p3<=\"0000\"; p4<=p4+'1';

elsif p1=\"1001\" and p2=\"1001\" then p1<=\"0000\"; p2<=\"0000\"; p3<=p3+'1';

46

elsif p1=\"1010\" then p1<=\"0000\"; p2<=p2+'1'; end if; --车费计数

if s1=\"1001\" and s2=\"1001\" and d1=\"1001\" and d2=\"1001\" and d3=\"1001\" then

s1<=\"0000\"; s2<=\"0000\"; d1<=\"0000\"; d2<=\"0000\"; d3<=\"0000\";

elsif s1=\"1001\" and s2=\"1001\" and d1=\"1001\" and d2=\"1001\" then s1<=\"0000\"; s2<=\"0000\"; d1<=\"0000\"; d2<=\"0000\"; d3<=d3+'1';

elsif s1=\"1001\" and s2=\"1001\" and d1=\"1001\" then s1<=\"0000\"; s2<=\"0000\"; d1<=\"0000\";

temp<=d2;d2<=d2+'1'; --千米脉冲 elsif s1=\"1001\" and s2=\"1001\" then s1<=\"0000\"; s2<=\"0000\";

47

d1<=d1+'1'; elsif s1=\"1001\" then s1<=\"0000\"; s2<=s2+'1'; else

s1<=s1+'1'; end if; --路程计数 end if; end process;

process(clk1) --进程,clk变化时启动进程

variable dount : std_logic_vector(2 downto 0); --变量,计数

begin

if clk1'event and clk1='1' then--检测时钟上升沿 dount:=dount+1;--计数器dount累加 end if;

del<=dount; --片选信号 end process;--结束进程

process(del) --进程,del变化时启动进程 begin

case del is

when \"000\" => d<=d3; --路程万位 when \"001\" => d<=d2; --路程千位 when \"010\" => d<=d1; --路程百位 when \"011\" => d<=s2; --路程十位

48

when \"100\" => d<=p4; --车费千位 when \"101\" => d<=p3; --车费百位 when \"110\" => d<=p2; --车费十位 when \"111\" => d<=p1; --车费个位

--路程显示以十米为单位,车费显示以元为单位 end case;

end process; --结束进程 process(d) begin case d is

when \"0000\" => q <=\"0111111\";--七段数码管显示0 when \"0001\" => q <=\"0000110\";--七段数码管显示1 when \"0010\" => q <=\"1011011\";--七段数码管显示2 when \"0011\" => q <=\"1001111\";--七段数码管显示3 when \"0100\" => q <=\"1100110\";--七段数码管显示4 when \"0101\" => q <=\"1101101\";--七段数码管显示5 when \"0110\" => q <=\"1111101\";--七段数码管显示6 when \"0111\" => q <=\"0000111\";--七段数码管显示7 when \"1000\" => q <=\"1111111\";--七段数码管显示8 when \"1001\" => q <=\"1101111\";--七段数码管显示9 when others=>q<=\"0000000\"; end case; end process; end jifei;

49

3、调试

4、功能测试

50

clk0为车轮脉冲,clk1为时钟信号,clr为清零端,del为数码管显示片选信号,q为7段数码管输出显示。车轮脉冲一打开,计数器开始计数,数码管按显示编码一位位显示当前位数据。功能测试结果正确。

5、硬件管教锁定

6、硬件验证结果

如图所示,8位7段数码管前四位显示路程(单位:十米),后四位显示车费(单位:元):

51

按下清零端s1后,显示全0;

打开车轮脉冲后,开始计数,1公里内起步价3元,超过部分1元/公里(不足1公里按1公里计算)。

硬件验证结果正确。

52

7、实验过程中出现的问题及解决办法

在本次实验中,出租车计费模块出现错误,小于一公里时仍计费为0,当路程走到1公里时才计费为3,而不是1公里内计费为3。将计费放在clk0的控制下后,只要一将车轮脉冲打开(表示有人上车),便计费为3(起步价),之后改变计数器步长,1元/公里。

53

因篇幅问题不能全部显示,请点此查看更多更全内容