大家好,欢迎来到IT知识分享网。
软件版本:TD_5.6.4_Release_97693
操作系统:WIN11 64bit
硬件平台:适用安路(Anlogic)FPGA
登录“米联客”FPGA社区-www.uisrc.com视频课程、答疑解惑!
目录
1 概述
本实验以FPGA芯片EG4D20EG176为例,同时适用于安路其他FPGA芯片
实验目的:
1:掌握基于TD创建FPGA工程的方法
2:掌握基于TD新建FPGA代码文件
3:掌握基于TD调用PLL IP CORE
4:掌握基于TD添加时序约束
5:掌握基于TD添加PIN脚约束
2 如何利用TD创建FPGA工程
创建一个新的空的工程(虽然是国产FPGA厂家,但是目前国内主流FPGA厂家都是采用英文菜单,这个符合FPGA开发的习惯)
Project Name:新建一个fpga工程名,这里米联客的教学类fpga工程统一命名为fpga_prj
Project Path:工程路径设置,这里我们需要根据自己的磁盘和文件管理路径合理设置
Device Family:设置器件的系列,这里设置EG4,因为我们的开发板采用的是EG4D20EG176这颗FPGA芯片
Device Name:设置芯片的名字,这里选择EG4D20EG176
一个空的FPGA工程创建完成后入下图所示
以下是对软件工具的大概介绍,更多可以结合具体应用加以理解:
3 TD创建或者添加代码
首先根据米联客的代码管理规范,在对应的FPGA工程路径下创建uisrc路径,并且创建以下文件夹
01_rtl:放用户编写的rtl代码
02_sim:仿真文件或者工程
03_ip:放使用到的ip文件
04_pin:放fpga的pin脚约束文件或者时序约束文件
05_boot:放编译好的bit或者bin文件(一般为空)
06_doc:放本一些相关文档(一般为空)
3.1 如何新建FPGA代码文件
右击Hierarchy可以看到弹出的菜单中可以选择新建fpga代码或者添加已经存在的fpga代码
若新建FPGA代码,则选择New Source
File Type:如下图所示,可以支持多种编程语言,这里选择verilog
File Name:设置文件名
Location:设置文件路径,这里放到uisrc/01_rtl路径下方便管理。需要勾选Add To Project选项。
双击文件,可以看到TD默认输入了2行代码。
若使用第三方代码编辑工具(如vscode),则会弹出第三方窗口。
当只有一个文件时,默认是Top文件(Top文件即顶层文件,定义了整个设计的框架。各模块可在底层文件中实现,在top文件中例化,从而便于设计、阅读和管理。通常在Top文件中,需要定义输入输出接口、时钟、复位信号等)
编写以下示例代码
`timescale 1ns / 1ns module pll_test# ( parameter T_INR_CNT_SET = 32'd24_999_999 //分频时钟计数,初始时钟过快,人眼观察会导致LED常亮 )//设置分频系数,降低流水灯的变化速度 //该参数可以由上层调用时修改 ( input I_sysclk, //系统时钟信号 input I_rstn, //全局复位 output [2:0] O_led //LED灯输出 );//输入输出接口 reg [2:0] led_r;//设置一个LED的寄存器,用来存储LED信号状态 reg[32:0] t_cnt;//用于时钟分频的寄存器 assign O_led = led_r; //将寄存器内信号输出 always @(posedge I_sysclk or negedge I_rstn)begin if(I_rstn==1'b0) //系统复位 t_cnt <= 0; else if(t_cnt == T_INR_CNT_SET) //计数t_cnt达到目标时清零 t_cnt <= 0; else t_cnt <= t_cnt + 1'b1;//否则计数+1 end always @(posedge I_sysclk or negedge I_rstn)begin //系统时钟的上升沿触发以及复位的下降沿触发 if(I_rstn==1'b0) led_r <= 3'b100;//设置LED 寄存器的初始状态,1表示灯亮,0表示灯灭 else if( t_cnt == 0) //当计数器计数达到预定值被清零时 led_r <= {led_r[0],led_r[2:1]};//LED寄存器将最低位左移至最高位,通过{}来完成数据的拼接 end endmodule
3.2 添加PLL IP核
IP核是已预先设计好的电路功能模块。当需要完成相应的功能时,用户可以直接调用IP核、更改参数并实例化来实现,而不需要自己编写代码,提高了开发效率,减少了设计和调试的时间。
此处以PLL(锁相环)IP核为例。
Top文件代码:
`timescale 1ns / 1ps module pll_test( input I_sysclk, //系统时钟输入 output [1:0]O_up_led //LED输出 ); wire clk0; wire pll_lock; reg [25:0] cnt; assign O_up_led = {cnt[25:24]};//输出计数器的高位用于驱动LED mypll mypll_u( .reset (1'b0), .refclk (I_sysclk), .clk0_out (clk0),//single output up to 200MHz .extlock (pll_lock) );//PLL IP核例化,括号中为各接口在Top文件中声明的名称 always @ (posedge clk0 or negedge pll_lock)begin if (pll_lock == 1'b0) cnt = 26'b0; else cnt <= cnt + 1'b1; //cnt power on initial value is all 1 end endmodule
此时顶层文件下会出现问号文件,是因为我们在Top文件中对IP核进行了实例化,但尚未添加IP核。下面就来添加PLL IP核,在Tools菜单下选择IP Generator。
将IP核的文件名与Top文件中所声明的mypll相对应。
更改输入时钟参数,MLK-S200的晶振频率(即内置时钟频率)为25MHz。
此处设置输出时钟为200MHz。
后续参数由IP Generator自动设置。
选中.v文件
3.3调用PLL
双击IP内部的代码,查看PLL的调用接口(正确调用该PLL时,PLL应包含在顶层代码的下一级中。否则会和顶层代码平级,说明没有成功实例化)
查看输入输出接口
添加调用PLL的端口,即将IP核实例化。在前面准备好的Top文件中可以看到例化IP模块代码:
mypll mypll_u( //mypll为PLL IP核在该项目中的名称,mypll_u为实例化名称 .reset (1'b0),//复位 .refclk (I_sysclk),//PLL输入时钟 .clk0_out (clk0),//PLL输出时钟 .extlock (pll_lock)//PLL是否锁住 );//IP核实例化,括号中为各接口在Top文件中声明的名称
修改完代码后,保存文件。
若需要多次调用该IP核,只需更改实例名,再次例化即可。
4 添加约束文件
添加约束文件即将该设计的输入输出端口对应到板子上的硬件接口。
TD软件可以通过多种方式添加约束文件。为了可以通过向导定义约束,需要先综合下,双击综合。
综合后会弹出提示框,选择OK。
综合完成后,对应的符合上打了✔。User Constraints从置灰状态变为可用状态。
4.1 如何通过向导添加
4.1.1 添加IO约束
利用向导方式,一定要先完成综合Syn Opt(必须完成 Syn Opt 的 Read Design,软件才能识别出来端口)
在Tools菜单下,或在FPGA Flow窗口,选择IO Constraint。
根据原理图中的定义,正确填写IO号,如下所示:
我们根据原理图填写好Location 以及IOStandard其他默认,对于一些高速应用我们可能还要设置输出输出延迟
Name:信号名字
Direction:IO输入输出方向
Bank:FPGA的IO所在的BANK(FPGA的IO会分布在多个BANK)
Location:IO的具体位置,这也是我们重点需要约束的,这里需要看原理图找到PIN脚定义
IOStandard:IO的电平模式,需要正确设置,一般单端的有LVCMOS33\ LVCMOS25\ LVCMOS18等
DriverStrength:驱动能力,数值越大,驱动能力越强
PullType:上拉下来类型
SlewRate:转换速度,对于低速场合选择SLOW高速场合选择FAST
InDelay:可以手动设置IO输入延迟
OutDelay: 可以手动设置IO输出延迟
DifferentioalPair:差分对
其他一些设置暂时都用不到
设置好后,单击保存,一般选择single Line方式,阅读起来比较简洁
保存Pin脚约束到文件路径uisrc/04_pin,命名为fpga_pin.adc
之后会提示是否添加到本工程,单击YES
可以看到现在已经添加进来了
双击查看文件(具体管脚约束以实际工程为准)
4.1.2 添加时序约束
首先双击综合
综合完成后,在Tools菜单下选择Timing Wizard
由于刚刚添加完成PIN脚约束,所以会有以下警告提示单击Continue,由于我们确认代码没修改,因此继续添加
本方案比较简单,我们只添加周期约束
继续添加PLL时钟约束
此处PLL输入为25MHz,输出为200MHz,选择8倍频。
设置时钟约束的Generated clock的Targets属性。
单击创建。
单击Finish完成创建。
如果之前没有定义过时序约束文件,会提示保存文件。我们不使用默认的命名,我们修改到路径uisrc/04_pin路径下,并且命名为timing.sdc。
最后点击save。
在工程文件列表下可查看。
可以双击查看约束
4.2 如何移除约束文件
单击需要移除的约束文件,右击
分别移除fpga_pin.adc和timing.sdc文件
4.3 如何添加已有约束文件
有2个位置都可以添加已经存在的约束文件,一个是project Hierarchy中右击constraint添加,另外一个是在FPGA Flow中双击User Constraints中的Add ADC file和Add SDC File
分别右击constraint添加PIN脚约束文件(ADC)和时序约束文件(SDC)。
5 工程编译
5.1 一键编译
完成编译后如下
5.2 查看Log Tree报告
5.3 查看资源利用报告
5.4 查看时序分析报告
6 下载演示
6.1 硬件连接
(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)
请确保下载器和开发板已经正确连接,并且开发板已经上电(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)
6.2 程序下载
单击下载按钮
可以看到已经识别到芯片。实际芯片是 EG4D20EG176,而识别出来的变成了EAGLE_S20_EG176,但是这个不影响我们下载,所以继续。
6.2.1下载bit
选择bit文件
选中后单击Run
下载成功,
可以看到 LED 开始运行。
6.2.2 固化到FLASH
在 Mode 中选择 PROGRAM_FLASH,之后单击 RUN
下载成功。
6.3 运行结果
(该教程为通用型教程,教程中仅展示一款示例开发板的上板现象,具体现象以所购买的开发板型号以及配套代码上板现象为准。)
且固化到开发板上后,下次上电可直接运行程序,无需重新烧录。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/124667.html