**这是本文档旧的修订版!**
点亮LED
就像软件编程里的“Hello World”,点灯是FPGA学习的第一步,不要小瞧这么一颗小小的灯,点灯的方式可以有多种。在本节,我们通过几个点灯的程序达到以下的目标:
- 体验LED的工作原理;
- 了解Verilog代码的结构
- 体验FPGA设计从创建工程 –》 输入代码 –》 逻辑综合 –》 分配管脚 –》 生成可下载的JED文件 –》 配置FPGA整个过程(理论知识参见FPGA设计流程)
在本实例中,我们以Web IDE为例,同样的示例也可以通过Lattice的官方FPGA设计工具Diamond或Intel的官方设计工具quartus_prime来实现。
1. 硬件说明
在这个实验中,我们主要用到小脚丫FPGA开发板上的以下几个外设:
- 板上有8个LED灯,可以选用其中的任何一个做单LED的实验
这是开发板上的8个红色LED,LED1~8信号连接到FPGA的引脚,作为FPGA输出信号控制。当FPGA输出低电平时LED变亮,当FPGA输出高电平时LED熄灭。
所以我们可以用开关或者按键来控制LED的亮灭。
2. 点亮一颗LED
根据Web IDE的使用流程介绍,我们先创建一个叫oneledonoff的工程,并在该工程里面创建一个叫oneledon.v的代码(代码名字跟工程的名字不需要一致):
module one_led_on(led); output led; assign led = 1'b0; endmodule
这段代码可以说是最简单的一段Verilog程序了,从这段程序中可以看出Verilog语言的基本结构
- 以module(模块)开始,endmodule结束的一段程序为描述某一项功能的基本单元,类似软件里面的子程序;
- 每个模块都有其名字,建议用贴切含义的英文来命名(比如本示例里面的oneledon),可读性强,也不会出现莫名其妙的编译错误;
- 每个模块都有用()包裹起来的端口 - 跟其它模块或FPGA的外围电路打交道的输入输出信号,在本示例只用了一个端口led,因此()中只有一个端口的名字;
- 对每一个端口的属性进行定义 - 是输入还是输出,是导线wire类型,还是存储器reg类型,在这里只用了一个输出端口led,对其属性“output”进行了定义,指定其为输出信号;
- 定义完端口,就开始逻辑的主体,在这里也很简单,只是让led这个管脚信号为低电平,使用assign语句 - assign led = 1'b0, 1’b0表示为一位的数字,而且值为“0”
点击Web IDE的第二个功能键“逻辑综合”,系统会自动将你写好的Verilog代码进行综合,如果没有语法错误,则给你一个Success的信息,你就可以走到下一步 - “管脚”了。 我们的Web IDE会根据你写好的module自动提取输入输出管脚的名字,你只要使用鼠标,通过图形化的界面将这些module里的端口信号的名字映射到相应的管脚上即可,在这里我们将led映射到板子上的第三个led,鼠标指向led3,其右侧会弹出一个向下的箭头,点击该箭头,就可以看到led的名字了(如果多个端口还没有分配管脚,这些未分配的端口信号的名字会出现在列表中),选中led,完成映射
在“管脚分配”里将第三颗LED配置为亮 (ON),分配了管脚的地方会亮起来
点击“FPGA映射”,系统会自动根据你分配好的管脚执行,生成JED文件,如果没有错误,会列出一堆的信息后,告诉你生成了jed的文件,在这段信息中也会有详细的资源使用报告,这些资源报告的信息也是很重要的,未完成同样一个功能,不同的人写出来的逻辑占用的资源也是不同的。
这时候您可以点击“文件下载”,选择第二个按钮“下载JED文件”,鼠标右键 –》另存为。。。指向到StepFPGA的盘即可完成对FPGA的下载编程。
配置到FPGA以后的效果,第三颗LED灯亮
3. 点亮多颗LED
正如上所述,我们小脚丫FPGA板上有8颗LED和2颗3色LED,总计8+6=14颗,我们通过逻辑让某些灯亮,某些灯灭,看看代码如何写,实际的效果如何? 比如:
- 8颗LED灯中的1、2、5、6、8亮
- 第一个RGB灯中的绿色灯亮
- 第二个RGB灯中的蓝色灯亮
- 其它灯都关掉
代码如下:
module one_led_on(led, led_r1, led_g1, led_b1, led_r2, led_g2, led_b2); output [7:0] 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 7, 5, 4, 1, 0 = 0 to make led 8, 6, 5, 2, 1 on endmodule
8颗单色的LED和两颗的3色LED都被分配了管脚
将JED文件下载到FPGA板子以后的效果
2. Verilog代码
// ******************************************************************** // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // ******************************************************************** // File name : LED.v // Module name : LED // Author : STEP // Description : control LED // Web : www.stepfpga.com // // -------------------------------------------------------------------- // Code Revision History : // -------------------------------------------------------------------- // Version: |Mod. Date: |Changes Made: // V1.0 |2017/03/02 |Initial ver // -------------------------------------------------------------------- // Module Function:利用按键和开关的状态来控制LED灯的亮灭。 module LED (key,sw,led); input [3:0] key; //按键输入信号 input [3:0] sw; //开关输入信号 output [7:0] led; //输出信号到LED assign led = {key,sw}; //assign连续赋值。大括号是拼接符,表示把key和sw拼接组成一个新的8位数赋值给led endmodule
3. 引脚分配
4. 小结
下载完程序后就可以实现按键开关控制LED灯的亮灭。了解小脚丫STEP-MXO2 V2上的外设LED、按键和开关的使用。如果你对Diamond软件的使用不了解,请参考这里:Diamond的使用。







