点亮多颗LED

正如上所述,我们小脚丫FPGA板上有8颗LED和2颗3色LED,总计8+6=14颗,我们通过逻辑让某些灯亮,某些灯灭,看看代码如何写,实际的效果如何? 比如:

  • 8颗LED灯中的1、2、5、6、8亮
  • 第一个RGB灯中的绿色灯亮
  • 第二个RGB灯中的蓝色灯亮
  • 其它灯都关掉

1. 知识点

再上一个案例的基础上,进一步体会Verilog代码的语法结构 - 向量及注释。

2. 原理图

fpga_multi_leds.png 在这个示例中用到了8个分立的LED,在Verilog中以向量(类似C中的数组)的方式来表示,另外两个RGB三色LED分开描述,以进行对比。

3. Verilog代码

代码如下:

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语法说明

  • 此模块增加了一些管脚,需要对每一个管脚做端口说明(目前都还是”输出“的属性),并对每个管脚的信号电平进行赋值,对应于“亮”的LED赋值为0, 对应于“灭”的LED赋值为1。每一个连续赋值语句对应于一个电路结构,这些电路都是并行执行的,因此语句的顺序不会影响到最终的综合结果,这是与单片机的程序(顺序执行)不同的地方;
  • 8个LED可以分别写在端口里,并逐个赋值,也可以以8位位宽的向量方式来定义,在端口了只需要写一个led的名字即可,在端口定义的部分指定有多少个位 - [8:1] led, 为8位,名字分别外led[8] (对应于LED8)….led[1](对应于LED1)
  • 一个好的代码,要对一些重要的信息给出“注释”说明,单行注释可以用的方式, 后面的部分为注释内容。多行注释(又被称为块注释)以两个字符/* 开始,并以*/结束,其中的多行内容都会被认为是注释内容,在仿真或综合的时候被忽略掉。为增强可读性和兼容性,注释部分最好用英文来写

4. 管脚分配

管脚分配图如下:

8颗单色的LED和两颗的3色LED都被分配了管脚

5. 功能验证

下载到小脚丫FPGA板子上,实际的效果验证

将JED文件下载到FPGA板子以后的效果