学习fpga也有段时间了,但后台有几个朋友问我能不能分享一点简单入门例子,于是我打算发经典的如何控制led的例子,本文主要分享设计流程以及简单的verilog语法。

设计流程主要包括五个步骤模块设计、波形设计、编写rtl代码、仿真验证、上板验证,少部分根据设计的特殊性,有的需要进行画状态机和流程图。

1.按键控制小灯亮灭

实验目标:按下按键,小灯亮;松开按键,小灯灭。

了解硬件设计是写代码的前提,按键按下该管脚会拉低,led灯高电平点亮。

模块设计

模块设计:把复杂的功能进行拆分一个个独立的小模块,不仅增加模块的复用性,在后期的调试中也更简单。

波形设计

波形设计是野火家推出独有的设计方法,我个人觉得很受用。很好的体现了FPGA内部数字电路的并行执行的特点,不了解的朋友看看。

编写rtl代码:

FPGA采用的是硬件描述语言,语言构成电路。这与单片机不同,后者是如何写程序(指令)控制已有电路工作。

`timescale  1ns/1nsmodule led
(input wire  key_in,output wire  led_out);assign led_out = ~key_in;endmodule

仿真验证:

仿真验证又称测试脚本或激励,测试rtl代码中信号波形是否符合之前设计的波形。

`timescale  1ns/1nsmodule tb_led();reg    key_in;
wire   led_out;initial key_in <= 1'b0;always #10 key_in <= {$random} % 2;led led_inst
(.key_in (key_in ),  .led_out(led_out)
);endmodule

引脚约束:

根据硬件原理图确定按键和 led 分别与 FPGA 芯片的哪个引脚对应。

#按键
NET "key_in" LOC = U10 | IOSTANDARD = LVCMOS33;#led灯
NET "led_out" LOC = A11 | IOSTANDARD = LVCMOS33;

上板验证:

2.一上电小灯闪烁

实验目标:一上电或按下复位按键,小灯实现闪烁,闪烁一次的时间为1秒。

rtl代码:

`timescale  1ns/1nsmodule  breath_led
#(parameter   CNT_MAX = 25'd24_999_999
)
(input   wire    sys_clk     ,   input   wire    sys_rst_n   ,   output  reg      led_out
);
reg     [24:0]  cnt;    //经计算得需要25位宽的寄存器才够500ms//cnt:计数器计数,当计数到CNT_MAX的值时清零
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt <= 25'b0;else    if(cnt == CNT_MAX)cnt <= 25'b0;elsecnt <= cnt + 1'b1;//led_out:输出控制一个LED灯,每当计数满标志信号有效时取反
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)led_out <= 1'b0;else    if(cnt == CNT_MAX)led_out <= ~led_out;  //亮灭之间跳转endmodule

验证:

仿真验证:

`timescale  1ns/1nsmodule  tb_ledflash();reg    sys_clk                ;
reg    sys_rst_n              ;wire      led_out             ;initial  beginsys_clk    = 1'b1;sys_rst_n = 1'b0;#20sys_rst_n = 1'b1;endalways #10 sys_clk = !sys_clk;   //控制一个周期20nsledflash
#(.CNT_MAX    (25'd24     )  //改变CNT_MAX值的大小,缩短仿真时间
)
ledflash_inst
(.sys_clk     (sys_clk  ) ,.sys_rst_n   (sys_rst_n) ,. led_out    ( led_out ));
endmodule

上板验证:

效果为视频不方便展示。

3.流水灯

实验目标:每过0.5秒右移动一次

rtl代码:

`timescale  1ns/1ns
//流水灯:每过0.5s移一次module  water_led
#(parameter CNT_MAX = 25'd24_999_999 ,    //0.5s计数最大值parameter CNT =  3'd3
)
(input   wire            clk     ,   input   wire            rst     ,  output  reg     [4:0]   led        );
reg     [24:0]  cnt_500ms   ;
reg     [2:0]   cnt;//0.5s计时器
always@(posedge clk or negedge rst)if(!rst)    cnt_500ms <= 25'b0;else if(cnt_500ms == CNT_MAX)cnt_500ms <= 25'b0;elsecnt_500ms <= cnt_500ms + 1'b1;
//cnt计数周期为4的计数器
always@(posedge clk or negedge rst)  if(!rst)    cnt <= 3'd0;else if((cnt_500ms == CNT_MAX-1'b1) && (cnt == CNT))  //计数满4,清零  cnt <= 3'd0;else if(cnt_500ms == CNT_MAX-1'b1) //时序逻辑延后了一拍,这里给他减一对齐cnt <= cnt + 1'b1;else cnt <= cnt;always@(posedge clk or negedge rst)   //case()分支语句if(!rst)led <= 4'b0001;else  case (cnt)3'd0:   led <= 4'b0001;3'd1:   led <= 4'b0010;3'd2:   led <= 4'b0100;3'd3:   led <= 4'b1000;default: led <= 4'b0001;endcase  endmodule 

验证:

`timescale  1ns/1nsmodule  tb_water_led();reg          clk   ;
reg          rst   ;wire  [3:0] led    ;initial  beginclk    = 1'b1;rst = 1'b0;#20rst = 1'b1;endalways #10 clk = !clk; water_led
#(.CNT_MAX    (25'd24 )  //改变CNT_MAX值的大小,缩短仿真时间
)
water_led_inst
(.clk   (clk  ) ,.rst   (rst) ,.led   (led));
endmodule

仿真验证:

上板验证:

效果为视频不方便展示。

总结:

