起因:
写这篇文章并不是为了安利这个开发板!主要是为了帮助和我一样入坑的小伙伴,给一起入坑的小伙伴指出误区并提供玩转这个开发板的示例步骤!对本款FPGA开发板不感兴趣的小伙伴很抱歉浪费了你的时间。
对本站的这个开发板眼馋已久,主要是之前就了解过iCE40UP5k这款FPGA,据说是全世界功耗最低的FPGA,看了一下内部资源,竟然还不少,毕竟是核心板,价格相比于Xilinx和Altera的FPGA开发板也算是很良心了(至少我能承担的起つ﹏⊂),等我变强后说不定能拿来开发产品(做白日梦ing),于是心里一横,剁手了。
发货有些慢,感觉是拍下了很久才发货的亚子,不过幸好还是在我毕业前收到货了(再晚一个星期就赶不上了),微信群里的Lucia老师还在发货前告诉我订单发货了,激动得要死。
开箱就不发了,用小脚丫FPGA开发板的盒子发的,保护的挺严实。
windows下开发环境lattice Radiant的安装:
这里我走了弯路,所以要说一下,首先要注册一个lattice帐号,并在邮箱激活(国际惯例),但激活后你的账户并不能申请license,要过一两天才能申请。
虽然要过两个工作日才能申请license,不过你已经可以下载软件了,下载软件的时候有一行小字:
也就是说,要安装最新的版本,你必须先下载并安装Radiant2.2的旧版本,我个人建议两个都下载,已更新Radiant 3.0,直接下载即可,下载的软件解压后即得到exe安装包。(如果你看到这个文章时版本已经变化请无视),这时可以不要先急着安装,因为没有license,你安装好了也打不开。
两个工作日后,再申请license,不申请license的话,软件是无法启动的。在下载页面点击那个写着Licensing的大蓝色按钮,选择你需要的license。
floating license配置起来比较麻烦,需要配置在服务器上,通过服务器授权允许局域网中的用户使用。
node-locked license更加方便个人使用,只能在唯一的设备上使用,但配置非常方便。我个人推荐使用这种方式。
首先按下win+r键,输入cmd,点击确定打开命令提示符,接着输入ipconfig /all,找到你连接网络用的适配器(我用的笔记本自带的无线网卡连接的WiFi,因此是这个)
ctrl+C复制物理地址,填到Host NIC (physical address)后面的框框里,然后点击generate license,几秒之后会有一个邮件发送到你注册lattice帐号的邮箱里,邮件的附件就是我们需要的license。
安装好程序并启动后会弹出窗口要我们激活,把邮件发给我们的license复制到安装路径\lscc\radiant\2.2\license下,然后打开就行。
打开软件后可能会提示我们需要更新,但是软件自带的下载很反人类,直接把目标设成-1byte,根本不会自己停止,体验很差,我个人建议用之前下载好的最新版本的exe包手动更新。
三色LED炫彩灯使用的Verilog代码
Radiant里面自带的Example Project无法在这个开发板上正常运行,有一点误导性,我们用Radiant新建一个工程,新建工程太简单了,只要看得懂英语就没问题,这里就不做介绍了,只要记得芯片选择好iCE40UP5k,封装选择sg48就行。
首先我们要新建一个Verilog源文件,在input file那右键点击Add->new file就行,我们新建PWM_loop.v文件。
首先为了改变LED的亮度,我们需要产生PWM波,并且其占空比需要变化,通过查看开发板的电路图,可以看到RGB LED是共阳极连接的,因此输出低电平时LED才会亮,输出高电平时led会灭,红色LED在39号引脚,绿色LED在40号引脚,蓝色LED在41号引脚。
以下是PWM_loop.v文件的内容:
module PWM_loop(
input clk,
input rst,
output reg pwm,
output reg [1:0] state
);
reg[7:0] high;//determine the duty 0~255
reg[7:0] counter;//0~255
reg[8:0] times;//loop times of any duty cycle
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
counter<=0;
state<=0;
high<=0;
pwm<=0;
end
else if(counter==255)//占空比一共分为256级强度
begin
counter<=0;
pwm<=0;
if(times==182)//每个占空比重复183次,重复完后改变占空比
begin
times<=0;
if(high==255)//占空比一共分为256级强度
begin
high<=0;
if(state==2)//用于循环改变颜色,红->绿,绿->蓝,蓝->红
state<=0;
else
state<=state+1;
end
else
begin
high<=high+1;
end
end
else
begin
times<=times+1;
end
end
else
begin
counter<=counter+1;
if(counter<=high)
pwm<=1;//产生PWM波形
else
pwm<=0;
end
end
endmodule
接着新建LED_top.v顶层文件,通过上面的PWM生成器改变LED的亮度:
module RGB_LED(
input clk,
input rst,
output reg [2:0] rgb_led
);
wire pwm_wave;
wire next;
wire [1:0] state;
PWM_loop pwm (
.clk(clk),
.rst(rst),
.pwm(pwm_wave),
.state(state)
);
always @(state)
begin
case(state)
2'd0://红色渐弱,绿色渐强
begin
rgb_led[0]<=pwm_wave;
rgb_led[1]<=~pwm_wave;//这样它们的占空比就正好相反
rgb_led[2]<=1'b1;
end
2'd1://绿色渐弱,蓝色渐强
begin
rgb_led[0]<=1'b1;
rgb_led[1]<=pwm_wave;
rgb_led[2]<=~pwm_wave;
end
2'd2://蓝色渐弱,红色渐强
begin
rgb_led[0]<=~pwm_wave;
rgb_led[1]<=1'b1;
rgb_led[2]<=pwm_wave;
end
default:
rgb_led=3'b111;
endcase
end
endmodule
接着加入综合后约束文件将顶层模块的输入输出约束在FPGA的各个引脚上,新建文件的过程同上,但是新建文件时选择post-synthesis constraint file。我们通过查看这个开发板的电路图,可以看到晶振连接在35号引脚,复位连接到13号引脚,结合之前的LED连接方式,编写pdc文件如下:
ldc_set_location -site 35 [get_ports {clk}]
ldc_set_location -site 13 [get_ports {rst}]
ldc_set_location -site 39 [get_ports {rgb_led[0]}]
ldc_set_location -site 40 [get_ports {rgb_led[1]}]
ldc_set_location -site 41 [get_ports {rgb_led[2]}]
Radiant产生.rbt文件与烧录办法
完成代码及约束文件的编写后,就可以在开发板上实现我们的电路了,不过默认生成的bitstream和程序自带的烧录功能不兼容我们的开发板,我们需要改一下设置。
非常感谢微信群里的苏老师为我解答烧录的问题。
接着直接双击上面的Export File等整个流程变成绿色框框就行。
我们将开发板插上电脑,打开文件管理器,会看到电脑上多了一个叫STEPLink的U盘,不管它,我们打开项目的文件夹,在 项目路径\项目名\impl_1 下会看到一个rbt文件,右键将它发送到STEPLink中会看到开发板上prog 指示灯亮起,文件传输结束后就会熄灭,此时按一下板子上的复位按钮就可以看到RGB led灯的颜色不断切换。