ZedBoard+Vivado(一)——纯PL实现流水灯
硬件:Zedboard
软件:Vivado2018.2 + Win10
本文参考了http://blog.chinaaet.com/cuter521/p/35946,原文代码有错误,已更正。
1 设计
功能:PL流水灯
语言:verilog
流程:建立工程->代码编辑->功能仿真->综合、实现->生成Bitstream->烧写进板子,观察现象
功能图:
timer500ms模块:
产生2hz的时钟,为led_ctrl模块提供时钟。
led_ctrl模块:
实现循环移位,在硬件上的体现就是流水灯。输入时钟为2hz,时钟上升沿进行一次移位操作,每个led点亮0.5s。
2 代码
runled_top.v
`timescale 1ns / 1psmodule runled_top(input iClk,input iRst_n,output [7:0] oLed);
wire clk2hz_sig;timer500ms timer500ms_inst(.iClk100mhz(iClk),.iRst_n(~iRst_n),.oClk2hz(clk2hz_sig)
);led_ctrl led_ctrl_inst(.iClk(clk2hz_sig),.iRst_n(~iRst_n),.oLed(oLed)
);
endmodule
timer500ms.v
`timescale 1ns / 1ps/*
oFreq = iFreq/(2*N)
N = iFreq/(2*oFreq) = 100,000,000/(2*2) = 25,000,000 = 0x17d7840
*/module timer500ms(input iClk100mhz,input iRst_n,output reg oClk2hz // period = 1/2s);
reg [31:0] cnt2hz;
always @(posedge iClk100mhz)
beginif(iRst_n==1'b0)beginoClk2hz <= 1'b0;cnt2hz <= 32'b0;endelsebeginif(cnt2hz==32'd25000000)begincnt2hz <= 32'b0;oClk2hz <= ~oClk2hz;end elsebegincnt2hz <= cnt2hz + 1'b1;oClk2hz <= oClk2hz;endend
endendmodule
led_ctrl.v
`timescale 1ns / 1psmodule led_ctrl(input iClk,input iRst_n,output [7:0] oLed);
reg [7:0] led;always @(posedge iClk)
beginif(iRst_n == 1'b0)led <= 8'b1;else//实现循环左移led <= {led[6:0], led[7]};
endassign oLed = led;endmodule
3 流程
3.1 创建工程
vivado2018.2的界面如下所示
选择Create Project,出现如下界面
选Next
输入工程保存目录,点Next
这里选择RTL Project,并且勾选Do not specify sources at this time。这样可以跳过源文件指定步骤,在后续过程中再输入源文件。点Next
在Boards下选择ZedBoard,这样就成功创建了工程
3.2 添加源文件
工程创建后界面如下
点击Add Sources,出现如下界面
选择Add or create design sources,出现如下界面
选择Create File
输入runled_top,然后OK
点Finish,出现如下界面
选择OK,YES
在Sources模块的Design Sources里能看到创建的runled_top.v文件,双击该文件
将内容替换为第二部分的代码,并按照此方法创建timer500ms.v和led_ctrl.v,完成后如下图。vivado能根据代码内调用关系生成文件层级(runled_top.v内调用了timer500ms和led_ctrl模块)。至此,源文件输入完毕。
3.3 RTL行为级仿真
输入代码后,在综合之前,我们可以通过仿真来验证代码逻辑的正确性。
首先应该添加仿真文件,这一步依然应该选择Add Sources
这里要选择Add or create simulation sources,后面过程与添加源文件一模一样,仿真文件代码如下:
`timescale 1ns / 1psmodule simulation1();
reg CLK;
reg RSTn;
wire [7:0] sim_oled;
wire clk2hz_sig;initial
beginCLK = 0;RSTn = 0;#100;RSTn = 1;
endalways
begin#5;CLK = ~CLK;
endtimer500ms timer500ms_inst(.iClk100mhz(CLK),.iRst_n(RSTn),.oClk2hz(clk2hz_sig)
);led_ctrl led_ctrl_inst(.iClk(clk2hz_sig),.iRst_n(RSTn),.oLed(sim_oled)
);endmodule
完成后界面如下
选择SIMULATION的RUN Simulation->Run Behavioral Simulation,界面如下,注意保证红框内的simulation1是选中的状态。
切换到timer500ms.v编辑界面
为更加明显看到timer500ms.v的分频效果,将分频系数调小。在timer500ms.v中将25000000修改为25,并保存
点击Relaunch Simulation
点击Zoom In放大波形
这样就验证了分频效果。
验证完成后将timer500ms.v中的25改回为25000000,并保存
3.4 综合(Synthesis)
综合之前,先添加约束文件,与添加源文件和仿真文件添加方式相同。
约束文件代码如下
#In the following the XDC constraint is matched to the origanal UCF constraint, XDC above, UCF below # Commentedset_property PACKAGE_PIN Y9 [get_ports {iClk}]set_property IOSTANDARD LVCMOS33 [get_ports {iClk}]#NET GCLK LOC = Y9 | IOSTANDARD=LVCMOS33; # "GCLK"# Bank 33, Vcco = 3.3V#set_property IOSTANDARD LVCMOS33 [get_ports -filter { IOBANK == 33 } ]set_property PACKAGE_PIN T22 [get_ports {oLed[0]}]set_property IOSTANDARD LVCMOS33 [get_ports {oLed[0]}]#NET LD0 LOC = T22 | IOSTANDARD=LVCMOS33; # "LD0"set_property PACKAGE_PIN T21 [get_ports {oLed[1]}]set_property IOSTANDARD LVCMOS33 [get_ports {oLed[1]}]#NET LD1 LOC = T21 | IOSTANDARD=LVCMOS33; # "LD1"set_property PACKAGE_PIN U22 [get_ports {oLed[2]}]set_property IOSTANDARD LVCMOS33 [get_ports {oLed[2]}]#NET LD2 LOC = U22 | IOSTANDARD=LVCMOS33; # "LD2"set_property PACKAGE_PIN U21 [get_ports {oLed[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {oLed[3]}]#NET LD3 LOC = U21 | IOSTANDARD=LVCMOS33; # "LD3"set_property PACKAGE_PIN V22 [get_ports {oLed[4]}]set_property IOSTANDARD LVCMOS33 [get_ports {oLed[4]}]#NET LD4 LOC = V22 | IOSTANDARD=LVCMOS33; # "LD4"set_property IOSTANDARD LVCMOS33 [get_ports {oLed[5]}]set_property PACKAGE_PIN W22 [get_ports {oLed[5]}]#NET LD5 LOC = W22 | IOSTANDARD=LVCMOS33; # "LD5"set_property PACKAGE_PIN U19 [get_ports {oLed[6]}]set_property IOSTANDARD LVCMOS33 [get_ports {oLed[6]}]#NET LD6 LOC = U19 | IOSTANDARD=LVCMOS33; # "LD6"set_property IOSTANDARD LVCMOS33 [get_ports {oLed[7]}]set_property PACKAGE_PIN U14 [get_ports {oLed[7]}]#NET LD7 LOC = U14 | IOSTANDARD=LVCMOS33; # "LD7"# Bank 34, Vcco = Vadj#set_property IOSTANDARD LVCMOS18 [get_ports -filter { IOBANK == 34 } ]set_property IOSTANDARD LVCMOS18 [get_ports {iRst_n}]set_property PACKAGE_PIN P16 [get_ports {iRst_n}]#NET BTNC LOC = P16 | IOSTANDARD=LVCMOS18; # "BTNC"
点SYNTHESIS->Run Synthesis,在出现的界面上选OK,然后等待即可。
3.5 实现(Implementation)
可在左下角IMPLEMENTATION选Run Implementation,也可以直接在中间界面选定Run Implementation然后选OK
3.6 生成Bitstream
过程与上一步类似,选择Generate Bitstream
右上角显示当前的状态
3.7 烧写
选Open Hardware Manager
给Zedboard上电,连上JTAG线后点击Open target的Auto Connect
软件成功识别板子后,点击Program device
Bitstream file会自动选择当前工程生成的bit文件,点Program后在板子上即可看见流水灯现象。
ZedBoard+Vivado(一)——纯PL实现流水灯相关推荐
- Zedboard学习(三):PL下流水灯实验
zynq系列FPGA分为PS部分和PL部分. PL: 可编程逻辑 (Progarmmable Logic), 就是FPGA部分. PS: 处理系统 (Processing System) , 就是与F ...
- arm ds开发基于iTOP4412开发板的纯汇编LED流水灯
前言 arm ds软件作为arm公司发布的ADS.DS5软件的延续,具备前两款软件的所有功能.同时将Keil MDK单片机开发软件的功能直接整合到了arm ds软件中.现在arm ds就相当于DS5+ ...
- 普中科技51纯代码(流水灯)
流水灯 1.点亮一个灯 2.一个灯闪烁 3.流水灯 4.灯左右来回流水 5.左右来回不定位平移 6.番外:蜂鸣器 7.流水灯+蜂鸣器 1.点亮一个灯 #include <reg51.h>s ...
- pynq-z2 使用PL做流水灯
一 实验目标 轮流点亮开发板下面的4颗LED灯 二 实验步骤 启动Vivado,点击创建一个新工程,工程名为turn_led 选择RTL工程 选择开发板Boards,在其中选择PYNQ-Z2 点击Ad ...
- Vivado入门创建工程之----流水灯
本文参考米联客提供的教程,对vivad开发过程部分进行总结和记录.笔者使用的版本是vivado 2017.3 step1.1,新建工程 step1.2,点击next step1.3,设置工程名称与路径 ...
- 基于verilog流水灯设计
使用verilog语言实现流水灯设计并进行仿真波形验证如下: 下面是在vivado下仿真截图: 流水灯顶层模块包括分频器和状态机组成 顶层模块如下: module ledwater( input cl ...
- 单片机(AT89C51)按钮控制LED灯实现流水灯,闪烁流水灯
目录 前言 实验要求和目的 实验电路图 实验过程 实验一 实验二 实验三 实验总结 后言 前言 好久没有写单片机系列了,话不多说,直接进入正题吧!本次要讲解和分享的实验是一个比较著名的流水灯实验,但这 ...
- 【FPGA】vivado使用(led流水灯实例,附图,详细)
整理时间:2021-03-08 前言: FPGA型号:XC7Z020-CLG400 vivado版本:2019.1 安装好vivado开发工具,拥有了FPGA开发硬件平台. 本文目录: 1.建立工程 ...
- 米联客 ZYNQ/SOC精品教程 S01-CH04 VIVADO创建工程之流水灯
软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...
最新文章
- JavaScript - JavaScript通用表单验证函数(实例)
- 申请鸿蒙选择应用程序是什么,申请鸿蒙系统有一个应用选择怎么选择呢
- 友情链接交换看的不是“真友情”!
- ML之FE:基于FE特征工程对RentListingInquries数据集进行预处理并导出为三种格式文件(csv格式/txt格式/libsvm稀疏txt格式)
- 趣说游戏AI开发:曼哈顿街角的A*算法
- 【Qt】Qt中QJsonObject类
- 一条查询SQL 语句是如何执行的?
- qt中new与delete使用示例
- wpf 点击按钮弹出选择框_WPF-PopupWindow wpf右下角弹出框,通过按钮调用,类似QQ CSharp C#编程 238万源代码下载- www.pudn.com...
- 机器学习 | 决策树的理论与实践
- 迭代器——STL关键所在
- 《玩转Python轻松过二级》配套视频免费观看地址
- 如何自动维护全文索引和目录
- Python 分析二手房源信息,揭晓土地交易现状
- Linux 与 Windows 计算文件夹大小
- 从零开始搭建“表情包小程序”
- 广东电大计算机绘图试题,2014年电大计算机绘图期末复习试题及答案参考小抄.doc...
- MIT牛人解说数学体系
- 事件分类及正则表达式
- webrtc 带宽估计