我们最常见到的电子元器件是什么,无疑是LED,在我们的生活中它无处不在,比如手机的背光、汽车的头灯、几乎所有的照明也都是LED的了。
当然,对于我们做硬件的“板农”来讲, 哪个板子通上电以后没有俩LED在亮,你心里一定发毛 - 电源短路了?程序挂了?
只要电源灯亮了,心理就踏实了.....3.3V在正常工作。状态指示灯只亮可能还不够,因为它的表情应该非常丰富,不同的节奏可能代表不同的状态,你需要根据其闪烁的节奏来判断系统所处的状态,用过树莓派的同学都知道,在你插上电的那一刻起,树莓派的状态等就各种花式变换。。。。
简单的一颗灯,一颗单色的灯,就能给你提供非常丰富的信息,像不像我们常用的示波器、电压表?
是的,我就是这么看重它的 - LED就是相当于数字逻辑的“示波器”。
所以,我在每一个FPGA程序里面(无论多简单的功能),逻辑体的头4行必定是:
reg [23:0] cnt;
always @(posedge clk_in)
cnt = cnt + 1'b1;
assign hb_led = cnt[23];
为何?看到灯按照我设定的频率闪了,我心理踏实,就像听到了电路的心跳(hb = heart beat:心跳),知道编译对了、管脚分配对了、时钟是有的...
所以,数字逻辑编程要先植入一个LED灯的程序。
当然,就像程序员学习任何一门语言,必然先打印出"Hello World"一样,FPGA的学习要先从点亮LED开始!
点亮了灯,你也就有了探头,也就能够通过它一窥神秘的FPGA内部的脉搏。
同样,在我们这个学期的“数字电路”学习的系列文章中,我们也先从点亮LED入手。
下面就是纯技术的内容部分,原文见 : https://www.stepfpga.com/doc/one_led,你也可以点击“阅读原文”跳转过去。或扫描下面的二维码:
就像软件编程里的“Hello World”,点灯是FPGA学习的第一步,不要小瞧这么一颗小小的灯,点灯的方式可以有多种。在本节,我们通过4个点灯的程序达到以下的目标:
体验LED的工作原理;
了解Verilog代码的结构和基本的语法规范
体会HDL语言中的bit和FPGA端口电信号的关系
体验FPGA设计从创建工程 –》 输入代码 –》 逻辑综合 –》 分配管脚 –》 生成可下载的JED文件 –》 配置FPGA整个过程(理论知识参见FPGA设计流程)
在本实例中,我们以Web IDE(www.stepfpga.com)为例,同样的示例也可以通过Lattice的官方FPGA设计工具Diamond或Intel的官方设计工具quartus_prime来实现,只是要注意这些工具的使用方法和管脚的正确分配。
在这个实验中,我们主要用到小脚丫FPGA开发板上的以下几个外设:
这是开发板上的8个红色LED,LED1~8信号连接到FPGA的引脚,作为FPGA输出信号控制。当FPGA输出低电平时LED变亮,当FPGA输出高电平时LED熄灭。
这是开发板上的2个三色LED,(R_LED1, G_LED1, B_LED1), (R_LED2, G_LED2, B_LED2)信号连接到FPGA的引脚,作为FPGA输出信号控制。当FPGA输出低电平时,相应的LED变亮,当FPGA输出高电平时LED熄灭。
所以我们可以用开关或者按键来控制LED的亮灭。
根据Web IDE的使用流程介绍,我们先创建一个叫one_led_on_off的工程,并在该工程里面创建一个叫one_led_on.v的代码(代码名字跟工程的名字不需要一致):
module one_led_on(led);
output led;
assign led = 1'b0;
endmodule
这段代码可以说是最简单的一段Verilog程序了,从这段程序中可以看出Verilog语言的基本结构
点击Web IDE的第二个功能键“逻辑综合”,系统会自动将你写好的Verilog代码进行综合,如果没有语法错误,则给你一个Success的信息,你就可以走到下一步 - “管脚分配”了。我们的Web IDE会根据你写好的module自动提取输入输出管脚的名字,你只要使用鼠标,通过图形化的界面将这些module里的端口信号的名字映射到相应的管脚上即可,在这里我们将led映射到板子上的第三个led,鼠标指向led3,其右侧会弹出一个向下的箭头,点击该箭头,就可以看到led的名字了(如果多个端口还没有分配管脚,这些未分配的端口信号的名字会出现在列表中),选中led,完成映射
在“管脚分配”里将第三颗LED配置为亮 (ON),分配了管脚的地方会亮起来
点击“FPGA映射”,系统会自动根据你分配好的管脚执行,生成JED文件,如果没有错误,会列出一堆的信息后,告诉你生成了jed的文件,在这段信息中也会有详细的资源使用报告,这些资源报告的信息也是很重要的,为完成同样一个功能,不同的人写出来的逻辑占用的资源也是不同的。
这时候您可以点击“文件下载”,选择第二个按钮“下载JED文件”,鼠标右键 –》另存为。。。指向到StepFPGA的盘即可完成对FPGA的下载编程。
配置到FPGA以后的效果,第三颗LED灯亮
正如上所述,我们小脚丫FPGA板上有8颗LED和2颗3色LED,总计8+6=14颗,我们通过逻辑让某些灯亮,某些灯灭,看看代码如何写,实际的效果如何?比如:
代码如下:
module one_led_on(led, led_r1, led_g1, led_b1, led_r2, led_g2, led_b2);
output [8:1] led; // define 8 led signals to be output
output led_r1, led_g1, led_b1;
output led_r2, led_g2, led_b2;
assign led_r1=1'b1; // set signal of this pin = 1 to turn off the led connected to this pin
assign led_g1=1'b0; // make the green led on
assign led_b1=1'b1;
assign led_r2=1'b1;
assign led_g2=1'b1;
assign led_b2=1'b0; // make the blue led on
assign led = 8'b01001100; // set bit 8, 6, 5, 2, 1 = 0 to make led 8, 6, 5, 2, 1 on
endmodule
Verilog语法说明:
管脚分配图如下:
8颗单色的LED和两颗的3色LED都被分配了管脚
下载到小脚丫FPGA板子上,实际的效果验证:
将JED文件下载到FPGA板子以后的效果
// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name : LED_onoff_sw.v
// Module name : led_onoff_sw
// Author : STEP
// Description : control 8 leds on and off with 4 push buttons and 4 switchs
// Web : www.stepfpga.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.0 |2021/09/15 |Initial ver
// --------------------------------------------------------------------
// Module Function: use external button to control leds
module LED (key,sw,led);
input [3:0] key; // 4 push buttons input
input [3:0] sw; // 4 switchs input
output [7:0] led; // output control signals to 8 leds
assign led = {key,sw}; //assign led signal values to 4 keys input + 4 switches input
endmodule
Verilog语法说明:
管脚分配如下:
将模块端口的16个信号分别分配给8个LED和4个按键、4个开关
将生成的JED文件下载到FPGA板以后的效果:
用开关和按键可以控制LED的on/Off, 正常开关和按键的状态都为高电平,8个LED都处于灭的状态,改变开关和按键的装填可以让LED亮起来,按键、开关和LED一一对应。
从逻辑的角度,这段代码跟第4节的代码没什么区别,用了一个三色LED灯代替8个单色的灯,目的是为了让大家通过实际的效果体会一下三色灯的颜色搭配。
代码见下:
// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name : RGBLED.v
// Module name : RGBLED_SW
// Author : STEP
// Description : control RGB LED with 3 switchs
// Web : www.stepfpga.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.0 |2021/09/15 |Initial ver
// --------------------------------------------------------------------
// Module Function: Use 3 switches to control one RGB LED's on/off and color change。
module RGBLED_SW (sw,led);
input [2:0] sw; //input control signals with 3 switchs
output [2:0] led; //output signals to 1 RGB LED
assign led = sw; //assign sw value to led
endmodule
分配一下管脚:
一颗RGB和3个开关被映射到端口信号上
下载到小脚丫FPGA板子上,实际的效果验证
将JED文件下载到FPGA板子以后的效果
通过4段代码,我们体验了对LED的开关控制以及最基本的Verilog语法要求和代码构成,以及开关和按键的控制差异,这为后期的输入输出控制、状态输出展示打下了基础。
前期关于数字电路学习的文章:
浅谈“数字电路”的学习(1)- 我们身处的“数字逻辑”世界
浅谈“数字电路”的学习(2)- 在兴趣和体验中高效学习
浅谈“数字电路”的学习(3)- 不需要安装软件、人人一学就会的FPGA学习板