FPGA知识基础之--按键控制LED灯项目

news2024/9/20 12:38:08

文章目录

  • 前言
  • 一、按键简介
    • 按键:通过按下或者释放来控制电路通断的电子元件
    • 按键原理图
  • 二、实验要求
  • 三、程序设计
    • 3.1思路整理
    • 3.2 模型搭建
    • 3.3 顶层模块
    • 3.4 波形分析
  • 四、代码整理
    • 4.1RTL代码
    • 4.2 仿真
        • 只需在Testbench上增加上述一段代码即可将参数实例化,可达到在Testbench上更改参数的目的


前言

笔者将基于正点原子的达芬奇开发板,结合夏宇闻老师的Verilog数字系统设计教程,来记录自己学习FPGA的学习思路,希望能给与读者一些帮助


一、按键简介

按键:通过按下或者释放来控制电路通断的电子元件

自锁按键:按下之后能保持,类似于开发板的电源按键

轻触摸式按键:按下就通,松开即断

按键原理图

按下是低电平,断开高电平

在这里插入图片描述

二、实验要求

在这里插入图片描述


三、程序设计

3.1思路整理

在这里插入图片描述

3.2 模型搭建

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3 顶层模块

在这里插入图片描述

3.4 波形分析

在这里插入图片描述

四、代码整理

4.1RTL代码

module key_led(
input 					sys_clk,
input 					sys_rst_n,
input 	[3:0]			key,

output	reg [3:0] 		led

);

parameter CNT_MAX = 25'd25000000;//可在仿真时改为25'd25;,对应500ns

reg [24:0] cnt;
reg [1:0] led_flag;

