实例七 8位移位寄存器的设计(基于Robei工具的8位移位寄存器的设计)

4.1.1. 本章导读

设计目的
要求掌握8位移位寄存器原理,并根据原理设计8位移位寄存器模块以及设计相关testbench,最后在Robei可视化仿真软件进行功能实现和仿真验证。
设计准备
有一个8比特的数据(初值设为10011100)和一个移位设置数据s,根据s的值不同,产生不同的移位。这里规定移位的方向是向右,由于是8比特,因此s的变化范围为0到7。

4.1.2. 设计流程

1. shift模型设计

(1)新建一个模型命名为shift,类型为module,同时具备5个输入和1个输出,每个引脚的属性和名称参照图4-1-1进行对应的修改。


(2)添加代码。点击模型下方的 Code添加代码。
代码:
always@(posedge clk or negedge clr)
begin: shift_reg
if(clr)
data_out <= 8’b0;
else if(en)
begin
case(set[2:0])
3’b0: data_out <= data_in[7:0];
3’b1: data_out <= {data_in[0],data_in[7:1]};
3’d2: data_out <= {data_in[1:0],data_in[7:2]};
3’d3: data_out <= {data_in[2:0],data_in[7:3]};
3’d4: data_out <= {data_in[3:0],data_in[7:4]};
3’d5: data_out <= {data_in[4:0],data_in[7:5]};
3’d6: data_out <= {data_in[5:0],data_in[7:6]};
3’d7: data_out <= {data_in[6:0],data_in[7]};
default: data_out <= data_in[7:0];
endcase
end
end

(3)保存模型到一个文件夹(文件夹路径不能有空格和中文)中,运行并检查有无错误输出。

2. shift_test测试文件设计

(1)新建一个具有5个输入和1个 输出的shift_test测试文件,记得将Module Type设置为“testbench”,各个引脚配置如图4-1-3所示。

(2)另存为测试文件。将测试文件保存到上面创建的模型所在的文件夹下。
(3)加入模型。在 Toolbox工具箱的 Current栏里会出现模型,单击该模型并在shift _test上添加,并连接引脚,如下图4-1-4所示:

(4)输入激励。点击测试模块下方的“Code”,输入激励算法。激励代码在结束的时候要用$finish 结束。
测试代码:
initial begin
clock=0;
clr=0;
en=1;
data=8’b10011100;
set=0;
#1 clr=1;
#2 clr=0;
#40 $finish;
end

always #1 clock=~clock;
always #2 set=set+1;

(5)执行仿真并查看波形。查看输出信息。
检查没有错误之后查看波形。点击右侧 Workspace 中的信号,进行添加并查看分析仿真结果。如图4-1-5所示:

3. shift_constrain测试文件的设计

(1)新建一个模块,命名为shift_constrain,模块类型选择为constrain,具有14个输入和8个输出,如图4-1-6所示。

(2)修改端口名称并进行连线。其中,shift模块的输入data_in和输出data_out分别对应8个端口,输入set对应3个端口。本设计中,各个端口对应的开发板引脚如下所示:
clk对应开发板按键开关R18;
clr对应开发板按键开关P16;
en对应开发板拨码开关T16;
set[0],set[1],set[2]对应G15,P15,W13;
data_in[0]——data_in[7]分别对应V12,W16,J15,H15,V13,U17,T17,Y17;
data_out[0]——data_out[7]分别对应T14,T15,P14,R14,U14,U15,V17,V18;
输入data_in对应的连线名称需要改成0——7,set的连线名称则要改成0,1,2。修改后的约束模块如图4-1-7所示。

(3)保存并执行,如果软件显示“Generate constrain file complete”,说明约束文件已经成功生成。

4.1.3. 板级验证

为了测试所设计shift的工作特性,选择开发板搭载XILINX公司的Z-7010芯片,选用VIVADO设计平台进行Synthesis、Implementation和Generate Bitstream,最终将生成的数据流文件下载到开发板内,并进行验证。

1. VIVADO设计平台进行后端设计

