FPGA入门实例一:LFSR

一:任务:

要求使用Verilog语言在Xilinx Virtex-6开发板上实现线性反馈移位寄存器(LFSR)的硬件逻辑设计。

二:前期准备:

基本上完成一个简单的设计需要用到以下几个软件

逻辑:Uedit32(硬件狗吐血推荐)

综合:ISE14.1

仿真:Modelsim SE 10.1b

分析:Chipscope Pro

三:设计流程

逻辑:

首先当然是RTL级设计,俗称硬件逻辑设计。使用的是Uedit32,这个软件相当于一个记事本,但编辑功能十分强大,简直是写Verilog代码的神器,具体下载安装,使用技巧详见(http://blog.163.com/bubble_fish/blog/static/23724712920146180178713/)。 见识了Uedit32的方便快捷后,在写代码之前,小编给大家说几个注意事项。工作过的朋友肯定知道,公司里是很强调代码书写规范的,特别是对于大的设计。如果不按规范做,一个月后调试发现错误,回头再看自己写的代码,估计很多信号都忘了,更不要说检错了;如果一个项目做了一半离职了,接班的人估计得从头开始设计;如果在原版本基础上增加新功能,很可能也要从头来过,很难做到设计的可重用性。这里有一份组长在我第一天实习时就给我的Verilog书写规范,分享给大家,真心希望跟我一样的小白在写代码之前仔细阅读(http://blog.163.com/bubble_fish/blog/static/237247129201461692652979/)。了解书写规范后,我们对任务进行分析。线性反馈移位寄存器(LFSR)的工作原理及应用详见博文(http://blog.sina.com.cn/s/blog_62d9edac01015lsd.html)。以下是Verilog源码:

 1 module    LFSR
 2 (
 3 input                         usr_clk, //时钟
 4 input                         rst,  //复位
 5 output reg [2:0]              dout  //data_out
 6 );
 7
 8 parameter    INIT = 3‘h1; //初始值
 9 parameter    COFF = 3‘h4; //生成多项式
10
11 reg [2:0]  dout_next;
12 always @ (posedge usr_clk or posedge rst)
13     if(rst)       dout <=  INIT;
14     else          dout <=  dout_next;
15
16 integer i;
17 always@(*)
18 begin
19 dout_next[0] <= dout[2];
20 for(i=1; i<3; i=i+1)
21     if(COFF[3-i])        dout_next[i] <= dout[i-1]^dout[2];
22     else                 dout_next[i] <= dout[i-1];
23 end
24
25 endmodule     

综合:

对于xilinx的开发板,使用ISE做为综合工具。软件的使用方法不作介绍,网上一搜一大把。这里只给大家留一个附件,包含全部工程文件和.ucf用户约束(http://download.csdn.net/download/yuzeren48/7644573)。

图1:综合界面

根据LFSR工作原理加上自己定义的参数COFF(3’b100),可知整个LFSR是由一个异或门和三个触发器构成,我们点开Synthesize-XST下的View RTL Schematic,即可看到由代码生成的门级电路,与预期一致。

图2:RTL Schematic

仿真:

ISE是自带仿真软件Isim的,但实际使用效果不是很好。所以我们采用更专业的modelsim来做仿真。Modelsim的具体安装、配置说明详见(请自行百度,如有问题请留言小编)。配置好modelsim后,我们需要写一个testbench来对我们刚才的设计做验证,testbench的作用其实就是给原设计添加各种输入激励信号,然后观察输出信号的波形。具体怎么写testbench请自行百度《编写高效率的testbench》。这里给出本设计的testbench源码

 1 `timescale 1 ns / 1 ns
 2
 3 module lfsr_tb;
 4
 5 reg                     rst;
 6 reg                     usr_clk;
 7 wire [2 : 0]            dout    ;
 8
 9 LFSR  UUT (
10         .rst        (rst),
11         .usr_clk    (usr_clk),
12         .dout       (dout)
13         );
14
15 always #20     usr_clk = ~usr_clk;
16
17 initial begin
18         $display("lfsr_tb start...");
19         rst = 1;
20         usr_clk = 0;
21         #100;
22         rst = 0;
23         #10000;
24         $stop;
25         end
26
27 endmodule

下面小编给大家简单写一下modelsim的仿真步骤。

1、  新建一个Sim文件夹,将需要用到的源文件文件,testbench文件(.h .v)放进去

2、  打开modelsim,File-New-Project

3、  把目录指定为刚才建好的文件夹,添加.v文件到Project中

4、  对Project中的.v文件右键,选择Compile-Compile All

5、  选择Library标签,找到work,点击+展开

6、  对已经编译好的.v文件右键,选择simulate without optimization

7、  此时会弹出Sim标签栏,对要仿真的文件右键,选择Add wave

8、  设定仿真时间,例如1000ns

9、  点击工具栏按钮Run

图3展示LFSR仿真结果

图3: LFSR仿真波形

分析:

分析用到的软件主要是Chipscope pro,Chipscope的使用方法详见(百度文库搜索“ChipScope Pro实例教程”)。它跟modelsim的主要区别在于这是真正的板级调试。我们需要根据不同的开发板编写用户约束文件(.ucf),经过ISE综合,布局布线后生成bit文件写入FPGA。ChipScope Pro 的主要功能是通过JTAG 口、在线实时地读出FPGA 的内部信号。这里就有一个问题产生:为什么要用ChipScope来观察信号?我们把输入信号直接连上LED,观察LED的亮灭不就知道信号是怎么跳变的吗?小编就用我们刚编写的实例来简单解释一下这个问题:我们开发板使用的时钟信号是33MHz,dout在每个时钟上升沿都会发生一次跳变,一秒钟会发生33000000次跳变,这种高速跳变肉眼无法分辨,所以根本无法通过LED的亮灭来观测dout变化。图4左上角即为LED显示的dout变化。

图4 板级调试

针对本次设计任务,尽可能多的说明chipscope的用途。决定同时使用ICON核、ILA核、VIO核来分析输入输出信号。具体的操作步骤详见博文(http://blog.163.com/bubble_fish/blog/static/237247129201461682452592/)。图5为检测到的数据波形。

图5 chipscope抓包截图

FPGA入门实例一:LFSR,布布扣,bubuko.com

时间: 2024-10-05 04:01:19

FPGA入门实例一:LFSR的相关文章

DWR之入门实例(一)

DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它的最新版本DWR0.6添加许多特性如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用spring bean),更好浏览器支持,还支持一个可选的commons-

React 入门实例教程

React 入门实例教程 作者: 阮一峰 日期: 2015年3月31日 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西很好用,就在2013年5月开源了. 由于 React 的

Java AIO 入门实例(转)

Java7 AIO入门实例,首先是服务端实现: 服务端代码 SimpleServer: Java代码   public class SimpleServer { public SimpleServer(int port) throws IOException { final AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(por

php页面get方法实现ajax,入门实例教程

ajax,入门实例教程 本例针对php页面,做了一个小的demo加深对ajax的理解 1.文档结构: 共有ajax.php 和action.php 2个页面. 2.源码如下: /*ajax.php页面*/<!DOCTYPE html> <html lang="en"> <head> <title> ajax</title> <script type="text/javascript"> func

Omnet++ 4.0 入门实例教程

http://blog.sina.com.cn/s/blog_8a2bb17d01018npf.html 在网上找到的一个讲解omnet++的实例, 是4.0下面实现的. 我在4.2上试了试,可以用.照着做就能完成,有些小地方不同而已 Omnet++ 4.0 入门实例教程根据http://omnest.com/webdemo/ide 上的实例,自己动手做了做.新版本的4.0 跟它视频上的版本有些差别,配图说明一下我的操作过程,供大家一起学习.现在开始.首先,开发环境选择simulation 的视

FPGA入门1

FPGA入门知识介绍 近几年来,由于现场可编程门阵列(FPGA)的使用非常灵活,又可以无限次的编程,已受到越来越多的电子编程者的喜爱,很多朋友都想学习一些FPGA入门知识准备进行这个行业,现在关于FPGA入门知识的书籍.论坛.教程等种类繁多各式各样.下面笔者也通过搜寻一些关于FPGA入门知识的资料供大家学习和参考. FPGA入门知识首先要从FPGA的定义开始,什么是FPGA呢,有什么作用这些都是基本需要了解的东西.FPGA是可编程器件,目前以硬件描述语言(Verilog 或 VHDL)所完成的电

freemarker入门实例与源码研究准备工作

首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的是:freemarker的ftl文件解析使用javacc实现的,所以源码中没有解析类(FMParse.java).要想研究freemarker源码,往往还需要引入freemarker.jar(含有FMParse.class),否则源码会出现编译问题.另外,还需要引入的jar包有:commons-lo

Android HttpGet() 请求简单入门实例

HttpClient httpclient = new DefaultHttpClient(); String url = "http://example.com"; List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add( new BasicNameValuePair( "param", "value" ) ); URI uri =

php读取sqlite数据库入门实例

php读取sqlite数据库的例子,php编程中操作sqlite入门实例.原文参考:http://www.jbxue.com/article/php/22383.html在使用SQLite前,要确保php.ini中已经启用sqlite和pdo配置 打开PHP.INI文件,打下以下扩展:extension=php_pdo.dll extension=php_pdo_sqlite.dllextension=php_sqlite.dllsqlite_open命令是打开一个数据库文件. 如果没有文件则创