0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【紫光同创国产FPGA教程】【第二章】LED流水灯实验及仿真

FPGA技术专栏 来源:芯驿电子科技 作者:芯驿电子科技 2021-02-02 13:20 次阅读

原创声明:

本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处(alinx.com)。

适用于板卡型号:

PGL22G/PGL12G

1. 实验简介

通过LED流水灯实验,介绍使用PDS软件开发FPGA的基本流程,器件选择、设置、代码编写、编译、分配管脚、下载、程序FLASH固化、擦除等;同时也检验板上LED灯是否正常。

2. 实验环境

3. 实验原理

3.1 LED硬件电路

o4YBAGAY4TGAcbHuAAAj9d_WxdU988.jpg开发板 LED部分原理图

从上面的LED部分原理图可以看出,开发板都是将IO经过一个电阻和LED串联接电源端,FPGA的IO输出低电平点亮LED。IO输出高电平LED灯熄灭,其中的串联电阻都是为了限制电流

3.2程序设计

FPGA的设计中通常使用计数器来计时,对于50Mhz的系统时钟,一个时钟周期是20ns,那么表示一秒需要50000000个时钟周期,如果一个时钟周期计数器累加一次,那么计数器从0到49999999正好是50000000个周期,就是1秒的时钟。

程序中定义了一个32位的计数器:

//Definethetimecounter
reg[31:0]timer;

最大可以表示4294967295,十六进制就是FFFFFFFF,如果计数器到最大值,可以表示85.89934592秒。程序设计中是每隔1秒LED变化一次,一共消耗4秒做一个循环。

always@(posedgesys_clkornegedgerst_n)begin
	if(~rst_n)
		timer<=32'd0;
	elseif(timer ==32'd199_999_999)
		timer <=32'd0;
	else
		timer <= timer +1'b1;end

在第一秒、第二秒、第三秒、第四秒到来的时候分别改变LED的状态,其他时候都保持原来的值不变。

//LEDcontrolalways@(posedgesys_clkornegedgerst_n)begin
	if(~rst_n)
		led<=4'b0000;
	elseif(timer ==32'd49_999_999)
		led <=4'b0001;
	elseif(timer ==32'd99_999_999)
		led <=4'b0010;
	elseif(timer ==32'd149_999_999)
		led <=4'b0100;
	elseif(timer ==32'd199_999_999)
		led <=4'b1000;end

4. PDS工程

4.1 创建工程

1)启动Pango Design Suite 2020.3开发环境(在开始菜单中选择pango->Pango Design Suite 2020.3>Pango Design Suite 。Pango Design Suite(简称PDS)或者双击桌面的Pango Design Suite 2020.3的图标直接打开软件。

2)在PDS 开发环境里双击Create Project或File->New Project...这两种方式都可,如下图:

o4YBAGAY4TOAMDMQAACVUd7ZrJk226.jpg

3) 弹出一个PDS的工程向导,点击Next按钮。

pIYBAGAY4TSAK37gAABoRFfoWPc997.jpg

4)在弹出的对话框中输入工程名和工程存放的目录,这里取一个led_test的工程名,点击Next;

o4YBAGAY4TSAYn8MAABlb91lRa4876.jpg

5) 在下面的对话框中默认选择RTL Project, 因为我们这里使用verilog行为描述语言来编程,单击Next

pIYBAGAY4TWAaJ3jAABeXQbc3pk431.jpg

6) 进入Add Design Source Files界面,这里先不添加任何设计文件。点击Next;

o4YBAGAY4TWALr1vAABzbw3tnYk528.jpg

7)这里问是否添加已有的IP,保持默认不添加,单击Next;

pIYBAGAY4TaAQ5MBAABn8bg5IpU258.jpg

8)提示是否添加已有的约束文件,这里约束文件我们也没有设计好,也不添加。

o4YBAGAY4TeAXvg3AABkOYCQDm4926.jpg

