北邮数电综合实验报告

点阵赛车游戏

学院:信息与通信工程学院专业:通信工程 班级: 姓名: 学号: 班内序号:

一、 设计课题的任务要求

用8×8点阵进行5秒倒计时显示,当5秒倒计时结束后,点阵显示赛道和赛车的初始位置,赛车游戏开始,并开始计时,用两个数码管显示时间。用红色表示赛道,黄色表示赛车的初始位置,箭头表示赛车行进的方向。用BTN1~BTN3三个按键分别控制赛车的左移、前进、右移,最终使赛车在不碰撞赛道的情况下走完全程,游戏结束,点阵显示“V ”图案,数码管显示走完全程所耗费的时间。当游戏时间超过59秒,或者赛车在行进过程中碰撞赛道,游戏失败,点阵显示“X ”图案。通过按键BTN0进行复位,控制点阵返回到初始状态。

二、 系统设计 1、 设计思路

这个过程乍一看蛮复杂的,但是当我经过仔细分析后发现,我的代码可以按照这个游戏的运行过程来写。这个游戏分为4个状态,即倒计时,运行,成功和失败。倒计时部分根据不同数字在点阵上的位置很容易设计出来,运行部分便是初始化赛道,赛车的位置,然后用按键来控制赛车运动,在这个过程中要不断判断赛车是否撞墙和到达终点,如果到达终点便进入第三个状态,成功,即显示“V ”;若果撞墙便进入第四个状态,失败,即显示“X ”。在游戏运行的同时数码管还要计时。

2、 总体框图 (1) 系统结构图

(2)ASM图

3、 模块设计 (1) 分频模块

分频器:因为原有低频时钟为50MHZ ,如果直接用这个时钟信号同时实现计时和显示部分,故需两个分频器,分别将时钟频率分为1Hz 和1kHz ,1Hz 用来控制倒计时和游戏运行过程中的计时,1kHz 用来控制点阵和数码管的显示。

(2)游戏模块

刚开始的代码有一个判断是否复位的代码,如果RESET=1,将代码中定义的一些信号初始化,之后整个过程分为四个状态,即STATE 可取0,1,2,3四个值。0处于倒计时状态,1处于用按键控制赛车运动的状态,2处于到达终点的状态,并且显示“V ”,3处于失败的状态,并且显示“X ”。

当STATE=0时,游戏处于倒计时状态,倒计时五秒,利用五个数字在点阵上的不同位置初始化点阵,分别对应五个数字,在时钟1Hz 下做倒计时五秒的工作。

当STATE=1时,处于用按键控制赛车运动的状态,此期间分别用BTN1,BTN2,BTN3来控制赛车的右,前,左的运动方向,运动期间还要不断判断赛车是否撞到墙或者障碍物,以及判断赛车是否到达终点,一次来确定游戏是否进入STATE=2或STATE=3状态。 当STATE=2时,要在点阵上显示“V ”,即给点阵矩阵初始化显示此图形的数据。

当STATE=3时,要在点阵上显示“X ”,即给点阵矩阵初始化显示

此图形的数据。

(3)显示模块

因为所有状态不能同时显示,故循环显示电路分别扫描。当时钟频率足够大时,根据视觉暂留则可看到较为稳定的画面。 点阵显示是在时钟频率1kHz 下一行一行扫描,这样在不同时候就可以显示不同的图形,比如倒计时的5,4,3,2,1和赛道,赛车的位置;其次是数码管的显示,数码管首先有个控制计数的代码,此计数是在时钟频率1Hz 下工作的,然后在时钟频率1kHz 的控制下分别让两个数码管显示,此即为计时器的显示。

三、仿真波形及波形分析

倒计时波形

点阵显示倒计时波形

数码管显示及波形

数码管显示01,02,03

点阵显示波形

点阵列显示波形

点阵行显示波形

四、源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CAR IS PORT(

CLK:IN STD_LOGIC; --时钟信号 RESET:IN STD_LOGIC;--复位输入

CONTROL:IN STD_LOGIC_VECTOR(2 DOWNTO 0);--赛车控制 ROW:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--行控制输出 COLR,COLG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--列控制输出 CAT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);--数码管选通

);

END CAR;

ARCHITECTURE behave OF CAR IS