1.1启动Vivado软件并选择设备XC7Z010CLG400-1(ZYBO)作为硬件对象,设计语言选用Verilog,建立新的工程,添加通过Robei设计的文件shift.v。
(1)打开Vivado,选择开始>所有程序>Xilinx Design Tools> Vivado2013.4> Vivado2013.4;
(2)单击创建新项目Create New Project启动向导。你将看到创建一个新的Vivado项目对话框,单击Next;
(3)在弹出的对话框中输入工程名shift及工程保存的位置,并确保Create project subdirectory复选框被选中,单击Next;

(4)选择项目类型表单的RTL Project选项,不勾选Do not specify sources at this time复选框,然后单击Next;
(5)使用下拉按钮,选中Verilog作为目标文件和仿真语言;
(6)点击添加Add Files按钮,浏览到刚刚我们Robei项目的目录下打开Verilog文件夹,选择shift.v,单击Open,然后单击Next去添加现有的IP模型;
(7)由于我们没有任何的IP添加,跳过这一步,直接单击Next去添加约束形成;
(8)点击添加Add Files按钮,浏览到刚刚建立约束模块目录下的constrain文件夹,选择shift_constrain.xdc,单击Open进行添加,然后单击Next;
(9)在默认窗口中,按照图4-1-12所示,设置Filer中的选项,然后在Parts中选择对应的XC7Z010CLG400-1,单击Next;
(10)单击Finish,本Vivado项目创建成功。


1.2打开shift_constrain.xdc文件,查看引脚约束源代码。
(1)在资源窗口sources中,展开约束文件夹,如下图4-1-13所示,然后双击即可打开uart_led_pins.xdc进入文本编辑模式;

(2)Xilinx设计约束文件分配FPGA位于主板上的开关和指示灯的物理IO地址,这些信息可以通过主板的原理图或电路板的用户手册来获得。
本次设计的约束文件代码是通过Robei软件自动生成,但是,Robei软件目前生成的约束代码只有对输入输出端口的分配,在这个设计中,我们使用了一个通过开关控制的模拟时钟clk,而非系统时钟,这种电路在综合的时候一般都会报错,所以,在约束文件最后,我们需要手动添加一句命令:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]
来保证流程中不会出错。
完整的约束代码如下:
#This file is generated by Robei!
#Pin Assignment for Xilinx FPGA with Software Vivado.
set_property PACKAGE_PIN R18 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN P16 [get_ports clr]
set_property IOSTANDARD LVCMOS33 [get_ports clr]
set_property PACKAGE_PIN T16 [get_ports en]
set_property IOSTANDARD LVCMOS33 [get_ports en]
set_property PACKAGE_PIN V12 [get_ports data_in[0]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[0]]
set_property PACKAGE_PIN W16 [get_ports data_in[1]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[1]]
set_property PACKAGE_PIN J15 [get_ports data_in[2]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[2]]
set_property PACKAGE_PIN H15 [get_ports data_in[3]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[3]]
set_property PACKAGE_PIN V13 [get_ports data_in[4]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[4]]
set_property PACKAGE_PIN U17 [get_ports data_in[5]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[5]]
set_property PACKAGE_PIN T17 [get_ports data_in[6]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[6]]
set_property PACKAGE_PIN Y17 [get_ports data_in[7]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[7]]
set_property PACKAGE_PIN G15 [get_ports set[0]]
set_property IOSTANDARD LVCMOS33 [get_ports set[0]]
set_property PACKAGE_PIN P15 [get_ports set[1]]
set_property IOSTANDARD LVCMOS33 [get_ports set[1]]
set_property PACKAGE_PIN W13 [get_ports set[2]]
set_property IOSTANDARD LVCMOS33 [get_ports set[2]]
set_property PACKAGE_PIN T14 [get_ports data_out[0]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[0]]
set_property PACKAGE_PIN T15 [get_ports data_out[1]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[1]]
set_property PACKAGE_PIN P14 [get_ports data_out[2]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[2]]
set_property PACKAGE_PIN R14 [get_ports data_out[3]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[3]]
set_property PACKAGE_PIN U14 [get_ports data_out[4]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[4]]
set_property PACKAGE_PIN U15 [get_ports data_out[5]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[5]]
set_property PACKAGE_PIN V17 [get_ports data_out[6]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[6]]
set_property PACKAGE_PIN V18 [get_ports data_out[7]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[7]]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]

