03FPGA—led灯的显示(入门)

news2024/12/23 14:09:54

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

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

1.按键控制小灯亮灭

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

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

模块设计

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

波形设计

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

 编写rtl代码:

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

`timescale  1ns/1ns

module led
(
    input wire  key_in,
	
	output wire  led_out

);

assign led_out = ~key_in;

endmodule

仿真验证:

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

`timescale  1ns/1ns

module 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/1ns

module  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;
    else
        cnt <= 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/1ns

module  tb_ledflash();

reg    sys_clk                ;
reg    sys_rst_n              ;
                              
wire      led_out             ;

initial  begin
    sys_clk    = 1'b1;
    sys_rst_n = 1'b0;
	#20
    sys_rst_n = 1'b1;
	end

always #10 sys_clk = !sys_clk;   //控制一个周期20ns

ledflash 
#(
    .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;
    else
        cnt_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/1ns

module  tb_water_led();

reg          clk   ;
reg          rst   ;
            
wire  [3:0] led    ;

initial  begin
    clk    = 1'b1;
    rst = 1'b0;
	#20
    rst = 1'b1;
	end

always #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 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows编程资源,菜单资源,图标资源,光标资源,上下文菜单,字符串资源,加速键资源

Windows资源是一种二进制数据&#xff0c;由链接器链接进程序成为程序的一部分&#xff0c;通过资源的方式可以很方便的对应用程序进行扩展。在Windows中资源可以是系统自定义的&#xff0c;也可以是用户自定义的。在本篇文章中为大家讲解菜单资源&#xff0c;上下文菜单&#…

【LeetCode】617. 合并二叉树

1.问题 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重…

Win11系统更新后网络速度变的很慢怎么办?

Win11系统更新后网络速度变的很慢怎么办&#xff1f;有用户将自己的电脑系统升级到了Win11之后&#xff0c;出现了一些问题。电脑在使用中出现了网络速度变慢的情况。而且其它的设备在连接网络后速度是正常的&#xff0c;那么这个问题要怎么解决&#xff1f;来看看以下的方法分…

SpringBoot+RXTXcomm实现Java串口通信 读取串口数据以及发送数据

记录一下使用SpringBootRXTXcomm实现Java串口通信&#xff0c;使用Java语言开发串口&#xff0c;对串口进行读写操作。 RXTXcomm.jar这个包支持的系统较多&#xff0c;但是更新太慢&#xff0c;在win系统下使用没有问题&#xff0c;但是在centos的工控机系统里使用读取和发送有…

vmstat 粗查系统判断瓶颈

vmstat 1 5 每 1 秒显示一次 &#xff0c; 一共显示 5 次后结束 memory 内存 swap 虚拟磁盘&#xff0c;交换分区 io 磁盘 system 系统进程 rrun 多少个进程在跑&#xff0c;包括在排队等待cpu处理的进程b block 多少个进程处于卡死状态。 除CPU外的资源如网络、…

视频播放方案

video插件播放m3u8格式视频(存原生) 这里使用原生的javascript实现m3u8格式视频播放。 使用了包括video.min.js库和HLS插件。 1-基础使用 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>Video.js HLS Example</title…

MYSQL高级语句

实验用表 create table location (Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New York); insert into location values(West,Los Angeles); insert into location values(West,Houston); location…

如何解决请求参数为JSON时,采用IO流读取,只能请求一次的问题?

如何解决请求参数为JSON时&#xff0c;采用IO流读取&#xff0c;只能请求一次的问题&#xff1f; 一、错误演示1. 创建项目&#xff0c;添加所需依赖2. 配置redis环境3. 写一个简单的测试请求4. 写一个拦截器&#xff0c;拦截请求5. WebConfig 注册拦截器6. 测试请求 二、问题解…

vue问题

一、路由 hash模式&#xff08;location.hash hashchange 事件&#xff09; hash 模式的实现方式就是通过监听 URL 中的 hash 部分的变化&#xff0c;触发haschange事件&#xff0c;页面做出不同的响应。但是 hash 模式下&#xff0c;URL 中会带有 #&#xff0c;不太美观。 h…