SIGNAL TEMP1:INTEGER RANGE 0 TO 49999;--分频信号 SIGNAL TEMP2:INTEGER RANGE 0 TO 49999999; SIGNAL CLK1K:STD_LOGIC;--频率1kHz 时钟 SIGNAL CLK1HZ:STD_LOGIC;--频率1Hz 时钟 SIGNAL TIMEH:INTEGER RANGE 0 TO 5;--十位计数

SIGNAL TIMEL:INTEGER RANGE 0 TO 9;--个位计数

SIGNAL LIGHTH:STD_LOGIC_VECTOR(6 DOWNTO 0);--十位数码管控制信号

SIGNAL LIGHTL:STD_LOGIC_VECTOR(6 DOWNTO 0);--个位数码管控制信号 TYPE PRESENT_STATE IS (H,L);--自定义变量 SIGNAL P_STATE:PRESENT_STATE;

SIGNAL STATE:INTEGER RANGE 0 TO 3;--四个状态控制信号 SIGNAL COUNT : INTEGER RANGE 0 TO 6;--倒计时控制信号 SIGNAL CX,CY:INTEGER RANGE 0 TO 7;--赛车坐标控制信号 SIGNAL ROWS:STD_LOGIC_VECTOR(7 DOWNTO 0);--行控制信号

SIGNAL COLR7,COLR6,COLR5,COLR4,COLR3,COLR2,COLR1,COLR0,--列控制信号 BEGIN

COLG7,COLG6,COLG5,COLG4,COLG3,COLG2,COLG1,COLG0:STD_LOGIC_VECTOR(7 DOWNTO 0);

DIV1K:PROCESS(CLK)--分频1kHz BEGIN

IF CLK'EVENT AND CLK = '1' THEN

IF TEMP1 = 49999 THEN

TEMP1

ELSE

IF TEMP1

CLK1K

END IF;

ELSE

CLK1K

END IF;

END PROCESS;

DIV1HZ:PROCESS(CLK)--分频1Hz BEGIN

IF TEMP2 = 49999999 THEN

TEMP2

TEMP2

END IF;

IF TEMP2

CLK1HZ

CLK1HZ

END IF;

END IF;

END PROCESS;

GAMERUN:PROCESS(CLK1HZ,RESET) --游戏运行进程 BEGIN

IF RESET = '1' THEN --复位和初始化

STATE

COLG7

WHEN 0 =>

CASE COUNT IS --点阵倒计时

WHEN 6 => COUNT

COLR7

ELSIF CLK1HZ'EVENT AND CLK1HZ = '1' THEN

WHEN 5 => COUNT

COLR0

WHEN 4 => COUNT

COLR0

WHEN 3 => COUNT COUNT

COLR7 COUNT

COLR7

COLR2

COLR0 COUNT IF TIMEL = 9 THEN--数码管计时 TIMEL COLG0(7-CX) COLG1(7-CX) COLG2(7-CX) COLG3(7-CX) COLG4(7-CX) COLG5(7-CX)

WHEN 7 =>COLG7(7-CX) CX CY CX NULL; END CASE; CASE CY IS--判断移动后是否撞墙 WHEN 0 => IF COLR0(7-CX) = '1' THEN STATE

WHEN 1 => IF COLR1(7-CX) = '1' THEN STATE IF COLR2(7-CX) = '1' THEN STATE

WHEN 3 => IF COLR3(7-CX) = '1' THEN STATE IF COLR4(7-CX) = '1' THEN STATE

WHEN 5 => IF COLR5(7-CX) = '1' THEN STATE

WHEN 6 => IF COLR6(7-CX) = '1' THEN STATE STATE COLR7 COLG7

COLG5

LSTSHOW:PROCESS(CLK1K)--在点阵上显示倒计时、赛道、和赛车

BEGIN

IF CLK1K'EVENT AND CLK1K = '1' THEN CASE ROWS IS WHEN "11111110" => COLR COLR COLR COLR COLR COLR COLR COLR ROWS

END PROCESS;

SHOWT:PROCESS(CLK1K,TIMEH,TIMEL) --将计时译码至数码管上

BEGIN

CASE TIMEH IS WHEN 5=>LIGHTHLIGHTHLIGHTHLIGHTHLIGHTH

WHEN 0=>LIGHTH

WHEN OTHERS=>LIGHTH

END CASE;

CASE TIMEL IS

WHEN 9=>LIGHTL

WHEN 8=>LIGHTL

WHEN 7=>LIGHTL

