文章目录
- 前言
- 软件安装
- 开发软件
- 仿真软件
- 点灯测试
- 代码编写与编译
- 引脚分配
- 固件下载
- 仿真测试
- ModelSim添加仿真库
- TangDynasty仿真设置
- 进行仿真
- 后记
前言
最近因为工作需要用安路的FPGA,这里对安路FPGA开发相关流程做个记录。作为测试只需要一个核心板(我这里用的 EF2L45LG144B
)和下载器( AL-LINK
,我这里是核心板上板载的)。
安路的所有软件和资料都可以在官网上下载到,不过因为权限问题,有些内容可能需要发邮箱给安路申请提升权限:
https://www.anlogic.com/
软件安装
开发软件
安路FPGA开发软件是 TangDynasty
,这里使用下面版本,另外还需要下载 license
:
之前碰到过笔记本离电性能平衡模式下怎么样装都装不成功,插电高性能下安装就一点都没问题,不知道是不是安装程序哪里有超时机制处理不当的BUG什么的。
软件安装后需要手动把下载的 license
放到安装目录对应位置下(这个许可是过段时间就过期,需要重新下载替换,可以用文本方式查看到有效期限):
软件安装后安装目录对应位置下有下载器的驱动,下载器连接电脑后可能需要手动更新驱动才会正常:
软件安装后可以打开软件找到软件手册:
这个手册基本上用到的东西都有介绍了,熟悉FPGA开发的人直接看这个就能用起来了。
仿真软件
ModelSim-英特尔® FPGAs 标准版软件版本:
https://www.intel.cn/content/www/cn/zh/software-kit/750666/modelsim-intel-fpgas-standard-edition-software-version-20-1-1.html
点灯测试
这里直接就点灯进行测试了。
代码编写与编译
首先新建文件:
编写代码如下:
module blink(clk, led);
input clk;
output reg led = 0;
reg [31:0] counter = 0;
always@(posedge clk)
if (counter == 5_000_000)
counter <= 0;
else
counter <= counter + 1;
always@(posedge clk)
if (counter == 5_000_000)
led <= !led;
endmodule
我的板子上有个 10MHz 的时钟输入到芯片,我拿它设置了个500ms的计数器,每次计数溢出时翻转一次外接LED的端口电平,实现LED闪烁效果。
运行编译:
引脚分配
没有报错的话分配下IO口:
另外未用到的IO口状态可以在下面地方统一设置(默认通常是上拉输入的):
固件下载
设置IO口后重新运行编译,成功后可以下载比特流( .bit
)文件到芯片中看到LED闪烁效果:
下载时选择 JTAG
,掉电后就会失效;选择 PROGRAM FLASH
掉电后也不会失效。
这里有点问题,官方说 PROGRAM FLASH
是下载到外部Flash, PROGRAM INTERNAL FLASH
是下载到芯片内置的Flash中,我的芯片按理说是选用后者才对,但我这里后面的选项不可选,并且选择前面的也可以正常使用。
仿真测试
TangDynasty
使用 ModelSim
仿真可以参考软件手册或者也可以参考下面文章:
https://chipdebug.com/forum-post/55252.html
下面步骤中在 ModelSim添加仿真库 后其实就直接可以在 ModelSim
中进行仿真了,这个可以参考上面资料。这里介绍的是通过 TangDynasty
生成仿真脚本来进行仿真。
ModelSim添加仿真库
ModelSim添加仿真库理论上对于源码和库目录大概是没有硬性要求的,这里参考上面资料的方式进行介绍。
首先在ModelSim目录中新建存放安路器件源码和模块库的目录,并从TangDynasty安装目录中拷贝源码到这里:
需要注意的是如果在上面目录中新建和拷贝需要权限的话,下面打开ModelSim需要以管理员方式打开,否则建立文件等会失败。
启动 ModelSim
,选择 File > Change Directory
将路径转到 anlogic
文件夹下。然后选择 File > New > Library
下新建库:
选择 Compile → Compile
进行编译:
编译完成后可以看到模块和相关文件:
TangDynasty仿真设置
TangDynasty可以生成ModelSim用的放在脚本,但是需要进行一些设置。
Process > Properties >
进行仿真
首先根据实际需求在 Process > Properties
设置模块库目录以及仿真时间和精度:
然后准备测试脚本,比如这里用 blink_tb.v
,测试脚本内容如下:
`timescale 1ns/1ns // 仿真时间尺度和精度
module blink_tb();
reg sig_clk;
wire sig_led;
blink blink_inst(
.clk(sig_clk),
.led(sig_led)
);
initial sig_clk = 0; // 设置初值
always #50 sig_clk = ~sig_clk; // 每 50*1ns 翻转一次sig_clk(即10MHz信号)
initial begin // 开始执行
#2_000_000_000; // 延时 2_000_000_000 纳秒(即 2000ms 或 2秒钟)
$stop; // 停止执行
end
endmodule
TangDynasty中运行到不同的步骤可以执行不同发仿真:
当 HDL2Bit Flow 运行至 Read Design 这一步时,可执行 Behavioral Simulation;
当 HDL2Bit Flow 运行至 Optimize RTL 这一步时,可执行 Post-RTL Simulation;
当 HDL2Bit Flow 运行至 Optimize Gate 这一步时,可执行 Post-Gate Simulation;
当 HDL2Bit Flow 运行至 Optimize Routing 这一步时,可执行 Post-Route Simulation。
例如下面:
接着选择 Tool > Simlation
添加测试脚本:
添加后会生成仿真脚本,注意检查相关内容,如果不对可以在这里直接修改,需要注意的是 -voptargs=+acc
这行:
之后就可以在ModelSim中进行仿真了,首先切换目录:
然后输入命令开始执行仿真:
仿真结果如下:
后记
TangDynasty 整体使用还是比较简单的,只有使用ModelSim来仿真稍稍会麻烦些,但也不算特别麻烦。