## 点亮多颗LED
正如上所述,我们小脚丫FPGA板上有8颗LED和2颗3色LED,总计8+6=14颗,我们通过逻辑让某些灯亮,某些灯灭,看看代码如何写,实际的效果如何?
比如:
* 8颗LED灯中的1、2、5、6、8亮
* 第一个RGB灯中的绿色灯亮
* 第二个RGB灯中的蓝色灯亮
* 其它灯都关掉
### 1. 知识点
再上一个案例的基础上,进一步体会Verilog代码的语法结构 - 向量及注释。
### 2. 原理图
{{drawio>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. 管脚分配
管脚分配图如下:
{{ :14led_onoff_pinout.jpg? 1000 |}} 8颗单色的LED和两颗的3色LED都被分配了管脚
### 5. 功能验证
下载到小脚丫FPGA板子上,实际的效果验证
{{ :14led_onoff_result.jpg?800 |}} 将JED文件下载到FPGA板子以后的效果