WHEN 6=>LIGHTL

WHEN 5=>LIGHTL

WHEN 4=>LIGHTL

WHEN 3=>LIGHTL

WHEN 2=>LIGHTL

WHEN 1=>LIGHTL

WHEN 0=>LIGHTL

WHEN OTHERS=>LIGHTL

END CASE;

IF CLK1K'EVENT AND CLK1K='1' THEN --利用视觉暂留显示计时

CASE P_STATE IS

WHEN L => P_STATE

CAT

DISPLAY

WHEN H => P_STATE

CAT

DISPLAY

END CASE;

END IF;

END PROCESS;

END behave;

五、功能说明:

1、 复位:当按下BTN0时,赛道,计时等控制模块初始化,游

戏重启

2、 方向控制:BTN1,BTN2,BTN3分别控制赛车向右,上,左

运动

3、 当赛车撞墙或障碍物时,游戏失败,显示“X ”

4、 当赛车到达终点时,游戏成功,显示“V ”

六、元器件清单及资源利用情况:

1、元器件

系统时钟CLK

点阵行显示ROW[0]—ROW[7]

红点阵列显示COLR[0]—COLR[7],绿点阵列显示COLG[0]—COLG[7] 数码管控制选通CAT0—CAT6

数码管显示DISPLAY[0]-DISPLAY[6]

拨码开关 BTN1,BTN2,BTN3,BTN4

2、资源利用情况

七、实验中遇到的问题

1、刚开始接触这个程序时不知道该如何下手,因此前期的流程图和状态转移图就不知道从何做起,后来经过和同组的同学的讨论后大概有了思路,在经自己独立思考后整理出了初期的那些框图,后来经老师指点发现了很多错误,再经过自己的整理后成了现在的那些框图。

2、模块划分不合理,进程太多:第一次课验收仿真波形时,本以为编译成功的我便信心满满的去了,结果到那里后不但波形没出来,还被老师发现了编译成功后竟然用了零个逻辑单元!后来发现在我的不同进程中同时给同一个信号多次赋值,造成编译时所有进程都没有编译,即老师说的根本就没有电路。随后我将多进程合并成一个进程后就解决了这个问题。

3、粗心大意:写代码的过程中发现我的计时波形一直为零,经过很多同学检查后都一直觉得代码没有问题,于是我便请教了石晓东老师,老师看了一下我的代码也觉得没有问题,后来从我的警告中发现我有一个变量名字写错了,改正过后发现整个计时波形就好了。

4、考虑问题不够周全:还有一项问题就是点阵输出上,刚开始完全没有波形,后来在同学的帮助下发现是在信号给输出变量赋值时少考虑了others 的情况,致使所有的信号压根儿就没有给输出赋值,改正后问题得到了解决。

5、最后一项问题就是时钟,我相信很多同学会遇到类似这样的问题,就是“Error (10822): HDL error at CAR.vhd(90): couldn't implement registers for assignments on this clock edge”,经

过我查阅各种资料以及同学对我的帮助后,我发现凡是在时钟内赋值过的变量便不能在同一进程中的时钟外再次使用了,当我把该进程中所有相关的变量都移入时钟内部后问题得到了解决。

八、总结和结论及心得体会

学习并熟悉了VHDL 语言的编写、VHDL 程序设计。VHDL 程序设计,不用拘泥用某种具体器件的选择和使用,使设计者能专注于工程各部分所需要完成的功能,逻辑感强,可读性强、可移植性好。因为很喜欢做游戏类的编程,所以没有犹豫就选择了赛车游戏,虽然听到这个程序编程不是很容易实现。在实验的第二周我就很快的将程序写了一个完整的,但是在接下来的调试过程中波形一直不能正常运行。对程序进行了很多次大的调整才达到了可以运行的程度,期间因为一定想要自己做出这个程序,用了好多的时间来更改代码和思考程序编写上的逻辑问题。赛车波形图是比较不容易观察的,因为涉及到许多关于数码管和点阵显示的波形。在本次实验中我收获到了很多的东西,我觉得选择赛车这个实验是很值得的。

在实验中我还学到对逻辑器件的编程中,尽量少用IF ELSE以及算术运算的语句,因为这些语句在程序编译后会占用大量的宏单元,所以应该尽量使用CASE WHEN 以及逻辑运算的语句进行编写。在有限的资源内实现自己的目标,不仅要求我们从思想出发实现功能,更要求我们从实际出发优化编程,使资源得到合理的利用。我的程序只用了不到500个逻辑单元,是我们同类实验中资源利用最少的,因此我觉得还是挺满足的。