//计数0.5s
always @(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		cnt <= 25'd0;
	else
		if (cnt < (CNT_MAX- 25'd1))
			cnt <= cnt+ 25'd1;
		else	
			cnt <= 25'd0;

end

//LED状态切换标志位
always @(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		led_flag <= 2'd0;
	else
		if (cnt < (CNT_MAX- 25'd1))
			led_flag <= led_flag + 2'd1;
		else 
			cnt <= 25'd0;
		
end

//LED控制
always @(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		led <= 4'd0;
	else
		begin
			case(key)
				4'b1111 : led <= 4'b0000;
				4'b1110 :begin
					if(led_flag == 2'd0)
						led <= 4'b0001;
					else if(led_flag == 2'd1)
						led <= 4'b0010;
					else if(led_flag == 2'd2)
						led <= 4'b0100;
					else 
						led <= 4'b1000;
					end
				4'b1101 :begin
					if(led_flag == 2'd0)
						led <= 4'b1000;
					else if(led_flag == 2'd1)
						led <= 4'b0100;
					else if(led_flag == 2'd2)
						led <= 4'b0010;
					else 
						led <= 4'b0001;
					end
				4'b1011 : begin
				
						if((led_flag == 2'd0)||(led_flag == 2'd2))
							led <= 4'b1111;
						else 
							led <= 4'b0000;
				
						end
				4'b0111 :  led <= 4'b1111;
				default : ;
			endcase
				
				
						
						
		
		end
end
endmodule

4.2 仿真

需要注意的是,在modelsim仿真时,可以将0.5s改为20ns以缩短仿真时间,仅需将CNT_MAX改为25’d25即可
testbench代码

`timescale	1ns/1ns //仿真的单位/仿真的精度s
module tb_key_led();

parameter CLK_PERIOD = 20;

reg 		sys_clk;  //周期20ns
reg 		sys_rst_n; //并非所有的输入都是reg,根据代码编写情况
reg [3:0] 	key;


wire  [3:0]	led;

initial begin
	sys_clk <= 1'b0;
	sys_rst_n <=1'b0;
	key <= 4'b1111;
	#200 
	sys_rst_n <= 1'b1;
	#2000
	key <= 4'b1110;//按下key0
	#2000
	key <= 4'b1111;//松开key0
	#2000
	key <= 4'b1101;//按下key1
	#2000
	key <= 4'b1111;//松开key1
	#2000
	key <= 4'b1011;//按下key2
	#2000
	key <= 4'b1111;//松开key2
	#2000
	key <= 4'b0111;//按下key3
	#2000
	key <= 4'b1111;//松开key3
	
end

always #(CLK_PERIOD/2) sys_clk = ~sys_clk;
	


 
key_led   u_key_led (
    .sys_clk     (sys_clk),
	.sys_rst_n   (sys_rst_n),
	.key		(key    	),
    .led         (led) 
 );
 
 
 
 endmodule
 
 

笔者在进行仿真分析是发现了自己代码编写的一些小错误
例如,在编写rtl代码时,输入输出信号用的是分号,而不是逗号
在编写Testbench代码的时候,笔者发现自己在进行实例化时忘记改名了

同时,在仿真时,若是每次仿真都要改RTL代码,还是比较繁琐的,为此,笔者希望可以在Testbench上进行修改,以下是笔者根据资料学习的办法

parameter CNT_MAX = 25'd25;





 u_key_led #(
	.CNT_MAX  (CNT_MAX)
 );
 
只需在Testbench上增加上述一段代码即可将参数实例化,可达到在Testbench上更改参数的目的

关于modelsim的用法心得:指令篇
restart -f 即重新开始仿真
run -time 即仿真时间;

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

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

相关文章

随堂测小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;试题信息管理&#xff0c;标签类型管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;考试成绩&#xff0c;试题信息&#xff0…

RDP Microsoft Remote Desktop 优化指南

RDP优化指南 RDP的优化主要从以下几个方面进行&#xff1a; 帧率设置开启硬件加速&#xff08;使用显卡&#xff09;传输协议设置链接用户数量nVidia显卡加速 1. 帧率设置&#xff08;这里我建议可以不去更改&#xff09; 我更信任UFO Test的FPS值&#xff0c;有人说改完之后…

15.2 zookeeper java client

15.2 zookeeper java client 1. Zookeeper官方1.1 依赖1.2 Zookeeper客户端连接测试1.3 Zookeeper节点操作1.3.1 zooKeeper.create创建节点1.3.2 zooKeeper.exists获取节点详情1.3.3 zooKeeper.getData获取节点数据1.3.4 zooKeeper.getChildren获取节点下所有子节点名称1.3.5 …

网络地址转换(NAT)

文章目录 NAT的作用NAT的实现方式NAT静态转换工作过程 NAT的作用 局域网与互联网的通信需求 重叠网段合并互通 隐藏内部网络的细节 NAT的实现方式 静态转换 "一对一"固定转换 动态转换 Basic NAT "一对一”动态转换。需要创建公网地址池 eNAPT 通过“IP地址端口…

c#调用python代码,实现读取npy的数据并显示图像

本例子实现的功能是&#xff1a; 根据stat.npy、ops.npy两个npy文件的内容&#xff0c;显示图形 1. 用python代码实现读取两个文件&#xff0c;文件名为read_npy.py&#xff0c;代码如下&#xff1a; import numpy as npdef read_npy_files(stat_file, ops_file):stat np.lo…

sqli-labs(6-10)关通关讲解

sqli-labs(6-10)关通关讲解 Less-6 方法一&#xff1a;手工注入 1.判断闭合 http://localhost/sqli-labs/Less-6/?id1" //报错 http://localhost/sqli-labs/Less-6/?id1" -- //正常 http://localhost/sqli-labs/Less-6/?id1" and 11 -- http://localhos…

YOLOv10环境搭建、训练自己的目标检测数据集、实际验证和测试

1 环境搭建 1.1 在官方仓库的给定的使用python3.9版本&#xff0c;则使用conda创建对应虚拟环境。 conda create -n yolov10 python3.9 1.2 切换到对应虚拟环境 conda activate yolov10 1.3 在指定目录下克隆yolov10官方仓库代码 git clone https://github.com/THU-MIG/yo…

手摸手教你撕碎西门子S7通讯协议10--S7Write写入float数据

1、S7通讯回顾 - &#xff08;1&#xff09;建立TCP连接 Socket.Connect-》已实现 - &#xff08;2&#xff09;发送访问请求 COTP-》已实现 - &#xff08;3&#xff09;交换通信信息 Setup Communication-》已实现 - &#xff08;4&#xff09;执行相关操作 …

器件学习——磁珠(2024.07.30)

参考链接1: 【器件篇】-25-磁珠的选型 在此感谢各位前辈大佬的总结&#xff0c;写这个只是为了记录学习大佬资料的过程&#xff0c;内容基本都是搬运的大佬博客&#xff0c;觉着有用自己搞过来自己记一下&#xff0c;如果有大佬觉着我搬过来不好&#xff0c;联系我删。 器件学习…

【MyBatis】史上最全的MyBatis执行SQL原理分析

目录 一、前言 二、简介 三、SQL 执行过程分析 3.1 SQL 执行入口分析 3.1.0 获取SqlSession对象 3.1.1 为 Mapper 接口创建代理对象 3.1.2 执行代理逻辑 3.1.2.1 获取 / 创建 MapperMethod 对象 3.1.2.1.1 创建 SqlCommand 对象 3.1.2.1.2 创建 MethodSignature 对象…

华为OD机试 - Wonderland游乐园 - 动态规划(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、3个测…

答应我,在量化策略回测里,避开未来函数这4个坑

由于社群的原因&#xff0c;看过不少策略&#xff0c;今天就腆着脸唠唠&#xff0c;量化新手期经常碰到未来函数的4个坑&#xff0c;希望量化萌新们少掉点儿头发。新手向文章&#xff0c;大神请绕行~ 情景1:使用前复权价格数据。 由于股票会存在分红送股的情形&#xff0c;价格…

芋道源码yudao-cloud 二开笔记(Editor富文本本地图片上传报错问题)

&#xff1a; 于是找到富文本的组件代码Editor.vue&#xff0c;检查一下上传的接口地址和token有没有传&#xff0c;如下图&#xff1a; 都没有问题&#xff0c;但还是报错&#xff0c;所以试试自定义上传的方法&#xff1a; // 导入上传文件的接口 import * as FileApi from …

reese84分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

最近火爆的GraphRAG是什么?真的那么有用吗?

最近&#xff0c;微软提出的GraphRAG项目引起了广泛关注。那么&#xff0c;GraphRAG究竟是什么&#xff1f;它真的那么实用吗&#xff1f;本文将为您详细解读GraphRAG的概念及其应用。 什么是传统的RAG&#xff1f; &#x1f4da; 在深入了解GraphRAG之前&#xff0c;我们首先…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX&#xff1f;****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战&#xff1a;创建一个动态表单****8. AJAX中的事…

Python 解决 ImportError: cannot import name ‘example’

Python 解决 ImportError: cannot import name ‘example’ 在Python编程的广阔天地中&#xff0c;ImportError: cannot import name example 是一个令人头疼但又常见的错误。当你试图从某个模块中导入一个不存在的名称时&#xff0c;这个错误就会悄然降临。本文将带你深入探索…

AI推理硬件成本分析:AMD Instinct MI300X与Nvidia GPU比较

随着AI模型训练成本的上升&#xff0c;人们越来越关注推理硬件的成本&#xff0c;尤其是在需要低延迟响应的应用中。Transformer模型需要强大的硬件支持&#xff0c;例如200毫秒以下的响应时间。Artificial Analysis最近分析了AI模型性能和定价&#xff0c;特别指出AMD的“Anta…

「豆包Marscode体验官」AI加持的云端IDE——三种方法高效开发前后端聊天交互功能

豆包 MarsCode 是一个集成了AI功能的编程助手和云端IDE&#xff0c;旨在提高开发效率和质量。它支持多种编程语言和IDE&#xff0c;提供智能代码补全、代码解释、单元测试生成和问题修复等功能&#xff0c;同时具备AI对话视图和开发工具。 豆包 MarsCode 豆包 MarsCode 编程助…

跟着动脑学院学习Android 开发基础

跟着动脑学院up主学习Android开发&#xff0c;记录学习笔记 2022 最新 Android 基础教程&#xff0c;从开发入门到项目实战&#xff0c;看它就够了&#xff0c;更新中_哔哩哔哩_bilibili &#xff08;弱弱地说一句&#xff0c;绝大部分内容都是up主为我们准备好的资料里摘抄下…