(3)点击File—>Save File保存文件。

** 1.3使用Vivado综合工具来综合设计,并进行Implementation任务实现。**

(1)单击综合任务下拉菜单中的Run Synthesis,综合过程将分析shift.v文件并生成网表文件。当综合过程完成了,且没有错误信息,将会弹出带有三个选项的完成对话框;
(2)如果有错误,根据错误信息提示进行修改,直至综合没有错误成功完成。然后选择Run Implementation选项,执行任务实现,然后单击OK;
(3)任务实现过程将在综合后的设计上运行。当这个过程完成,且没有错误信息,将会弹出带有三个选项的任务实现完成对话框;
(4)如果有错误,根据错误信息提示修改,直至综合没有错误。

** 1.4将开发板上的电源开关拨到ON,生成比特流并打开硬件会话,对FPGA进行编程。**

(1)确保微型USB电缆连接到PROG UART接口;
(2)确保JP7设置为USB提供电源;
(3)接通电源板上的开关;
(4)点击任务实现完成弹出的对话框中Generate Bitstream或者点击导航窗口中编程和调试任务中的Generate Bitstream。当完成比特流生成后会弹出有三个选项的完成对话框;
(5)这一过程将已经生成的shift.bit文件放在shift.runs目录下的impl_1目录下;
(6)选择打开硬件管理器Open Hardware Manager选项,然后单击确定。硬件管理器窗口将打开并显示“未连接”状态;
(7)点击Open a new hardware target。如果之前已经配置过开发板你也可以点击最近打开目标链接Open recent target;


(8)单击Next看Vivado自定义搜索引擎服务器名称的形式;
(9)单击Next以选择本地主机端口;
(10)单击两次Next,然后单击Finish。未连接硬件会话状态更改为服务器名称并且器件被高亮显示。还要注意,该状态表明它还没有被编程;

(11)选择器件,并验证shift.bit被选为常规选项卡中的程序文件;

(12)在器件上单击鼠标右键,选择Program device或单击窗口上方弹出的Program device-> XC7z010_1链接到目标FPGA器件进行编程,如图4-1-20所示;

(13)单击确定对FPGA进行编程。开发板上Done指示灯亮时,器件编程结束;
(14)通过控制拨动和按键开关的开闭来观察LED(请参考前面的逻辑图)验证输出结果。

2. 开发板验证

首先,按住clr(BTN1)不放,按1到2次clk(BTN0),进行复位操作。
然后,将en(SW3)设置为高电平,设置输入数据data_in[0~7] (Sw[07])和位移控制信号set[03] (SW0~1),这里选择输入数据为00110111,位移控制信号分别为000,010,100,111进行验证;
最后,每更改一次位移控制信号,按一下clk时间键,然后观察输出数据data_out[0~7] (Led[0~7]),验证移位寄存器功能是否正确。
set = 000时,data_out 应为 00110111;set = 010时,data_out应为11001101;
set = 100时,data_out应为01110011;set = 111时,data_out应为01101110;

通过验证结果证明该8位移位寄存器符合设计的要求。

4.1.4. 问题与思考

1.如何在一个模块上面设计一个移位寄存器,该移位寄存器既有右移功能,还有左移、双向移动的功能,这些功能通过一个值的变化来切换?

2.如何实现扭环形移位寄存器?