点阵赛车游戏

学院:信息与通信工程学院专业:通信工程 班级: 姓名: 学号: 班内序号:

一、 设计课题的任务要求

用8×8点阵进行5秒倒计时显示,当5秒倒计时结束后,点阵显示赛道和赛车的初始位置,赛车游戏开始,并开始计时,用两个数码管显示时间。用红色表示赛道,黄色表示赛车的初始位置,箭头表示赛车行进的方向。用BTN1~BTN3三个按键分别控制赛车的左移、前进、右移,最终使赛车在不碰撞赛道的情况下走完全程,游戏结束,点阵显示“V ”图案,数码管显示走完全程所耗费的时间。当游戏时间超过59秒,或者赛车在行进过程中碰撞赛道,游戏失败,点阵显示“X ”图案。通过按键BTN0进行复位,控制点阵返回到初始状态。

二、 系统设计 1、 设计思路

这个过程乍一看蛮复杂的,但是当我经过仔细分析后发现,我的代码可以按照这个游戏的运行过程来写。这个游戏分为4个状态,即倒计时,运行,成功和失败。倒计时部分根据不同数字在点阵上的位置很容易设计出来,运行部分便是初始化赛道,赛车的位置,然后用按键来控制赛车运动,在这个过程中要不断判断赛车是否撞墙和到达终点,如果到达终点便进入第三个状态,成功,即显示“V ”;若果撞墙便进入第四个状态,失败,即显示“X ”。在游戏运行的同时数码管还要计时。

2、 总体框图 (1) 系统结构图

(2)ASM图

3、 模块设计 (1) 分频模块

分频器:因为原有低频时钟为50MHZ ,如果直接用这个时钟信号同时实现计时和显示部分,故需两个分频器,分别将时钟频率分为1Hz 和1kHz ,1Hz 用来控制倒计时和游戏运行过程中的计时,1kHz 用来控制点阵和数码管的显示。

(2)游戏模块

刚开始的代码有一个判断是否复位的代码,如果RESET=1,将代码中定义的一些信号初始化,之后整个过程分为四个状态,即STATE 可取0,1,2,3四个值。0处于倒计时状态,1处于用按键控制赛车运动的状态,2处于到达终点的状态,并且显示“V ”,3处于失败的状态,并且显示“X ”。

当STATE=0时,游戏处于倒计时状态,倒计时五秒,利用五个数字在点阵上的不同位置初始化点阵,分别对应五个数字,在时钟1Hz 下做倒计时五秒的工作。

当STATE=1时,处于用按键控制赛车运动的状态,此期间分别用BTN1,BTN2,BTN3来控制赛车的右,前,左的运动方向,运动期间还要不断判断赛车是否撞到墙或者障碍物,以及判断赛车是否到达终点,一次来确定游戏是否进入STATE=2或STATE=3状态。 当STATE=2时,要在点阵上显示“V ”,即给点阵矩阵初始化显示此图形的数据。

当STATE=3时,要在点阵上显示“X ”,即给点阵矩阵初始化显示

此图形的数据。

(3)显示模块

因为所有状态不能同时显示,故循环显示电路分别扫描。当时钟频率足够大时,根据视觉暂留则可看到较为稳定的画面。 点阵显示是在时钟频率1kHz 下一行一行扫描,这样在不同时候就可以显示不同的图形,比如倒计时的5,4,3,2,1和赛道,赛车的位置;其次是数码管的显示,数码管首先有个控制计数的代码,此计数是在时钟频率1Hz 下工作的,然后在时钟频率1kHz 的控制下分别让两个数码管显示,此即为计时器的显示。

三、仿真波形及波形分析

倒计时波形

点阵显示倒计时波形

数码管显示及波形

数码管显示01,02,03

点阵显示波形

点阵列显示波形

点阵行显示波形

四、源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CAR IS PORT(

CLK:IN STD_LOGIC; --时钟信号 RESET:IN STD_LOGIC;--复位输入

CONTROL:IN STD_LOGIC_VECTOR(2 DOWNTO 0);--赛车控制 ROW:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--行控制输出 COLR,COLG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--列控制输出 CAT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);--数码管选通

);

END CAR;

