时间:2024-08-08 来源:网络搜集 关于我们 0
来源 | DIGILENT中文技术社区
作者:zoudesuo
系列连载:
第一篇:Vivado创建工程和编写源代码
第三篇:在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
///////////////////////////////////////////////////////////////////////////////// modulectr_led
#(parameter cnt_max=32d1_0000_0000)(clk,rst,led);//
inputclk;
input rst;//复位,高电平有效,basys3按键,按键按下,为高电平 output reg[3:0]led;//4位led reg[31:0] cnt;
// 计数器计数cnt_max=1_0000_0000,always@(posedge clk or negedge rst)
if(rst)
cnt<=32d0;
else if(cnt==cnt_max)
cnt<=32d0;
elsecnt<=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]};
elseled<=led;
endmodule2、点击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,
就循环一次,这就体现参数化设计的好处了
*/
////////////////////////////////////////////////////////////////////////////////// moduleled_tb;
regclk;
regrst;
wire[3:0]led;
ctr_led
#( .cnt_max (32d1_0)
)//计数器计数到10,就使LED循环ctr_led(
.clk(clk),
.rst(rst),
.led(led));
initialclk = 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