【多线程初阶三】简单了解wait和notify方法~

目录 &#x1f31f;1、wait() &#x1f31f;2、notify() &#x1f31f;1、wait() &#xff08;1&#xff09;wait()方法与notify()方法都是Object类中的方法。 &#xff08;2&#xff09;wait()是让线程等待一段时间&#xff0c;死等——>状态WAITING:没有时间限制的等待.…

MySQL 高级(进阶) SQL 语句一

一、高级SQL语句&#xff08;进阶查询&#xff09; 先准备2个表 一个location表&#xff1a; use kgc; create table location (Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New York); insert int…

如何判断CRM软件的好坏?2023年CRM系统排行榜前三名是什么?

CRM客户管理系统经过20余年的发展&#xff0c;收获了越来越多企业的认可&#xff0c;成为企业数字化转型必不可少的一环。很多企业都有上线CRM软件的计划&#xff0c;但精准的找到一款适合自身的产品十分不易&#xff0c;今天我们就来盘点2023年CRM软件排行榜。 一、CRM的含义…

Intellij中使用Spotless 格式化代码

Spotless简介 在一些大型项目或开源项目&#xff0c;由于开发人员太多&#xff0c;导致各个代码格式不统一。会让整体项目的代码可读性变差。统一代码格式使用maven中的Spotless插件就是不错的选择。 Spotless 是一个代码格式化工具&#xff0c;它有以下功能&#xff1a; 支…

300. 最长递增子序列

300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子…

tp6 对接阿里云短信

1、获取AccessKey ID,AccessKey Secret&#xff0c;第一次会提示需要创建 2、添加签名 3、创建模板 composer版本太老了&#xff0c;可能会导致下载失败&#xff0c;建议升级下版本 官方提供的最新依赖版本&#xff0c;我的会报错&#xff0c;下载不了&#xff0c;提示用2.0.…

Android Studio 下真机调试

文章目录 一、开启真机调试二、断开真机调试 一、开启真机调试 准备USB调试线&#xff0c;一端插在电脑USB接口上&#xff0c;另一端插在手机充电口上。 下面以自己的手机&#xff08;huawei nova 5 &#xff09;为例&#xff1a;点击手机界面上的设置应用。 然后往下找到 【关…

经典神经网络(1)LeNet及其在Fashion-MNIST数据集上的应用

经典神经网络(1)LeNet 1、卷积神经网络LeNet 之前对于Fashion-MNIST服装分类数据集&#xff0c;为了能够应⽤softmax回归和多层感知机&#xff0c;我们⾸先将每个大小为28 28的图像展平为⼀个784维的固定⻓度的⼀维向量&#xff0c;然后⽤全连接层对其进⾏处理&#xff0c;此…

函数式接口的介绍和使用(FunctionInterface)——Consumer,Supplier,Predicate、Function

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法&#xff0c;但是可以有多个非抽象方法的接口。 函数式接口可以被隐式转换为 lambda 表达式。 函数式接口都添加了 FunctionalInterface 注解&#xff0c;这个是jdk1.8才引进的。例如 因为函数式接口里面只是…

【C++】| 01——泛型编程 | 模板

系列文章目录 【C】| 01——泛型编程 | 模板 文章目录 1. 认识泛型编程2. 函数模板1.1 函数模板的语法1.1.1 定义模板1.1.2 应用模板实现函数1.1.3 使用模板函数(实例化)1.1.3.1 隐式使用(实例化)1.1.3.2 显式使用(实例化)1.1.3.3 使用函数模板的注意事项(实例化) 2. 类模板2.…

第1章 Nginx简介

基于 Nginx版本 1.14.2 &#xff0c;Tomcat版本 9.0.0 演示 第1章 Nginx简介 1.1 Nginx发展介绍 Nginx &#xff08;engine x&#xff09; 是一个高性能的Web服务器和反向代理服务器&#xff0c;也可以作为邮件代理服务器。 Nginx 特点是占有内存少&#xff0c;并发处理能力…