ARCHITECTURE behave OF CAR IS

SIGNAL TEMP1:INTEGER RANGE 0 TO 49999;--分频信号 SIGNAL TEMP2:INTEGER RANGE 0 TO 49999999; SIGNAL CLK1K:STD_LOGIC;--频率1kHz 时钟 SIGNAL CLK1HZ:STD_LOGIC;--频率1Hz 时钟 SIGNAL TIMEH:INTEGER RANGE 0 TO 5;--十位计数

SIGNAL TIMEL:INTEGER RANGE 0 TO 9;--个位计数

SIGNAL LIGHTH:STD_LOGIC_VECTOR(6 DOWNTO 0);--十位数码管控制信号

SIGNAL LIGHTL:STD_LOGIC_VECTOR(6 DOWNTO 0);--个位数码管控制信号 TYPE PRESENT_STATE IS (H,L);--自定义变量 SIGNAL P_STATE:PRESENT_STATE;

SIGNAL STATE:INTEGER RANGE 0 TO 3;--四个状态控制信号 SIGNAL COUNT : INTEGER RANGE 0 TO 6;--倒计时控制信号 SIGNAL CX,CY:INTEGER RANGE 0 TO 7;--赛车坐标控制信号 SIGNAL ROWS:STD_LOGIC_VECTOR(7 DOWNTO 0);--行控制信号

SIGNAL COLR7,COLR6,COLR5,COLR4,COLR3,COLR2,COLR1,COLR0,--列控制信号 BEGIN

COLG7,COLG6,COLG5,COLG4,COLG3,COLG2,COLG1,COLG0:STD_LOGIC_VECTOR(7 DOWNTO 0);

DIV1K:PROCESS(CLK)--分频1kHz BEGIN

IF CLK'EVENT AND CLK = '1' THEN

IF TEMP1 = 49999 THEN

TEMP1

ELSE

IF TEMP1

CLK1K

END IF;

ELSE

CLK1K

END IF;

END PROCESS;

DIV1HZ:PROCESS(CLK)--分频1Hz BEGIN

IF TEMP2 = 49999999 THEN

TEMP2

TEMP2

END IF;

IF TEMP2

CLK1HZ

CLK1HZ

END IF;

END IF;

END PROCESS;

GAMERUN:PROCESS(CLK1HZ,RESET) --游戏运行进程 BEGIN

IF RESET = '1' THEN --复位和初始化

STATE

COLG7

WHEN 0 =>

CASE COUNT IS --点阵倒计时

WHEN 6 => COUNT

COLR7

ELSIF CLK1HZ'EVENT AND CLK1HZ = '1' THEN

WHEN 5 => COUNT

COLR0

WHEN 4 => COUNT

COLR0

WHEN 3 => COUNT COUNT

COLR7 COUNT

COLR7

COLR2

COLR0 COUNT IF TIMEL = 9 THEN--数码管计时 TIMEL COLG0(7-CX) COLG1(7-CX) COLG2(7-CX) COLG3(7-CX) COLG4(7-CX) COLG5(7-CX)

WHEN 7 =>COLG7(7-CX) CX CY CX NULL; END CASE; CASE CY IS--判断移动后是否撞墙 WHEN 0 => IF COLR0(7-CX) = '1' THEN STATE

WHEN 1 => IF COLR1(7-CX) = '1' THEN STATE IF COLR2(7-CX) = '1' THEN STATE

WHEN 3 => IF COLR3(7-CX) = '1' THEN STATE IF COLR4(7-CX) = '1' THEN STATE

WHEN 5 => IF COLR5(7-CX) = '1' THEN STATE

WHEN 6 => IF COLR6(7-CX) = '1' THEN STATE STATE COLR7 COLG7

COLG5

LSTSHOW:PROCESS(CLK1K)--在点阵上显示倒计时、赛道、和赛车

BEGIN

IF CLK1K'EVENT AND CLK1K = '1' THEN CASE ROWS IS WHEN "11111110" => COLR COLR COLR COLR COLR COLR COLR COLR ROWS

END PROCESS;

SHOWT:PROCESS(CLK1K,TIMEH,TIMEL) --将计时译码至数码管上

BEGIN

CASE TIMEH IS WHEN 5=>LIGHTHLIGHTHLIGHTHLIGHTHLIGHTH

WHEN 0=>LIGHTH

WHEN OTHERS=>LIGHTH

