设计一个4位移位寄存器

倩倩 发表于 2017-12-22 10:24:29 收藏 已收藏
赞(0) •  评论(0

设计一个4位移位寄存器

倩倩 发表于 2017-12-22 10:24:29 收藏

  4位移位寄存器的设计与实现

  使用ISE软件设计并仿真,使用ISE软件进行4位移位寄存器的设计与实现。

  步骤

  1. 编写文本文件并编译

  2. 软件仿真

  3. 进行硬件配置

  原理

  1. ISE软件是一个支持数字系统设计的开发平台。

  2. 用ISE软件进行设计开发时基于相应器件型号的。

  注意:软件设计时选择 的器件型号是与实际下载板上的器件型号相同。  

        3. 图6-1所示为4位

设计一个4位移位寄存器

  (1) 新建工程

  双击桌面上“ISE Design Suite 14.7”图标,启动ISE软件(也可从开始菜单启动)。每次打开ISE都会默认恢复到最近使用过的工程界面。当第一次使用时,由于还没有历史工程记录,所以工程管理区显示空白。选择File New--Project选项,在弹出的对话框中输入工程名称并指定工程路径。

  点击Next按钮进入下一页,选择所使用的芯片及综合、仿真工具。计算机上安装的所有用于仿真和综合的第三方EDA工具都可以在下拉菜单中找到。在图中我们选用了Spartan6 XC6SLX16芯片,采用CSG324封装,这是NEXYS3开发板所用的芯片。另外,我们选择Verilog作为默认的硬件描述语言。

  再点击Next按钮进入下一页,这里显示了新建工程的信息,确认无误后,点击Finish就可以建立一个完整的工程了。

  (2) 设计输入和代码仿真

  在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择New Source命令,选择Verilog Module输入,并输入Verilog文件名。

  单击Next按钮进入端口定义对话框。其中Module Name栏用于输入模块名,这里是shiftreg,下面的列表框用于端口的定义。Port Name表示端口名称,Direction表示端口方向(可选择为input、output或inout),MSB表示信号最高位,LSB表示信号最低位,对于单信号的MSB和LSB不用填写。当然,端口定义这一步

  我们也可以略过,在源程序中再行添加。

  定义了模块的端口后,单击Next进入下一步,点击Finish完成创建。这样,ISE就会自动创建一个Verilog模块的模板,并且在源代码编辑区打开。简单的注释、模块和端口定义已经自动生成,接下来的工作就是将代码编写完整。

  输入代码后,我们还需要对模块进行测试。在工程管理区将view设置为Simulation,在任意位置单击鼠标右键,并在弹出的菜单中选择New Source,在类型中选择Verilog Test Fixture,输入测试文件名,单击下一步。这时所有工程中的模块名都会显示出来,我们选择要进行测试的模块。点击Next ,再单击Finish按钮,ISE会在源代码编辑区自动生成测试模块的代码。我们看到,ISE已经自动生成了基本的信号并对被测模块做了例化。我们的工作就是在initial„end块中的“//Add stimulus here”后面添加测试向量。

  完成测试文件编辑后,确认工程管理区中view选项设置为Simulation,这时在过程管理区会显示与仿真有关的进程。右键单击其中的Simulate Behavioral Model项,选择弹出菜单中的Process Properties项,会弹出属性设置对话框,其中Simulation Run Time就是仿真时间的设置,可将其修改为任意时长。

  仿真参数设置完后,就可以进行仿真。首先在工程管理区选中测试代码,然后在过程管理区双击Simulate Behavioral Model,ISE将启动ISE Simulator,可以得到仿真结果,如图6-2所示。

 设计一个4位移位寄存器

  (3) 综合与实现

  在工程管理区的view中选择Implementation,然后在过程管理区双击Synthesize-XST,就可以开始综合过程。

  另外,要实现设计,还需要为模块中的输入输出信号添加管脚约束,这就需要在工程中添加UCF文件。在工程管理区单击鼠标右键,点击New Source,选择Implementation- Constraints File,出现一个空白的约束文件,我们就可以为设计添加各种约束。如果综合步骤没有语法错误,XST能够给出初步的资源消耗情况,点击Design Summary,即可查看。

  在过程管理区双击Implementation Design选项,就可以自动完成实现步骤。如果设计没有经过综合,就会启动XST完成综合,在综合后完成实现过程。经过实现后能够得到精确的资源占用情况。在Design Summary即可看到具体的资源占用情况。

  (4) 器件配置

  硬件配置是FPGA开发最关键的一步,只有将HDL代码下载到FPGA芯片中,才能进行调试并最终实现相应的功能。首先我们必须生成能下载到硬件中的二进制比特文件。双击过程管理区的Generate Programming File,ISE就会为设计生成相应的二进制比特文件。

  然后利用USB-MiniUSB缆线,来为开发板提供电源和数据下载。我们只需上网下载免费的Digilent Adept软件,即可快速实现Nexys3开发板上FPGA的配置。用USB-MiniUSB缆线连接开发板和PC,打开开发板的电源开关,然后启动Digilent Adept软件。系统开始自动连接FPGA设备,成功检测到设备后,会显示出JTAG链上所用芯片。

  界面上将显示检测到NEXYS3开发板上的器件FPGA(XC6SLX16)。这里我们对FPGA进行配置。在Browse中找到之前生成的设计的二进制比特文件,并点击旁边的Program按钮,软件就开始对FPGA进行配置。配置成功后,下面的状态栏会显示Programming Successful。至此,器件配置成功,我们就可以在器件上验证预期的设计有没有很好的得以实现。

       移位寄存器代码

  移位寄存器,不但可以寄存数码,还可以在脉冲信号的作用下,寄存数码可以根据需求发生偏移。在本次设计中使用分频信号来充当脉冲信号,控制在人眼可视范围内(始终频率低于10Hz)寄存自动发生发生偏移,代码如下:

  module Design_Code(

  《span style=“white-space:pre”》 《/span》input clk,《span style=“white-space:pre”》 《/span》//input by “V10”

  《span style=“white-space:pre”》 《/span》input clr,

  《span style=“white-space:pre”》 《/span》input data,

  《span style=“white-space:pre”》 《/span》output reg [3:0] out

  );

  《span style=“white-space:pre”》 《/span》

  reg [26:0] c;

  assign mclk = c[5];《span style=“white-space:pre”》 《/span》// The Data of Simulation《span style=“white-space:pre”》 《/span》

  //assign mclk = c[26];《span style=“white-space:pre”》 《/span》//Easy for person to distinguish

  always @ (posedge clk)

  《span style=“white-space:pre”》 《/span》begin

  《span style=“white-space:pre”》 《/span》//c《= c + 1;

  《span style=“white-space:pre”》 《/span》if(clr)

  《span style=“white-space:pre”》 《/span》c《=0;

  《span style=“white-space:pre”》 《/span》else

  《span style=“white-space:pre”》 《/span》c 《= c+1‘b1;

  《span style=“white-space:pre”》 《/span》end

  always @ (posedge mclk or posedge clr)

  《span style=“white-space:pre”》 《/span》begin

  《span style=“white-space:pre”》 《/span》if(clr)

  《span style=“white-space:pre”》 《/span》out 《= 4’b0;

  《span style=“white-space:pre”》 《/span》else

  《span style=“white-space:pre”》 《/span》out 《= {data, out[3:1]};

  《span style=“white-space:pre”》 《/span》end

  endmodule

  在本次设计中使用到了非阻塞赋值“《=”。它与阻塞赋值“=”是有区别的。

  阻塞赋值:算式y=b,一旦执行当前的赋值语句,赋值目标变量y几颗获得等号右边表达式的计算值。在这里值得注意的是,如果一块语句中含有多条阻塞赋值语句,那么当执行某一条语句时其他语句被阻塞,将禁止执行。阻塞赋值的执行有点像串行执行。

  非阻塞赋值:算式y《=b,必须在语句块结束时完成整体赋值。在执行某一条语句时,对于语句块的其他赋值算式不进行限制,换句话说,语句块中的非阻塞赋值算式是并行执行的。

  注意:由于assign不能引导语句块,故只能使用阻塞赋值。

  注意:阻塞赋值与非阻塞赋值不可以混合使用。

  测试文件:

  initial begin

  // Initialize Inputs

  data = 1;

  clr = 1;

  clk = 0;

  end

  always

  begin

  #1

  clk = ~clk;

  end

  always

  begin

  #100000

  clr = ~clr;

  end

  always

  begin

  #500

  data = ~data;

  end

  注意:在写仿真部分时always与initial不能相互嵌套。使用复位信号(例如:clr)时,x先使能复位信号,一段时间后取消复位信号(避免系统一直处于复位状态)

  仿真结果:

 设计一个4位移位寄存器

  在这里可能需要仿真的时间比较长,可以通过调节仿真器的属性更改仿真时间,操作如下

  设计一个4位移位寄存器

文章来源栏目
存储技术
+关注

评论(0)

加载更多评论

参与评论

热门推荐

分享到

QQ空间 QQ好友 微博
取消