VHDL实验 双向移位寄存器(完整版).doc
学生实验报告实验课名称:VHDL硬件描述语言实验项目名称:双向移位寄存器专业名称:电子科学与技术班级:电科二班学号:*学生姓名:*教师姓名:*_2010_年_11_月_14_日组别_同组同学_实验日期_年_月_日 实验室名称_成绩_一、实验名称:双向移位寄存器二、实验目的与要求:实验目的:设计一个双向移位寄存器,理解移位寄存器的工作原理,掌握串入并出端口控制的描述方法。实验要求:通过VHDL编程,实现双向移位寄存器,要求有1个方向控制端、1个时钟脉冲输入、1个异步清零端、1个数据输入端以及8位的并行数据输出端,具体接口说明如下图所示。 首先在QuartusII上进行功能和时序仿真,之后通过器件及其端口配置下载程序到SOPC开发平台中。在硬件实现中,要求: 1. 用实验平台的按键实现时钟控制(clk)、方向控制(dir)、清零(clr)以及数据输入(din):端口名 按键名 功能 clk 键7 时钟控制 din 键8 数据输入 clr 键1 异步清零 dir 键5 方向控制 clk:移位寄存器时钟脉冲输入,上升沿有效; din:串行数据输入端; clr:异步清零信号,高电平有效; dir:方向控制端,要求低电平左移,高电平右移; dout7.0:8位数据并行输出端;2. 用实验平台的LED发光阵列的LED1LED8显示并行数据的输出。三、实验内容:u 新建工程:1、打开Quartus,新建工程,选择好路径,工程顶层名为d_reg ;2、新建工程,如果包含已编好的文件则可以添加,如果无则可以略过 ;3、选择我们的器件信息:型号为:EP2C36F484C84、单击Next>,指定第三方工具,这里我们不指定第三方EDA工具,单击Next>后结束工程建立。u 建立编译VHDL文件:1单击FileNew菜单项,选择弹出窗口中的VHDL File项,单击OK按钮以建立打开空的VHDL文件,并以工程顶层文件名保存。2、输入源代码完后单击ProcessingStart Compilation开始编译,并修改其中的错误直到没有为止。的错误直到没有为止。u 建立矢量波形文件1、单击FileNew命令,选择其中的Vector Waveform File项,点击OK建立空的波形文件,打开矢量波形文件编辑窗口;2双击窗口左边空白区域,打开Insert Node or Bus对话框;1、 单击Node Finder按钮,打开以下对话框,选择Filter下拉列表中的Pins:all,并点击List按酒以列出所有的端口,通过>>按钮把这些端口加入到右面的窗口中,单击OK完成端口的添加;2、 回到波形编辑窗口,对所有输入端口设置输入波形,具体可以通过左边的工具栏,或通过对信号单击鼠标右键的弹出式菜单中完成操作,最后保存次波形文件。u 进行仿真:1、单击AssignmentsSettings ,Simulation mode设置为Functional,即功能仿真。指定仿真波形文件后单击OK完成设置;2、单击ProcessingGenerate Functional Simulation Netlist以获得功能仿真网络表;3、单击ProcessingStart Simulation完成功能仿真。4、如果功能仿真无误后进行时序仿真:单击AssignmentsSettings,在弹出对话框中Simulation mode设置为Timing,即时序仿真。指定仿真波形文件后单击OK完成设置。5、单击ProcessingStart Simulation,完成时序仿真。6、 如果时序仿真也没错即可下载工作了。四、实验条件:1. WindowsXP操作系统2. QuartusII EDA开发系统3. 杭州康芯SOPC硬件开发平台五、实验原理:本实验依然带有异步清零功能,所以用if实现优先级最高,当clr为高电平时异步清零,当clr为低电平时实现移位功能;此时利用if的嵌套功能,用dir端控制移位的方向,当dir为低电平时左移,高电平时右移。关于移位可以运用&级联这个运算符,这样程序可以显得简洁,就不用其他像循环之类的方法了。开始实现清零功能clr=1?非循环右移dir=0?非循环左移六、源代码:library ieee;use ieee.std_logic_1164.all;entity d_reg isport(clk,din,clr,dir:in std_logic;dout:buffer std_logic_vector(7 downto 0);end entity;architecture wen of d_reg isbegin process(clk,din,clr,dir)begin if(clr=1)thendout<="00000000"elsif(clkevent and clk=1)thenif(dir=0)thendout<=dout(6 downto 0)&din;elsedout<=din&dout(7 downto 1);end if;end if;end process;end architecture;七、实验结果与分析:1、功能仿真:2、时序仿真: 仿真结果显示,当dir 为0时,数据串行左移,dir为1时数据串行右移,clr为0时数据移位,为1时,清零置位。3、下载后实物操作:a:输入端为1,左移状态,串行输入; b:输入为1,右移状态,串行输入; C:按下复位键后全部清零。八、讨论和回答问题及体会:1、实验的过程步骤还是一如既往,从建立工程到仿真到下载后实物的仿真,现在已经感觉比较熟练了,包括以前根本不知道的功能仿真,以前没有生成功能仿真列表,所以老是不成功;2、感觉试验中练习的最多的就是if语句了,相反的其他的语句练习的比较少;3、相比之下,这个程序应该是比较简单的,所以作起来也不算太难,在这种情况下,就显得自己纠错的能力比较弱了,本来程序书写完后都会在浏览一遍的,但很少能看出错误,很少能一遍成功,在这方面我感到亟待提高。