9)在接下来的对话框选择所用的FPGA器件,以及进行一些配置。开发板首先在Family栏里选择Logos,Device中选择PGL22G,在Package栏选择BG324, Speed grade栏选择-6;综合工具选择ADS;单击NEXT进入下一界面:

pIYBAGAY4TeAJ9v5AABkNqxMelc035.jpg

10)再次确认一下板子型号有没有选对, 没有问题再点击“Finish”完成工程创建。

o4YBAGAY4TiAOTRGAABV3junm8E658.jpg

11)工程创建后如下图所示:

pIYBAGAY4TiAE_0OAAAXqj3ADY8184.jpg

4.2 编写流水灯的verilog代码

1)双击Sources下的Designs图标;

o4YBAGAY4TiAP0luAABmUKIUgik266.jpg

2) 在Add Design Source Files界面中进行如下设置,点击OK;

pIYBAGAY4TmAGpFtAACYTG0-gmY647.jpg

3)可以看到已经新建发led_test.v文件,点击OK按钮。

o4YBAGAY4TqAWmTrAACDVwitUPA586.jpg

向导会提示您定义I/O的端口,这里我们可以不定义,后面自己在程序中编写就可以,单击OK完成。

pIYBAGAY4TuAVVjAAABl4k1Obs0852.jpg

这时在Navigator界面下的Designs里已经有了一个led_test.v文件, 并且自动成为项目的顶层(Top)模块了。

o4YBAGAY4TuAD8faAABTR3QOPrU696.jpg

4)接下去我们来编写led_test.v的程序,这里我们定义了一个32位的寄存器timer, 用于循环计数0~199_999_999(4秒钟), 当计数到49_999_999(1秒)的时候,熄灭第一个LED灯;当计数到99_999_999(2秒)的时候,熄灭第二个LED灯;当计数到149_999_999(3秒)的时候,熄灭第三个LED灯;当计数到199_999_999(4秒)的时候,熄灭第四个LED灯,计数器再重新计数。具体的操作直接看代码吧。

