《VHDL硬件课程设计实验报告.doc》由会员分享,可在线阅读,更多相关《VHDL硬件课程设计实验报告.doc(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、硬件课程设计实验报告一、全加器设计1、 实验目的(1) 了解四位全加器的工作原理。(2) 掌握基本组合逻辑电路的FPGA实现。(3) 熟练应用Quartus II进行FPGA开发。2、 实验原理全加器是由两个加数Xi和Yi 以及低位来的进位Ci-1作为输入,产生本位和Si以及向高位的进位Ci的逻辑电路。它不但要完成本位二进制码Xi 和Yi 相加,而且还要考虑到低一位进位Ci-1的逻辑。对于输入为Xi、Yi和Ci-1,输出为Si和Ci的情况,根据二进制加法法则可以得到全加器的真值表如下表所示:全加器真值表Xi Yi Ci-1SiCi0 0 0000 0 1100 1 0100 1 1011 0
2、0101 0 1011 1 0011 1 111由真值表得到Si和Ci的逻辑表达式经化简后为:这仅仅是一位的二进制全加器,要完成一个四位的二进制全加器,只需要把四个级联起来即可。i3、 实验内容本实验要完成的任务是设计一个四位二进制全加器。具体的实验过程就是利用实验系统上的拨动开关模块的K1K4作为一个加数X输入,K5K8作为另一个加数Y输入,用LED模块的LED1LED8来作为结果S输出,LED亮表示输出1,LED灭表示输出0。实验箱中的拨动开关、LED与FPGA的接口电路,以及拨动开关、LED与FPGA的管脚连接在以前的实验中都做了详细说明,这里不在赘述。4、实验现象与结果以设计的参考示例
3、为例,当设计文件加载到目标器件后,拨动相应的拨动开关,输入两个四位的加数,则在LED灯上显示这两个数值相加的结果的二进制数。5、实验报告(1) 出不同的加数,绘仿真波形,并作说明。(2) 在这个程序的基础上设计一个八位的全加器。(3) 在这个程序的基础上,用数码管来显示相乘结果的十进制值。(4) 将实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。二、 七段数码显示设计1、七段显示基本原理七段显示器,在许多产品或场合上经常可见。其内部结构是由八个发光二极管所组成,为七个笔画与一个小数点,依顺时针方向为A、B、C、D、E、F、G与DP等八组发光二极管之排列,可用以显示09数字及英
4、文数A、B、C、D、E、F。目前常用的七段显示器通常附有小数点,如此使其得以显示阿拉伯数之小数点部份。七段显示器的脚位和线路图如下图2.1所示。 图2.1 七段显示器俯视图由于发光二极管只有在顺向偏压的时候才会发光。因此,七段显示器依其结构不同的应用需求,区分为低电位动作与高电位动作的两种型态的组件,另一种常见的说法则是共阳极( 低电位动作 )与共阴极( 高电位动作 )七段显示器,如下图2.2所示。 ( 共阳极 ) ( 共阴极 )图2.2 七段数码管内部要如何使七段显示器发光呢?对于共阴极规格的七段显示器来说,必须使用“ Sink Current ”方式,亦即是共同接脚COM为VCC,并由Cy
5、clone II FPGA使接脚成为高电位,进而使外部电源将流经七段显示器,再流入Cyclone II FPGA的一种方式本实验平台之七段显示器模块接线图如下图2.3所示。此平台配置了八组共阳极之七段显示器,亦即是每一组七段显示器之COM接脚,均接连至VCC电源。而每一段发光二极管,其脚位亦均与Cyclone II FPGA接连。四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。图2.3 七段显示器模块接线图2、七段显示器显示
6、原理七段显示器可用来显示单一的十进制或十六进制的数字,它是由八个发光二极管所构成的( 每一个二极管依位置不同而赋予不同的名称,请参见图2.1 ) 。我们可以简单的说,要产生数字,便是点亮特定数据的发光二极管。例如要产生数字“0”,须只点亮A、B、C、D、E、F等节段的发光二极管;要产生数字“5”,则须点亮A、C、D、F、G等节段发光二极管,以此类推,参见图2.4。因此,以共阳极七段显示器而言,要产生数字“0”,必须控制Cyclone II FPGA芯片接连至A、B、C、D、E、F 等接脚呈现“低电位”,使电路形成通路状态。表2-1则为共阳极七段显示器显示之数字编码。图2.4 七段显示器显示阿拉
7、伯数字表2-1、共阳极七段显示器显示数字编码资料DPGFEDCBA16进制011000000C0111111001F9210100100A4310110000B0410011001995100100109261000001082711111000F881000000080本实验要求完成的任务是在时钟信号的作用下,通过输入的键值在数码管上显示相应的键值。在实验中时,数字时钟选择1KHZ作为扫描时钟,用四个拨动开关做为输入,当四个拨动开关置为一个二进制数时,在数码管上显示其十六进制的值。实验箱中的拨动开关与FPGA的接口电路,以及拨动开关FPGA的管脚连接在实验一中都做了详细说明,这里不在赘述。数
8、码管显示模块的电路原理如图2.5所示, 图2.5 数字时钟信号模块电路原理3、实验现象与结果以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号源模块的时钟选择为1KHZ,拨动四位拨动开关,使其为一个数值,则八个数码管均显示拨动开关所表示的十六进制的值。4、实验报告(1) 绘出仿真波形,并作说明。(2) 说明扫描时钟是如何工作的,改变扫描时钟会有什么变化。(3) 将实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。 三、 1616点阵显示1、 点阵显示原理1)点阵模块说明此设计采用4块88的点阵块组成1616的点阵显示模块(1)88点阵块工作原理如图3.1(a)所示。8
9、8点阵块工作方式:Q端加正电压,COM端接地时发光二管点亮。例如,当COM8接地且Q1Q8分别接高电平时,第一行亮。同理,当COM7接地,Q1Q8分别接高电平时,第二行亮。依此类推。当Q5端加高电平时,分别让COM1COM8接地,第一列亮。其它列依此类推。(2)1616点阵模块用4块88的点阵块组成1616的点阵模块显示汉字,连接关系如图3.1(b)所示。Q0Q15成为点阵块的行线,COM0COM15形成点阵块的列线。(a) (b)图3.1 点阵模块图(3)行列驱动由循环计数器输出经放大后的驱动点阵,形成动态扫描,分别控制一列中的每个灯,当列线发出信号后,行线同时发出数据,这样就将一个汉字由左
10、到右分成16列。在完成各列的同时,行线发出行数据,一个循环就可以将一个汉字完整的重现在1616的点阵模块上。 本实验主要完成汉字字符在LED上的显示,1616扫描LED点阵的工作原理与8位扫描数码管类似,只是显示的方式与结果不一样而已。下面就本实验系统的1616点阵的工件原理做一些简单的说明。1616点阵由此256个LED通过排列组合而形成16行16列的一个矩阵式的LED阵列,俗称1616点阵。单个的LED的电路如下图3.2所示:图3.2 单个LED电路图由上图可知,对于单个LED的电路图当Rn输入一个高电平,同时Cn输入一个低电平时,电路形成一个回路,LED发光。也就是LED点阵对应的这个点
11、被点亮。16*16点阵也就是由16行和16列的LED组成,其中每一行的所有16个LED的Rn端并联在一起,每一列的所有16个LED的Cn端并联在一起。通过给Rn输入一个高电平,也就相当于给这一列所有LED输入了一个高电平,这时只要某个LED的Cn端输入一个低电平时,对应的LED就会被点亮。具体的电路如下图3.3所示:图3.3 1616点阵电路原理图在点阵上显示一定有字符是根据其字符在点阵上的显示的点的亮灭来表示的如下图3.4所示: 图3.4 字符在点阵上的显示在上图中,显示的是一个“汉”字,只要将被“汉”字所覆盖的区域的点点亮,则在点阵中就会显示一个“汉”字。根据前面我们所介绍的点阵显示的原理
12、。当我们选中第一列后,根据要显示汉字的第一列中所需要被点亮的点对应的Rn置为高电平,则在第一列中需要被点亮的点就会被点亮。依此类推,显示第二列、第三列第N列中需要被点亮的点。然后根据人眼的视觉原理,将每一列显示的点的间隔时间设为一定的值,那么我们就会感觉显示一个完整的不闪烁的汉字。同时也可以按照这个原理来显示其它的汉字。下图3.5是一个汉字显示所需要的时序图:图3.5 显示时序图在上图中,在系统时钟的作用下,首先选取其中的一列,将数据输入让这列的LED显示其数据(当为高电平时LED发光,否则不发光)。然后选取下一列来显示下一列的数据。当完成一个1616点阵的数据输入时,即列选择计数到最后一列后
13、,再从第一列开始输入相同的数据。这样只要第一次显示第一列的数据和第二次显示第一列的数据的时间足够短,那么人的眼睛就会看到第一列的数据总是显示的,而没有停顿现象。同样的道理其它列也是这样,直到显示下一个汉字。在实际的运用当中,一个汉字是由多个八位的数据来构成的,那么要显示多个汉字的时候,这些数据可以根据一定的规则存放到存储器中,当要显示这个汉字的时候只要将存储器中对应的数据取出显示即可。本实验的示例程序依次显示的是“硬件课程设计-计07A你自己的学号和名字”。数据量不大,所以没有放入存储器中,而在程序中直接输入对应的一个16位的数据。示例程序的字库数据的格式如下图3.6所示:图3.6 字库格式
14、图3.7 1616点阵显示的电路框图2、实验内容本实验要求完成的任务是通过编程实现对1616点阵的控制。在点阵的循环显示“硬件课程设计-计07A你自己的学号和名字”这几个汉字和字符。3、实验结果与现象以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号源模块的时钟选择为1KHZ,在点阵模块循环依次显示“硬件课程设计-计07A你自己的学号和名字”每个字符的显示约为0.5秒。最后显示RC的时间约为2秒,然后再次显示“硬件课程设计-计07A你自己的学号和名字。4、实验报告(1) 在这个程序的基础上试写出其它汉字的字库并在点阵上显示出来。(2) 思考怎样让汉字旋转和左右移动。(3) 试利用FP
15、GA的ROM将字库存入ROM,然后再调用的形式编写程序。(4) 绘出仿真波形图,并加以说明。 四、多功能数字钟的设计1、数字钟多功能数字钟应该具有的功能有:显示时分秒、整点报时、小时和分钟可调等基本功能。首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的范围是从023时。在实验中为了显示的方便,由于分钟和秒钟显示的范围都是从059,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD码)显示个位,对于小时因为它的范围是从023,
16、所以可以用一个2位的二进制码显示十位,用4位二进制码(BCD码)显示个位。实验中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz时钟信号,但是扫描确需要一个比较高频率的信号,因此为了得到准确的1Hz信号,必须对输入的系统时钟进行分频。2、数字钟设计思想(1)整体设计框图数字时钟的设计框架如图4.1所示。图4.1 数字钟的组成框图(2)数字钟设计流程图(3)数字钟晶体振荡器电路给数字钟提供一个频率稳定的方波信号,可保证数字钟的走时准确及稳定,不管指针式的电子钟还是数字显示的电子钟都是用了晶体振荡器电路,如下图对于整点报时功能,用户可以根据系统的硬件结构和自身的具体要求来设计。本实验设计的
17、是当进行整点的倒计时5秒时,让LED来闪烁进行整点报时的提示。3、实验内容本实验的任务就是设计一个多功能数字钟,要求显示格式为:小时分钟秒钟,整点报时,报时时间为5秒,即从整点前5秒钟开始进行报时提示,LED开始闪烁,过整点后,停止闪烁。系统时钟选择时钟模块的10KHz,要得到1Hz时钟信号,必须对系统时钟进行10,000次分频。调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。另外用S8按键作为系统时钟复位,复位后全部显示000000。4、实验结果与现象以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号源模
18、块的时钟选择为1MHZ,数码管开始显示时间,从00-00-00开始。在整点的前5秒的时候,LED灯模块的LED1-LED5开始闪烁。一旦超过整点,LED停止显示。按动按键开关的S1、S2小时和分钟开始步进,进行时间的调整。按下按键开关的S8,显示恢复到00-00-00重新开始显示时间。5、实验报告(1) 绘出仿真波形,并作说明。(2) 将实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。(3) 在此实验的基础上试用其它的方法来实现数字钟的功能,并增加其它功能。五、出租车计费器的设计1、出租车计费器设计原理出租车计费器一般都是按公里计费,通常是起步价xx元(xx元可以行走x公里)
19、,然后再是xx元/公里。所以要完成一个出租车计费器,就要有两个计数单位,一个用来计公里,另外一个用来计费用。通常在出租车的轮子上都有传感器,用来记录车轮转动的圈数,而车轮子的周长是固定的,所以知道了圈数自然也就知道了里程。在这个实验中,就要模拟出租车计费器的工作过程,用直流电机模拟出租车轮子,通过传感器,可以得到电机每转一周输出一个脉冲波形。结果的显示用8个七段码管,前四个显示里程,后四个显示费用。在设计VHDL程序时,首先在复位信号的作用下将所有用到的寄存器进行清零,然后开始设定到起步价记录状态,在此状态时,在起步价规定的里程里都一直显示起步价,直到路程超过起步价规定的里程时,系统转移到每公
20、里计费状态,此时每增加一公里,计费器增加相应的费用。2、出租车计费器设计思路图5.1 基于CPLD/FPGA的出租车计费组成原理基于CPLD/FPGA的出租车计费器的组成如图5.1所示。各部分主要功能如下:(1)A计数器对车轮传感器送来的脉冲信号进行计数(每转一圈送一个脉冲)。 (2)B计数器对百米脉冲进行累加,并输出实际公里数给译码动态扫描模块。 (3)C计数器实现步公里的累加计数,每1000米计费一次。(4)译码动态扫描将路程与费用的数值译码后用动态扫描的方式驱动数码管。(5)数码管显示将公里数和计费金额均用LED数码管显示1)信号输入模块直流电机用来模拟出租车的车轮子,每转动一圈认为是行
21、走1米,所以每旋转1000圈,认为车子前进1公里2)计程模块计程模块是一个模为10、步长为1的加法计数器。并将计数值送译码动态扫描模块进行显示。3)计费模块计费模块是一个模为10、步长可变的加法计数器。起步价3元,准行1公里,以后1元/公里,并将计数值送译码动态扫描模块进行显示。4) 显示模块显示模块由七段LED数码管译码和动态扫描显示两部分组成。本次设计采用的是共阴极七段数码管,根据16进制数和七段显示段码表的对应关系,用VHDL的With_Select或When_Else语句可方便实现它们的译码。 动态扫描是利用人眼的视觉暂留原理,只要扫描频率不小于24Hz,人眼就感觉不到显示器的闪烁另外
22、讲一讲编写过程中的的一些小技巧。为了便于显示,在编写过程中的数据用BCD码来显示,这样就不存在数据格式转换的问题。比如表示一个三位数,那么就分别用四位二进制码来表示,当个位数字累加大于9时,将其清零,同时十位数字加1,依此类推。3、实验内容 本实验要完成的任务就是设计一个简单的出租车计费器,要求是起步价3元,准行1公里,以后1元/公里。显示部分的七段码管扫描时钟选择时钟模块的1KHz,电机模块的跳线选择GND端,这样通过旋钮电机模块的电位器,即可达到控制电机转速的目的。另外用按键模块的S1来作为整个系统的复位按钮,每复位一次,计费器从头开始计费。直流电机用来模拟出租车的车轮子,没转动一圈认为是
23、行走1米,所以每旋转1000圈,认为车子前进1公里。系统设计是需要检测电机的转动情况,每转一周,计米计数器增加1。七段码管显示要求为前4个显示里程,后3个显示费用。实验箱中用到的数字时钟模块、按键开关、直流电机模块、数码管与FPGA的接口电路,以及数字时钟源、按键开关、LED、数码管与FPGA的管脚连接在以前的实验中都做了详细说明,这里不在赘述。4、实验结果与现象以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号源模块的时钟选择为1KHZ,拨动八位拨动开关,使其为一个数值,则输入的时钟信号使LED灯开始闪烁,改变拨动开关,LED的闪烁快慢会按一定的规则发生改变。5、 实验报告(1)绘
24、出仿真波形,并作说明。(2)将实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。六、简单CPU设计运用VHDL设计简单的模型机控制器。该模型机字长16位,CPU内部有4个通用寄存器,全部使用单字长指令,有4种指令格式,具体格式如下图所示:格式1:寄存器寻址方式 Rx (Rx) OP (Ry) 格式2:立即数寻址方式 R0 I格式3:无操作数指令格式4:直接寻址方式 R0(Addr)有如下几种指令:操作码OP助记符操作内容0000Idle无操作,PC:=PC+10001Load DataR0-I;PC:=PC+10010Move Rx,RyRx-(Ry);PC:=PC+10011
25、Add Rx,RyRx-(Rx)+(Ry);PC:=PC+10100Sub Rx,RyRx-(Rx)-(Ry);PC:=PC+10101AND Rx,RyRx-(Rx) AND (Ry);PC:=PC+10110OR Rx,RyRx-(Rx) OR (Ry);PC:=PC+10111XOR Rx,RyRx-(Rx) XOR (Ry);PC:=PC+11000Shr RxRx-(Rx)逻辑右移1位;PC:=PC+11001Shl RxRx-(Rx)逻辑左移1位;PC:=PC+11010Swap Rx,RyA-(Ry);Ry-(Rx);Rx-(A);PC:=PC+11011Jmp AddrPC:=PC+1;PC-Addr1100Jz AddrIf(R0)=0 then PC-AddrElse PC:=PC+11101Read AddrR0-(addr);PC:=PC+1;1110Write Addraddr-(R0);PC:=PC+1;1111Stop无操作;PC-PC要求:(1) 设计CPU内部结构,包括PC、IR、MAR、MDR、R3-R0等必要构成部件;(2) 为CPU配置简单的主存储器和输入输出设备;(3) 设计详细的指令执行流程,给出指令执行流程图;(4) 编写指令周期执行代码(5) 通过仿真验证设计的正确性(6) 编写验证指令执行过程的示意程序代码,测试系统
限制150内