END CASE;

CASE TIMEL IS

WHEN 9=>LIGHTL

WHEN 8=>LIGHTL

WHEN 7=>LIGHTL

WHEN 6=>LIGHTL

WHEN 5=>LIGHTL

WHEN 4=>LIGHTL

WHEN 3=>LIGHTL

WHEN 2=>LIGHTL

WHEN 1=>LIGHTL

WHEN 0=>LIGHTL

WHEN OTHERS=>LIGHTL

END CASE;

IF CLK1K'EVENT AND CLK1K='1' THEN --利用视觉暂留显示计时

CASE P_STATE IS

WHEN L => P_STATE

CAT

DISPLAY

WHEN H => P_STATE

CAT

DISPLAY

END CASE;

END IF;

END PROCESS;

END behave;

五、功能说明:

1、 复位:当按下BTN0时,赛道,计时等控制模块初始化,游

戏重启

2、 方向控制:BTN1,BTN2,BTN3分别控制赛车向右,上,左

运动

3、 当赛车撞墙或障碍物时,游戏失败,显示“X ”

4、 当赛车到达终点时,游戏成功,显示“V ”

六、元器件清单及资源利用情况:

1、元器件

系统时钟CLK

点阵行显示ROW[0]—ROW[7]

红点阵列显示COLR[0]—COLR[7],绿点阵列显示COLG[0]—COLG[7] 数码管控制选通CAT0—CAT6

数码管显示DISPLAY[0]-DISPLAY[6]

拨码开关 BTN1,BTN2,BTN3,BTN4

2、资源利用情况

七、实验中遇到的问题

1、刚开始接触这个程序时不知道该如何下手,因此前期的流程图和状态转移图就不知道从何做起,后来经过和同组的同学的讨论后大概有了思路,在经自己独立思考后整理出了初期的那些框图,后来经老师指点发现了很多错误,再经过自己的整理后成了现在的那些框图。

2、模块划分不合理,进程太多:第一次课验收仿真波形时,本以为编译成功的我便信心满满的去了,结果到那里后不但波形没出来,还被老师发现了编译成功后竟然用了零个逻辑单元!后来发现在我的不同进程中同时给同一个信号多次赋值,造成编译时所有进程都没有编译,即老师说的根本就没有电路。随后我将多进程合并成一个进程后就解决了这个问题。

3、粗心大意:写代码的过程中发现我的计时波形一直为零,经过很多同学检查后都一直觉得代码没有问题,于是我便请教了石晓东老师,老师看了一下我的代码也觉得没有问题,后来从我的警告中发现我有一个变量名字写错了,改正过后发现整个计时波形就好了。

4、考虑问题不够周全:还有一项问题就是点阵输出上,刚开始完全没有波形,后来在同学的帮助下发现是在信号给输出变量赋值时少考虑了others 的情况,致使所有的信号压根儿就没有给输出赋值,改正后问题得到了解决。

5、最后一项问题就是时钟,我相信很多同学会遇到类似这样的问题,就是“Error (10822): HDL error at CAR.vhd(90): couldn't implement registers for assignments on this clock edge”,经

过我查阅各种资料以及同学对我的帮助后,我发现凡是在时钟内赋值过的变量便不能在同一进程中的时钟外再次使用了,当我把该进程中所有相关的变量都移入时钟内部后问题得到了解决。

八、总结和结论及心得体会

学习并熟悉了VHDL 语言的编写、VHDL 程序设计。VHDL 程序设计,不用拘泥用某种具体器件的选择和使用,使设计者能专注于工程各部分所需要完成的功能,逻辑感强,可读性强、可移植性好。因为很喜欢做游戏类的编程,所以没有犹豫就选择了赛车游戏,虽然听到这个程序编程不是很容易实现。在实验的第二周我就很快的将程序写了一个完整的,但是在接下来的调试过程中波形一直不能正常运行。对程序进行了很多次大的调整才达到了可以运行的程度,期间因为一定想要自己做出这个程序,用了好多的时间来更改代码和思考程序编写上的逻辑问题。赛车波形图是比较不容易观察的,因为涉及到许多关于数码管和点阵显示的波形。在本次实验中我收获到了很多的东西,我觉得选择赛车这个实验是很值得的。