`timescale1ns/1nsmoduleled_test(
sys_clk,//systemclock50Mhzonboardrst_n,//reset,lowactive
led//LED,useforcontroltheLEDsignalonboard);inputsys_clk;inputrst_n;output[3:0]led;//definethetimecounterreg[31:0]timer;reg[3:0]led;always@(posedgesys_clkornegedgerst_n)beginif(~rst_n)
timer<=32'd0;// when the reset signal valid,time counter clearingelseif(timer ==32'd199_999_999)//4 seconds count(50M*4-1=199999999)          timer <=32'd0;//count done,clearing the time counterelse
            timer <= timer +1'b1;//timer counter = timer counter + 1endalways@(posedge sys_clk ornegedge rst_n)beginif(~rst_n)
          led <=4'b0000;//when the reset signal active         
elseif(timer ==32'd49_999_999)//time counter count to 1st sec,LED1 lighten
          led <=4'b0001;elseif(timer ==32'd99_999_999)//time counter count to 2nd sec,LED2 lightenbegin
          led <=4'b0010;endelseif(timer ==32'd149_999_999)//time counter count to 3nd sec,LED3 lighten          led <=4'b0100;elseif(timer ==32'd199_999_999)//time counter count to 4nd sec,LED4 lighten          led <=4'b1000;endendmodule

5)编写好代码后保存,点击菜单File -Save All。

添加UCE约束

User Constraint Editor(Timing and Logic)简称UCE,主要是完成管脚的约束,时钟的约束, 以及组的约束。这里我们需要对led_test.v程序中的输入输出端口分配到FPGA的真实管脚上。

1)击菜单栏“Tools”下的"User Constraint Editor";

pIYBAGAY4TuAJdRmAABr7og2bKU795.jpg

2)在弹出的界面中单击Device;

o4YBAGAY4TyAEkVlAABxk6GZB6s752.jpg

3)在Device中单击I/O,可看到工程中用到的IO端口;

pIYBAGAY4TyAVXNcAAAPcGN_XZA942.jpgo4YBAGAY4T2AGFJHAABVXcjRsjs472.jpg

4)按如下方式分配管脚,LOC就是与硬件中FPGA相对应的管脚,VCCIO是FPGA的IO的电压标准,与硬件对应,其它在这里保持默认即可;

pIYBAGAY4T2AZDNtAABhOPvBFyI255.jpg

5)单击保存后会弹对话框,在这里选择默认;

o4YBAGAY4T2AGOACAACgyeaNksk188.jpg

4.4 生成位流文件

双击Generate Bitstream,然后软件会按照Synthesize-> Device Map-> Place & Route-> Generate Bitstream来产生位流文件。

pIYBAGAY4T6AB6wbAAErIt7WvxE107.jpg

如果工程在生成位流文件过程中没有错误,则会出现下图中每一步都正确的“√”,否则就会在Messages栏中显示errors的错误。

o4YBAGAY4T6ARR_8AACNeCDJVmw510.jpg

位流文件生成完成后,我们可以在Report Summary页面的到了FPGA资源的使用情况。

pIYBAGAY4T-AGbRsAACvVpVqBkM936.jpg

此外还可以通过下图操作查看RTL视图;

o4YBAGAY4T-AK5BQAABQlYl7ujw661.jpgpIYBAGAY4UCAWBqaAAAf_dlYgwA053.jpg

4.5 下载和调试

在上面生成了位流文件(.sbit)后,我们可以把sbit文件下载到FPGA芯片中,看一下LED实际运行的效果。下载和调试之前先连接硬件,把JTAG下载器和开发板连接,然后开发板上电(下图为开发板的硬件连接图)。

1)单击界面中的“Configuration”按钮,作用一是下载程序到FPGA中运行;二是固化程序到flash中。

pIYBAGAY4UGAJgVJAACHdeexutc252.jpg

2)在弹出的界面中的单击“Boundary Scan”,然后在右侧空白区单击右键选择“Scan Device”;

o4YBAGAY4UGADbLVAABvs3CYgO8083.jpg

3)在扫描到JTAG设备后会弹出如下对话框,并按如下加载.sbit文件即可;

pIYBAGAY4UKADlI3AACtA5Py74s362.jpg

4)然后可以看到左侧显示了要加载的文件,选中右侧绿色的方块,右击会弹出下拉菜单并选择"Program...",下载完成后在板上可以在开发板上看到LED流水灯的效果。注意:这种方式程序是在FPGA运行,掉电后会消失。

o4YBAGAY4UKAR2xMAAAW1n2hJj0715.jpg

4.6 FLASH程序固化

可能已经有朋友发现下载.sbit文件到FPGA后,开发板重新上电后配置程序已经丢失,还需要JTAG下载。这岂不麻烦!好吧,这一节我们来介绍如何把配置程序固化到开发板上的FLASH中,这样不用担心掉电后程序丢失了。

在我们的开发板上有一个8Pin的128Mbit的FLASH, 用于存储配置程序。我们不能直接把sbit文件下载到这个FLASH中,只能下载sfc文件到flash中。下面为大家介绍FLASH程序的固化的流程。

1)首先,需要sbit文件转换成能下载的flash的sfc文件。在完成上节下载和调试后,选择菜单"Operations"下"Convert File"进行文件转换。

pIYBAGAY4UOAFNCFAAChCIFOJDY443.jpg

然后弹出如下界面,这里要根据硬件的flash型号来选择flash的厂家和设备型号,开发板用到的是WINBOND的W25Q128Q。Flash Read Mode 选择SPI X4然后选择要转换的sbit文件,点击OK即可转换;

o4YBAGAY4UOAKKeJAABxdkKAjT8968.jpg

转换完成后显示如下界面,单击OK;

pIYBAGAY4USAATO3AAAN_Std9G0212.jpg

2)选中右侧绿色的方块,右击会弹出下拉菜单并选择"Scan outer Flash"。

o4YBAGAY4USARmNWAAAWPaLz8s4700.jpg

选择已生成的sfc文件,单击Open;

pIYBAGAY4UWABWtwAABX5eyG6FY805.jpg

可以看到界面中有了flash器件,选中“Outer Flash”绿色方块并右击选择菜单中“Program...”

o4YBAGAY4UWATER_AAARvWCtiW8195.jpg

弹出正在编程的进度界面,flash编程完成后进度界面自动消失。

pIYBAGAY4UWAN-PdAAAolWVK1kg002.jpg

至此,SPI FLASH 烧写完毕,led_test程序已经固化到SPI FLASH中了。我们来验证一下,关电重新启动开发板,等待一会儿你就可以看到开发板上的LED灯已经在做跑马运动了。

4.7 仿真验证

接下来我们不妨小试牛刀,让仿真工具modelsim来输出波形验证流水灯程序设计结果和我们的预想是否一致。具体步骤如下:

1)添加激励测试文件,点击Project下的Add Source;

o4YBAGAY4UaAP1NaAAA_QPmgJFQ650.jpg

2)点击Add or create simulation sources并"Next";

pIYBAGAY4UaACqSMAABtPSOOU0U469.jpg

3)在弹出的对话框中输入激励文件的名字,这里我们输入名为vtf_led_test,其它按下图设置;

o4YBAGAY4UeAGVg3AACQf2OTmE0177.jpg

4)点击OK按钮返回。

pIYBAGAY4UiALi3-AACCuKuJzI4954.jpg

5)这里我们先不添加IO Ports,点击OK。

o4YBAGAY4UiAQOTeAABge1MFcAA568.jpg

6)在Simulation目录下多了一个刚才添加的vtf_led_test文件。双击打开这个文件,可以看到里面只有module名的定义,其它都没有。

pIYBAGAY4UmAFcwVAABggBTbJM4708.jpg

7) 接下去我们需要编写这个vtf_led_test.v文件的内容。首先定义输入和输出信号,然后需要实例化led_test模块,让led_test程序作为本测试程序的一部分。再添加复位和时钟的激励。完成后的vtf_led_test.v文件如下:

`timescale1ns/1ns////////////////////////////////////////////////////////////////////////////////////ModuleName:vtf_led_test//////////////////////////////////////////////////////////////////////////////////modulevtf_led_test;//Inputsregsys_clk;regrst_n;//Outputswire[3:0]led;//InstantiatetheUnitUnderTest(UUT)led_testuut(.sys_clk(sys_clk),.rst_n(rst_n),.led(led));initialbegin//InitializeInputssys_clk=0;
rst_n=0;//Wait100nsforglobalresettofinish#1000;
rst_n=1;//Addstimulushere#20000;//$stop;endalways#10sys_clk=~sys_clk;//20ns,endmodule

