写在前面的话
这一节呢,我们来实现一个流水灯驱动程序的编写,当然啦,点灯不是目的,最重要的是我们通过这个流水灯代码的实现可以掌握一些重要的规范。
项目需求
我们要求流水灯模式如下:当复位键按下时,灯全部熄灭,当复位键放开以后,首先,点亮第一个灯,然后第一个灯熄灭,同时点亮第二个灯,接着,第二个灯熄灭,同时点亮第三个灯,然后,第三个灯熄灭,同时点亮第四个灯,最后第四个灯熄灭,同时点亮第一个灯,如此循环往复,实现流水。
相关技术介绍
项目需求,我相信大家已经看清楚了,那么,接下来我们该怎么做呢?写代码?NO 我们来仔细的看看项目需求,这里面涉及到了按键,LED灯,还需要我们用按键控制流水灯的启动或停止。那么,在写代码之前,我们首先应该明确按键按下和放开有什么区别、LED是低电平点亮还是高电平点亮。只有清楚外设的性能,我们才可能编写代码正确地驱动这些外设。代码体现的是我们的思路,所以在写代码之前我们必须首先理顺自己的思路,否则盲目的编写代码,一定是徒劳的。
硬件设计
下图所示为轻触按键与FPGA的连接关系示意图
由上述电路图可知,当按键放开时,FPGA端口等于接到了上拉电阻,所以检测到的为高电平。当按键按下时,FPGA端子通过按键接到了地平面,检测到的为低电平。
下图所示为LED与FPGA的连接关系示意图
由上述电路图可知,LED正极全部接到了3.3V电源。那么,只有当FPGA端口给出低电平的时候,LED才会点亮。当FPGA端给高电平时,LED熄灭。
顶层架构设计
项目需求以及项目需求中所涉及到的所有外设都已经分析清楚了,那么接下来是不是可以开始编写代码了呢?答案还是—NO!哈哈,别着急,其实对于工程师而言,编写代码真的是小菜一碟,闭着眼睛都能敲几行哦。一个项目最重要的、最终决定成败的一般来说不是代码的具体实现,而是前期的架构设计,好的架构可以化简为易,将一个很复杂的工程逐步的拆分成很多简单的子模块,不但提高了设计效率和成功率,同时也比较适合团队作战,分工合作。如果在开始设计代码之前没有一个明朗的架构,做到最后甚至可能会发现原理根本无法通过,整体架构需要重新设计,那么这样就得不偿失啦。如下图所示为我们流水灯模块的一个基本架构,虽然很简单,甚至简单到了只有一个模块,但是呢,我们一定要养成这样的一个习惯。
端口描述
端口名 |
功能 |
clk |
系统时钟输入(50MHz) |
rst_n |
复位按键(低电平有效) |
pio_led |
4bit led驱动端口 |
代码解释
终于可以写代码了,具体代码实现步骤(先写什么,后写什么),大家可以观看梦翼师兄配套的视频。在这里,我们直接给出具体代码如下
/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:流水灯 *****************************************************/ 01 module led_learn( 02 clk, //系统时钟输入 03 rst_n, //系统复位 04 pio_led//LED驱动输出 05 ); 06 //系统输入 07 input clk; //系统时钟输入 08 input rst_n; //系统复位 09 //系统输出 10 output reg [3:0]pio_led;//LED驱动输出 11 //中间寄存器定义 12 reg [1:0]state;//状态寄存器定义 13 //LED驱动逻辑 14 always@(posedge clk or negedge rst_n) 15 begin 16 if(!rst_n) 17 begin 18 pio_led<=4'b1111; |