当前位置:首页 > 新闻资讯 > FPGA之家动态 >

干货连载 | Basys3 FPGA个人学习笔记连载分享(二)

时间:2024-08-08      来源:网络搜集 关于我们 0

来源 | DIGILENT中文技术社区

作者:zoudesuo

系列连载:

第一篇:Vivado创建工程和编写源代码

第二篇:Vivado与Modelsim关联和功能仿真

第三篇:在Vivado实现LED循环以及参数化设计

实验内容:设计一个周期为1s的4个LED循环点亮最简单的实验,主要目的在于熟悉在vivado环境下在basys3设计实现的流程,其中包括项目的创建、综合、功能仿真、约束添加、实现、生成编译文(bit),下载bit文件到basys3实现功能;以及对参数化设计。

实验平台:Xilinx大学计划与Digilent联合推出的“Basys 3” FPGA开发板

我是11月6日,收到开发板的,拆开邮递的包裹,打开如下图所示,一块Basys3板卡、一个Micro USB Cable、和一个包装盒。当时我还很疑惑为什么没有下载器的,难道是DIGILENT中文技术社区忘记给我邮寄过来了吗?当时我很懵逼,查阅一些相关资料以后,发现这个线好牛啊,既可以供电,又可以作为JTAG cable,双线合一啊。

●  参数化设计:

所谓参数化设计就是将常量定义为一个字符,可以在不同情况下对其进行修改,灵活运用。主要用parameter这个关键字声明;

其声明格式:parameter 字符=常量;

如果定义多个常量的话,其格式如下:

格式一:  parameter  字符1=常量1,

                    字符2=常量2,

字符n=常量n; 

格式二:  parameter  字符1=常量1;

parameter  字符2=常量2;

parameter  字符n=常量n;

显然格式一比较方便一些。

●  设计流程:

1、当把Micro USB Cable吧开发板和电脑连接起来后,电脑会自动检查并且安装驱动程序,安装驱动程序之后;首先创建工程,选择工程类型为“RTL Project”,Basys3开发板型号为XC7A35T-1CPG236C,工程名命名为led_ctrl,如果不太清楚,其具体操作请参看《Vivado创建工程和编写源代码》。

其LED的左循环是靠led<= {led[2:0],led[3]}实现的,将最高位做为最低位,在低三位向左平移一位,依次循环反复,实现4个LED的循环。源代码编写完后,其源代码的编写如下:

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Create Date: 2016/11/23 21:41:41

// Description: LED循环以及参数化设计

// 所谓的而参数化设计就是将常量定义为一个字符,可以砸不同情况下对其进行修改,灵活

// 运用。 

//  系统时钟的工作频率为100MHz, 周期为10ns,1s/10ns=1_0000_0000,   

//  计数器计数1_0000_0000,LED循环一次。则最大计数为cnt_max=32d1_0000_0000

/////////////////////////////////////////////////////////////////////////////////
module

ctr_led        

   #(parameter cnt_max=32d1_0000_0000

)(clk,rst,led);//

 input

clk;

 input rst;//复位,高电平有效,basys3按键,按键按下,为高电平  output reg[3:0]led;//4位led  reg

[31:0] cnt;

//  计数器计数cnt_max=1_0000_0000,always@(posedge clk or negedg

e rst)

      if

(rst)

        cnt<=32d0;

      else if

(cnt==cnt_max)

         cnt<=32d0;

     else  

         cnt<=cnt+1b1;

  //  计数器计数cnt_max,LED循环一次,LED为高电平时亮;      always@(posedge clk or neg
edge rst)   if

(rst)  

     led<=4b0001;

  else if(cnt==cnt_max)//每1s,led循环左移一次

     led<= {led[2:0],led[3]};

  else

     led<=led;

endmodule

2、点击run synthesis,进行综合,综合的目的一是看看是否有语法问题,二是就是将RTL级设计的描述转化为一些基本的门电路等的逻辑连接。没有错误和critical warning。没有问题就进行功能仿真。

3、功能仿真:

这里参数化设计的好处就体现出来了,因为1s对于modelsim仿真来说时间太长,于是我们可以将cnt_max=32d1_0000_0000,改为cnt_max=32d10,减少仿真的时间,对于功能的验证毫无影响。下面就是仿真文件的代码:

`timescale 1ns / 1ps

`define clk_period 10

//////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer:

// Create Date: 2016/11/23

// Module Name: led_tb

// Tool Versions:

// Description:

//   /*

   由于仿真1s时间太长,所以在仿真是将cnt_max改为10,即计数10次led,

   就循环一次,这就体现参数化设计的好处了

  */

//////////////////////////////////////////////////////////////////////////////////
module

led_tb;

  reg

clk;

  reg

rst;

  wire

[3:0]led;    

ctr_led

 #

( .cnt_max (32d1_0)

  )//计数器计数到10,就使LED循环

  ctr_led(

    .clk(clk),

    .rst(rst),

    .led(led));

   initial

clk = 1;

   always

#(`clk_period/2)clk = ~clk;

   initial begin        rst=1b1;//复位

       #20;

       rst=1b0;//恢复        #(`clk_period*100);//等待100个时钟周期        

$stop; //停止

     end
endmodule

其仿真结果:LED的结果从0001、0010、0100、1000、一直循环,符合设计要求。

4、功能验证以后,便添加Xilinx设计约束文件(XDC)这里说明一点vivado环境中已经不支持ise支持的UCF文件;XDC的主要格式如下:

I/O引脚分配设置:

格式:set_property PACKAGE_PIN <FPGA引脚> [get_ports <设计定义的端口>] 

举例:set_property PACKAGE_PIN U16 [get_ports {led[0]}] 

I/O引脚端口电气属性:

格式:set_property IOSTANDARD <IO standrad> [get_ports {设计定义的端口}]

举例:set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}] 

I/O引脚上拉设置:

格式:set_property PULLUP true  [get_ports {设计定义的端口}]

举例:set_property PULLUP true [get_ports {led[0]}]

I/O引脚下拉设置

格式:set_property PULLDOWN true  [get_ports {设计定义的端口}]

举例 :set_property PULLDOWN true  [get_ports {led[0]}]

5、接下来就是添加管脚约束文件:

具体的操作在source选项卡中右击constraints,出现浮动窗口,选择Add source,选择add or create constraints,点击NEXT

点击“+”选择“create file”,在出现的窗口中填写XDC文件名,点击ok,生成XDC文件,把相应的管教分配添加到文件中。保存。XDC文件完成

其管脚约束文件如下:

6、接下来就是实现和生成bit文件的过程,点击run implentation,实现之后,点击generate Bitstream,生成数据流文件(bit文件);合成完bit文件,点击Hareward Manager,打开硬件管理器,选择自动连接后者打开对象,本次选择打开对象,自动连接比较简单,单击即可。单击open target选择 open new target,一直点击next,最后给出了一些硬件的信息,最后点击finish

7、出现下面的窗口,右击,选择programme device,选择对应的bit文件,点击programme,下载成功后,就可以在basys3板卡上,看到了实现现象。

8、实验现象:在Basys3板卡,LED实现每隔1S依次循环点亮

未完待续...第一时间了解连载内容的更新,请点击阅读原文或登录DIGILENT中文技术社区关注!

www.digilent.com.cn/community


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言