8) 编写好后保存,vtf_led_test.v自动成了这个仿真的顶层了,它下面是设计文件led_test.v;

o4YBAGAY4VOAUpSGAABqIb7H7qU094.jpg

9)接下来设置PDS的仿真配置,在软件菜单Project->Project Setting,然后在弹出的界面中进行如下设置,注意仿真库的路径在《00.Pango Design Suite 2020.3安装》教程中已介绍。,设置好后单击OK。

pIYBAGAY4VOAG1CcAAChN2afqPc356.jpg

10)右击仿真文件并在下拉菜单中选择Run Behavioral Simulation。这里我们做一下行为级的仿真就可以了。

pIYBAGAY4VSAUbmbAAFThVcQCAs302.jpg

如果没有错误,PDS会调用Modelsim仿真软件开始工作了。

11)在弹出仿真界面后如下图,界面是仿真软件自动运行到仿真设置的50ms的波形。

o4YBAGAY4VSASH05AABavFRvCpo862.jpg

由于LED[3:0]在程序中设计的状态变化时间长,而仿真又比较耗时,在这里观测timer[31:0]计数器变化。把它放到Wave中观察(点击界面中的uut, 再右击右侧timer, 在弹出的下拉菜单里选择Add Wave)。

pIYBAGAY4VWAdkMuAAEW_LSHeQo350.jpg