在实验中我还学到对逻辑器件的编程中,尽量少用IF ELSE以及算术运算的语句,因为这些语句在程序编译后会占用大量的宏单元,所以应该尽量使用CASE WHEN 以及逻辑运算的语句进行编写。在有限的资源内实现自己的目标,不仅要求我们从思想出发实现功能,更要求我们从实际出发优化编程,使资源得到合理的利用。我的程序只用了不到500个逻辑单元,是我们同类实验中资源利用最少的,因此我觉得还是挺满足的。


相关内容

  • 北邮电子电路综合设计实验报告
  • 北京邮电大学 电子电路综合设计实验报告 课题名称:函数信号发生器的设计 学院:信息与通信工程学院 班级:2013211123 姓名:周亮 学号:2013211123 班内序号:9 一. 摘要 方波与三角波发生器由集成运放电路构成,包括比较器与RC积分器组成. 方波发生器的基本电路由带正反馈的比较器及 ...

  • 北邮2012级电磁场与微波技术实验报告
  • 北京邮电大学 电磁场与微波技术测量与仿真实验报告 学院:电子工程学院 班级:2012211204 组员: 执笔人: 实验目的 (1)通过实地测量校园内室内外的无线电信号场强值,掌握室内外电波传播的规律. (2)熟悉并掌握无线电中的传输损耗,路径损耗,穿透损耗,衰落等概念. (3)熟练使用无线电场强仪 ...

  • 北邮通原软件实验报告
  • 北京邮电大学实验报告 题目: 班级: 专业: 姓名: 成绩: 实验1:抽样定理 一.实验目的 (1)掌握抽样定理 (2)通过时域频域波形分析系统性能 二.实验原理 抽样定理:设时间连续信号m(t),其最高截止频率为fm ,如果用时间间隔为T 抽样过程原理图(时域) 重建过程原理图(频域) 具体而言: ...

  • 在2014级研究生开学典礼上的演讲
  • 同学们,大家好! 为了一个不很方便又不很便宜的研究生公寓,让我们不得不推迟一个月开学,还得举行第二次开学典礼.用bbs上批评家们的话说,"都是扩招惹的祸".(笑声) 其实,研究生的开学典礼单独举行可能更为合理.毕竟,四年的高等教育,使你们与本科新生有着很大的区别.认真论述这种区别 ...

  • 在研究生开学典礼上的讲话:站到科学前沿
  • 同学们,大家好! 为了一个不很方便又不很便宜的研究生公寓,让我们不得不推迟一个月开学,还得举行第二次开学典礼.用 bbs 上批评家们的话说,"都是扩招惹的祸". ( 笑声 ) 其实,研究生的开学典礼单独举行可能更为合理.毕竟,四年的高等教育,使你们与本科新生有着很大的区别.认真论 ...

  • 北邮电子-数电综合实验报告
  • 数字电路综合实验设计 简易出租车计价器的设计与实现 学院: 电子工程学院 班级: 2011211203 学号: 2011210876 姓名: 孙月鹏 班内序号: 04 摘要 本文介绍了利用Quartus II综合性PLD/FPGA开发软件,在MAXII 数字逻辑实验开发板上实现简易出租车计价器功能的 ...

  • 北邮计算机网络技术实践--实验三
  • 计算机网络技术实践 实验报告 实验名称 RIP和OSPF 路由协议的配置及协议流程 姓 名__ 17____ 实 验 日 期: 2014年4月11日 学 号___ _____实验报告日期: 2014年4月12日 报 告 退 发: ( 订正 . 重做 ) 一. 环境(详细说明运行的操作系统,网络平台, ...

  • 北京邮电大学-通信工程导论 (2)
  • 2012‐10‐10 提纲 通信工程专业导论 一. 关于通信:从认知开始 二. 通信发展历史及趋势:历史照亮未来 二 通信发展历史及趋势 历史照亮未来 三. 科研机构和学术团体:成就与责任同在 1 2 三.科研机构和学术团体 贝尔实验室  贝尔实验室(Bell Laboratories), 原是美 ...

  • 全国电子专业大学排名 ---仅供参考
  • 全国电子专业大学排名 ---仅供参考 这里还有其它两个和电磁,微波有关的国家重点实验室(由高能电子研究所管).并说,(在电子通信领域)成电以成为中国会下金蛋的母鸡.----似乎没有提到北邮哟!... 每个学校都有每个学校的优势.清华当然很不错,尤以数字通信,图象处理显长.但它也有不足的地方,如通信网 ...