1.仿真就是测试rtl代码的正确性,编写整个系统的输入信号使其满足rtl代码的需求,就可以查看其内部逻辑的正确性。reg型表示的寄存器类型,reg相当于存储单元,具记忆功能; wire的本质是一条没有逻辑的连线,也就是说输入时什么输出也就是什么,无记忆功能。我们要对输入信号进行初始化、赋值故输入一般使用 reg,输出随输入变化故使用 wire。

说明:

本人使用的是野火家Xilinx Spartan6系列开发板及配套教程,以上内容如有疑惑或错误欢迎评论区指出,或者移步B站观看野火家教学视频。

开发软件:ise14.7     仿真:modelsim 10.5

如需上述资料私信或留下邮箱

03FPGA—led灯的显示(入门)相关推荐

  1. c语言led灯汉字编码,单片机led灯板显示汉字程序

    //该板子上的点阵为8*8,只能显示简单的一些汉子,如果要显示真正的汉字 //通过取模软件取的可以选择16*16点阵的板子 #include #include sbit SRCLK=P3^6; sbi ...

  2. Arduino基础入门篇06—流动的LED灯

    上一篇介绍了Arduino数字I/O引脚及相关函数,并点亮了板载LED灯.本篇将使用面包板搭建电路,多个LED灯配合显示流动效果. 1. 实验材料 Uno R3开发板 配套USB数据线 面包板及配套连 ...

  3. 单片机软件常用设计分享(二)驱动设计之LED灯显示设计

    单片机软件常用设计分享(二)驱动设计之LED灯显示设计 前言 <驱动设计–LED灯显示驱动> 一.LED灯工作方式 1.常亮 2.常灭 3.闪烁 4.间歇性闪烁 二.LED灯驱动数据结构 ...

  4. LED灯显示电池电量的原理图

    LED灯可以用来显示电池电量的原理图如下: +--LED1|+--LED2|+--LED3|+--LED4|+--R1|+--R2|+--R3|+--R4|+--Vbat|+--GND 其中,LED1 ...

  5. 关于按键消抖以及LED灯控制的一个实例

    要求: 1.未按建则所有LED全黑: 2.按K1按钮,则用前8个LED灯二进制显示25: 3.按K2按钮,则12只LED合并显示流水灯效果,3个LED点亮并向右流水. 注:是HR-240B FPGA  ...

  6. 嵌入式系统开发设计——按键控制LED灯实现

    一.实验目的 掌握STM32固件库的使用方法: 掌握基于库函数模板的开发方法: 掌握基于固件库进行GPIO端口编程的方法: 4.规范编程格式. 二.实验内容 1.查阅STM32-V5开发板按键.LED ...

  7. Arduino UNO R3开发板+MQ-2烟雾浓度传感器+火焰传感器+舵机+无源蜂鸣器+风扇+步进电机+WIFI模块+RGB三色LED灯+SIM900A所构成的室内安全报警模块

    该系统模块主要由Arduino UNO R3开发板+MQ-2烟雾浓度传感器+火焰传感器+舵机+无源蜂鸣器+风扇+步进电机+WIFI模块+RGB三色LED灯+SIM900A所组成,MQ-2烟雾浓度传感器 ...

  8. C51---蓝牙模块---连接软件---控制LED灯

    1.器件:C51.HC-08蓝牙模块.Ty-C数据线.杜邦线 2.软件:HC蓝牙助手 3.接线:VCC-VCC.GND-GND.RXD-TXD.TXD-RXD 4.烧写:STC-ISP串口助手 5.代 ...

  9. 51单片机入门学习篇-led灯、按键、数码管、中断

    文章目录 前言 一.Proteus仿真 二.Keil代码编写 1.流水灯 2.来回点灯 3.按键操作 4.中断操作 5.数码管 6 动态数码管 三. 练习题 总结 前言 本文用来记录博主学习单片机的过 ...

最新文章

  1. linux git 备份迁移,linux – 从GitHub迁移到GitLab(作为POSIX环境中的遥控器)
  2. 使用rapid-framework自动生成struct2
  3. LeetCode Algorithm 面试题 10.05. 稀疏数组搜索
  4. [蓝桥杯][算法提高VIP]开灯游戏(dfs)
  5. linux 常用工具
  6. JUNIT Hello World
  7. win11如何获取推送 Windows11系统电脑获取推送的设置方法
  8. 第8章防范式编程上(代码大全3)
  9. Unity Using Interception and Policy Injection
  10. C# Newtonsoft JArray排序
  11. 解决Chrome浏览器主页被hao123、360和2345篡改简单有效方法
  12. TextView 跑马灯效果
  13. 百度云不限速下载(官方渠道,无风险)
  14. Celery入门--定时任务的开发及运行
  15. [Spring Boot]Druid datasource整合及配置
  16. Android手机直播系统开发介绍
  17. 2022年广东省安全员A证第三批(主要负责人)考试练习题及在线模拟考试
  18. 语音播报警示器技术要求
  19. opengles for iOS
  20. 【活动推荐】2020中国DevOps社区峰会(成都站)

热门文章

  1. ThreadLocal线程内部存储类
  2. Windows 系统如何在 C++ 项目中使用第三方库
  3. 模拟演讲者视图_PPT演讲心慌慌?用演讲者视图一边看一边说
  4. 如何读写LLVM bitcode
  5. ACM------输出菱形
  6. UiPath最新社区版的下载与使用(一)
  7. python去掉符号_python去掉符号
  8. hive(spark-sql) -e -f -d以及传参数, sh并行
  9. Android版卡拉OK,歌词同步程序
  10. 图像处理课程复习整理(前四章节/前7个PPT)