实例七— 8位移位寄存器的设计相关推荐

  1. 解读 8 位移位寄存器的设计

    8 位移位寄存器的设计 先了解下 8 位移位寄存器的设计的原理,先从基础开始:要求掌握 8 位移位寄存器原理,并根据原理设计 8 位移位寄存器模块以及设计相关testbench,最后在 Robei 可 ...

  2. 4-1 Verilog 4位移位寄存器的设计与实现

    使用工具:Xilinx ISE 14.7 移位寄存器,不但可以寄存数码,还可以在脉冲信号的作用下,寄存数码可以根据需求发生偏移.在本次设计中使用分频信号来充当脉冲信号,控制在人眼可视范围内(始终频率低 ...

  3. Verilog 编程实验(6)-4位移位寄存器的设计与实现

    原理图: Implementation part: module ShiftRegister(q3,data_in,clk,clr);output[3:0] q3; input[3:0] data_i ...

  4. 一位全加器 VHDL设计与实现

    作者:chenjieb520 一.设计目的 熟悉Quartus II的VHDL文本设计流程全过程,学习组合电路的设计,仿真和测试. 二.设计内容 设计一位全加器,给出程序的设计.软件编译.仿真分析.硬 ...

  5. HDLBITS笔记29:移位寄存器(包括4位移位寄存器,创建100位左/右旋转器,算术偏移,线性反馈移位寄存器等)

    题目1:4位移位寄存器(4-bit shift register) 构建一个具有异步复位.同步加载和使能功能的 4 位移位寄存器(右移位). reset:将移位寄存器重置为零. load: 加载数据[ ...

  6. 实验三 触发器、移位寄存器的设计和应用

    五.实验步骤与实验结果 1.用Verilog VHDL设计D触发器.打开QuarterII新建一个基于ALTERA的Cyclone系列FPGA芯片EP1C3T144C8N的项目保存在D:\dianlu ...

  7. VHDL D触发器 4位移位寄存器 例化+仿真(功能时序)

    二.操作步骤 1.设计一个D触发器 library ieee; use ieee.std_logic_1164.all;entity dff1 isport(clk,d:in std_logic;q: ...

  8. 51单片机七人多数表决器仿真设计( proteus仿真+程序+报告+讲解视频)

    51单片机七人多数表决器仿真设计( proteus仿真+程序+报告+讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0033 51 ...

  9. web前端期末大作业 html+css+javascript 酒庄网页设计实例(5个页面)~学生网页设计制作...

    web前端期末大作业 html+css+javascript 酒庄网页设计实例(5个页面)~学生网页设计制作 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从 ...

最新文章

  1. ActiveMQ学习笔记(8)——导入ActiveMQ源码到Eclipse
  2. 2008秋-计算机软件基础-第四章习题参考答案 P131 ,习题6之一
  3. B/S系统常见缺陷整理和解决方案
  4. div搜索框与按钮不在一行_前阿里巴巴运营专家:搜索框的5大运营玩法
  5. stl set求交集 并集 差集
  6. .NET Core 3.0 可卸载程序集原理简析
  7. 美将遣返庇护申请者至墨西哥 弱势人士有望豁免
  8. mac 二进制安装mysql_在mac下安装mysql二进制分发版的方法(不是dmg的)
  9. 7-30 字符串的冒泡排序 (20 分) or 7-27 冒泡法排序 (20 分)
  10. 关于数字化学习的理论与实践
  11. 【原创】全文搜索引擎技术原理入门
  12. 数据库索引的分类,类型,索引的优缺点,索引的优化
  13. 2021“设计+”珠宝首饰创新设计展开幕
  14. python实现爬虫探探_全栈 - 9 实战 爬取豆瓣电影数据
  15. 前端面试官常问javaScript编程题,隔壁王大爷看了都会了
  16. 【散文】 如果今生我是你梦中的蝴蝶
  17. 【电信学】【2019.03】5G异构网络中的移动性管理
  18. 源代码世界3—海上高墙
  19. 【FPGA】SCCB通信协议
  20. 利用场景法设计atm自动取款机的测试用例_atm自动取款机的测试用例

热门文章

  1. 谁拉大了中国制造的贫富差距?
  2. 流媒体弱网优化之路(FEC+mediasoup)——FEC引入的问题收尾
  3. 502 Bad Gateway 常见解决思路
  4. vrml java_java如何在vrml里弹出窗口
  5. 关于CC2538 zigbee芯片刷成砖的解决方法
  6. 【Scheme】Scheme 编程学习(一) —— 概述
  7. CNN卷积中卷积层,卷积核,通道概念及卷积过程详解
  8. php运行报错时继续运行,php的异常和处理
  9. 防火墙设置与配置开放端口
  10. 自然语言处理(四): Part of Speech Tagging