添加后timer显示在Wave的波形界面上,如下图所示。

o4YBAGAY4VWAeqC1AACGnUtgtlU807.jpg

12)点击Restart按钮复位一下,再点击Run All按钮。(需要耐心!!!),可以看到仿真波形与设计相符。

pIYBAGAY4VaAGA4CAABiMDoSAOU608.jpgo4YBAGAY4VaAeM3QAAC-Rub6S0A533.jpg

我们可以看到led的信号会逐一变1,说明LED1~LED4灯逐个熄灭。

这里为止,我们的第一个项目就圆满完成了,相信您也掌握了PDS的FPGA开发的整个流程,再也不是那个FPGA的门外汉了吧! 师傅领进门,修行还需要靠本身!PDS软件的一些技巧的使用和掌握就需要靠大家在长期实践和探索中慢慢熟悉了。

5. 附录

led_test.v(verilog代码)

`timescale1ns/1psmoduleled_test(
	inputsys_clk,//systemclock50Mhzonboard	inputrst_n,//reset,lowactive	outputreg[3:0]led//LED,useforcontroltheLEDsignalonboard);//definethetimecounterreg[31:0]timer;//cyclecounter:from0to4secalways@(posedgesys_clkornegedgerst_n)begin
	if(~rst_n)
		timer<=32'd0;//when the reset signal valid,time counter clearing	elseif(timer ==32'd199_999_999)//4 seconds count(50M*4-1=199999999)		timer <=32'd0;//count done,clearing the time counter	else
		timer <= timer +1'b1;//timer counter = timer counter + 1end// LED controlalways@(posedge sys_clk ornegedge rst_n)begin
	if(~rst_n)
		led <=4'b0000;//when the reset signal active	elseif(timer ==32'd49_999_999)//time counter count to 1st sec,LED1 lighten		led <=4'b0001;
	elseif(timer ==32'd99_999_999)//time counter count to 2nd sec,LED2 lighten		led <=4'b0010;
	elseif(timer ==32'd149_999_999)//time counter count to 3rd sec,LED3 lighten		led <=4'b0100;
	elseif(timer ==32'd199_999_999)//time counter count to 4th sec,LED4 lighten		led <=4'b1000;endendmodule

注意:在定义寄存器时,如果寄存器在always块里使用必须定义为reg类型,如果仅是用于连线或是直接赋值需定义为wire类型,输入信号的类型不能定义为reg型,不管是reg类型信号还是wire类型的信号,定义的寄存器宽度必须满足使用时的需要,但必须稍大于或等于需要使用的位宽。若定义寄存器位宽远远大于使用需求则会浪费资源,如果定义的位宽小于使用需求,则会造成数据位截断,导致程序错误。还有其他信号的类型及用法请大家参考Verilog语法教程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1601

    文章

    21296

    浏览量

    593084
  • led
    led
    +关注

    关注

    237

    文章

    22441

    浏览量

    645834
  • 流水灯
    +关注

    关注

    21

    文章

    432

    浏览量

    59103
  • PDS
    PDS
    +关注

    关注

    2

    文章

    28

    浏览量

    15169
  • 紫光同创
    +关注

    关注

    4

    文章

    68

    浏览量

    27245
收藏 人收藏

    评论

    相关推荐

    紫光同创盘古PGX-MINI-4K教程】——(盘古PGX-MINI-4K开发板/PGC4KD-6ILPG144第二章LED 流水灯实验例程

    载 jtag 调试接口, 预留两组 20PIN 扩展 IO、数码管、按键、led 灯等硬件资源,为用户提供基本的 开发环境。 实验目的掌握流水灯原理并实现
    发表于 03-26 16:24

    紫光同创盘古PGX-Lite 7K教程】——(盘古PGX-Lite 7K开发板/PGC7KD-6IMBG256第二章)​LED 流水灯实验例程

    适用于板卡型号: 紫光同创PGC7KD-6IMBG256开发平台(盘古PGX-Lite 7K) 仅需一根TypcC线,插上即用,轻松操作。兼容下载器的一体版,配套资料丰富, 快速掌握国产FPG
    发表于 03-20 15:07

    紫光同创FPGA有哪些型号

    请问紫光同创FPGA有哪些型号?分别用于什么场景?
    发表于 01-24 10:48

    国产FPGA介绍-紫光同创

    紫光同创紫光集团旗下紫光国微的子公司,成立于2013年,有十余年可编程逻辑器件研发经历,布局覆盖高中低端FPGA产品。 早在2015年,
    发表于 01-24 10:45

    紫光同创国产FPGA教程】——(PGL22G第二章)键控流水灯实验例程

    LED1~8),FPGA输出高电平时对应的LED灯亮灯(详情请查看“MES22GP开发板硬件使用手册”)。 实验目的 由 U
    发表于 01-05 11:22

    紫光同创国产FPGA教程】——(PGL22G第一LED流水灯实验例程

    :INIT和DONE;有8个用户LED灯(LED1~8),FPGA输出高电平时对应的LED灯亮灯(详情请查看“MES22GP开发板硬件使用手册”)。
    发表于 01-02 18:04

    【每周一练】盘古1K开发板 练习一:LED流水灯实验

    查看附件中的快速使用手册。 LED流水灯实验 本次实验实现LED流水灯,使用的到的硬件为
    发表于 12-21 00:20

    【每周一练】盘古1K开发板 练习一:LED流水灯实验学习记录

    国产FPGA教程】【PGC1/2KG第一】控制LED实验例程[文章] # 【紫光
    发表于 11-21 16:51

    紫光同创FPGA开发套件,高性能国产FPGA方案

    紫光同创FPGA开发套件,高性能国产FPGA方案,100%国产化,全系列产品,方案可定制,满足多
    发表于 11-16 17:25

    紫光同创国产FPGA教程】【PGC1/2KG第三】键控彩灯实验例程

    适用于板卡型号: 紫光同创PGC1/2KG开发平台(盘古1K/2K) 一:盘古1K/2K开发板(紫光同创PGC2KG开发平台)简介 盘古1/2K 开发板是一套基于
    发表于 08-09 17:15

    紫光同创国产FPGA教程】【PGC1/2KG第二章LED 流水灯实验例程

    Compa 系列PGC1KG-LPG100 / PGC2KG-LPG100 器件为核心,预留丰富的扩展 IO 及数码管、按键、LED 灯,为用户提供基本的硬件环境。 实验目的 掌握流水灯
    发表于 08-09 11:58

    紫光同创国产FPGA教程】【PGC1/2KG第一】控制LED实验例程

    适用于板卡型号: 紫光同创PGC1/2KG开发平台(盘古1K/2K) 一:盘古1K/2K开发板(紫光同创PGC2KG开发平台)简介 盘古1/2K 开发板是一套基于
    发表于 08-08 11:49

    紫光同创FPGA入门指导:键控流水灯——紫光盘古系列22K开发套件实验教程(

    盘古22K开发板(MES22GP)是基于紫光同创40nm工艺的Logos系列PGL22G芯片的一套全新的国产FPGA开发套件。开发板电源采用圣邦微SGM61032解决方案,HDMI 接
    发表于 08-04 14:08

    紫光同创FPGA入门指导:LED流水灯——紫光盘古系列22K开发套件实验教程(一)

    盘古22K开发板(MES22GP)是基于紫光同创40nm工艺的Logos系列PGL22G芯片的一套全新的国产FPGA开发套件。开发板电源采用圣邦微SGM61032解决方案,HDMI 接
    发表于 08-03 17:04

    实验教程:LED 流水灯 ——紫光盘古系列高性能入门级2K开发板

    一、实验目的 掌握流水灯原理并实现流水灯 实验要求 流水灯:8 个
    发表于 06-26 10:58