16路彩灯控制器 FPGA-Verilog

#16路彩灯控制器 FPGA-Verilog#

1、Verilog代码编写

1.1输入输出信号确定

题目要求多路彩灯控制器通过对应的开关按钮,能够控制多个彩灯的输出状态,组合多种变幻的灯光效果。

彩灯控制器的功能描述为:

设计一个多路彩灯控制器,能够使花型循环变化,具有复位清零功能,并可以选择花型变化节奏。具体要求如下:

  1. 彩灯控制器由16路发光二极管构成,当控制开关打开时,能够自动在6种不同的花型之间循环变化。

  2. 控制器具有复位清零功能,当复位信号有效时,不管花型状态如何,都会立即清零,恢复到初始状态。

  3. 设置节拍控制开关,控制多路彩灯的花型以快慢两种节奏变化。

通过功能描述可以知道,该系统需要有4个输入–时钟信号clk、复位开关、开启开关以及节奏变化开关,和1个输出–16位LED输出。

1.2模块确定

由于板载的时钟信号为50MHz,即时间间隔为20ns,如果直接使用肉眼无法观察到现象,因此需要对系统时钟进行分频,得到彩灯的时钟控制。

因为需要设置节奏控制开关,控制多路彩灯的花型以快慢两种节奏变化,需要一个2选1的数据选择器,当节奏控制开关置“0”时,以慢节奏显示花型,当置为“1”时,以快节奏显示花型,从而实现不同节奏的得到。

核心模块需要实现在节奏开关的控制下LED6种花型循环显示,则需要使用到状态机的知识,6种不同花型对应6个状态机,在正确的控制信号上实现LED的显示。

1.3模块代码编写

由模块确定可知,该设计由分频、选择、花型循环控制以及顶层4个模块组成。

1.3.1分频器设计

分频器可以直接调用IP核实现,也可以直接编写代码,在此设计中选用直接编写代码来进行。

module divide(clk,m,clk_out);
	input clk;
	input [31:0] m;
	output clk_out;

	reg [31:0] cnt;
	reg clk_out;
	
	initial
	begin
		cnt<=32'b0000_0000_0000_0000_0000_0000_0000_0000;
		clk_out<=1'b0;
	end

	always @(posedge clk)
	begin
		if(cnt==m) begin
			clk_out<=~clk_out;
			cnt<=32'b0000_0000_0000_0000_0000_0000_0000_0000;
		end
		else
			cnt<=cnt+1;
	end
endmodule

由代码段可知,只要确定了m值就可以得到对应的分频时钟信号,例如需要得到1MHz的时钟信号,因为1*25*2=50,则需要将m设置为25,即

m = 2*f1/f0

1.3.2二选一数据选择器设计

该部分主要是对节奏控制开关的实现,选择板子上的拨码开关,当开关拨到“1”时,以快节奏显示LED,当开关拨回“0”时,以慢节奏显示LED。同时,要产生两种不同快慢的节奏,即要产生两种频率不一的时钟信号,需要用到上面的分频器设计。

module mux2_1(speed_key,clk,cclk);
	input speed_key,clk;
	output cclk;
	
	reg cclk;
	
	wire clk1,clk2;
	divide divide1(clk,2500,clk1);%快节奏
	divide divide2(clk,500000,clk2)%慢节奏
	
	always @(posedge clk)
	begin
		if(speed_key)
			cclk<=clk1;
		else
			cclk<=clk2;
	end
endmodule

其中例化调用了分频器的设计,产生了10kHz的快节奏信号和1Hz的慢节奏信号。

1.3.3花型循环显示设计

前文提到该部分需要用到状态机,先掌握状态机的基本原理和编写流程。

1.3.3.1有限状态机

有限状态机(FSM)是按照设定好的顺序实现状态转移并产生相应输出的特定机制,是组合逻辑和寄存器逻辑的一种特殊组合:寄存器用于存储状态[包括现态current state和次态next state],组合逻辑用于状态译码并产生输出逻辑。在状态机设计中,主要包含以下3个要素:

  • 当前状态,即现态(CS);
  • 下一个状态,即次态(NS);
  • 输出逻辑(OL)

Verilog描述状态机有三段式描述、两段式描述以及单端式描述方法。三段式描述即三要素各用一个always过程描述;两段式描述使用两个always过程描述,一个过程描述现态和次态时序逻辑,另一个过程描述输出逻辑;单端式描述将三要素放在一个always过程描述。
####1.3.3.2 代码实现 ####

module mled(cclk,rst,start,LED);
	//输入输出定义
	input rst,start,cclk;
	output [15:0] LED;
	//各状态定义,也可以使用一位热码
	parameter IDLE=3'b000;
	parameter s0=3'b001;
	parameter s1=3'b010;
	parameter s2=3'b011;
	parameter s3=3'b100;
	parameter s4=3'b101;
	parameter s5=3'b110;
	//寄存器赋值设置
	reg [15:0] LED;
	reg [2:0] st_cur;//当前状态
	reg [2:0] st_next;//下一状态
	//实现同步状态跳转
	always@(posedge cclk or negedge rst)
	begin
		if(!rst)
			st_cur<=IDLE;
		else
			st_cur<=st_next;
	end
	//组合逻辑判断状态转移条件
	always @(*)
	begin
		case(st_cur)
		IDLE:st_next<=s0;
		s0:st_next<=s1;
		s1:st_next<=s2;
		s2:st_next<=s3;
		s3:st_next<=s4;
		s4:st_next<=s5;
		s5:st_next<=s0;
		default:st_next<=IDLE;
		endcase
	end
	//描述状态输出
	always@(posedge cclk or negedge rst)
	begin
		if(!rst)
			LED<=16'b0000000000000000;
		else if(st_cur==s0&&start)
			LED<=16'b1111111111111111;
		else if(st_cur==s1&&start)
			LED<=16'b0101010101010101;
		else if(st_cur==s2&&start)
			LED<=16'b1010101010101010;
		else if(st_cur==s3&&start)
			LED<=16'b0000111100001111;
		else if(st_cur==s4&&start)
			LED<=16'b1100110000110011;
		else if(st_cur==s5&&start)
			LED<=16'b1001100100111100;
		else
			LED<=16'b0000000000000000;
	end 
endmodule

从代码中可以看到,输出的LED状态只与当前状态(st_cur)有关,与输入状态无关,属于摩尔型状态机。状态机的第一段对应摩尔状态机模型的状态寄存器,用来记忆状态机当前所处的状态;状态机的第二段对应摩尔状态机模型产生下一状态的组合逻辑F;状态机的第三段对应摩尔状态机产生输出的组合逻辑G,因为采用时序电路输出有很大的优势,所以这里第三段状态机是由时序电路输出的。

在这里插入图片描述

由状态机图片可以看到,系统可以实现花型的循环显示。
###1.3.4 顶层模块###

module led_control(clk,rst,start,speed,LED);
//clk--系统时钟,rst--复位控制,start--启动,speed--节奏控制,LED--16路彩灯
	input clk,rst,start,speed;
	output [15:0] LED;

	wire speed1,speed2;
	wire cclk;

	divide divide1(clk,25,speed1);//快节奏
	divide divide2(clk,2500,speed2);//慢节奏
	speed_control speed_control(speed,clk,start,speed1,speed2,cclk);//节奏控制
	mled mled(cclk,rst,start,LED);//花型控制及循环显示

endmodule

在这里插入图片描述

通过对上述模块的调用和例化,实现顶层模块的设计,完成复位、启动、快慢开关对LED显示的控制,以及不同花型的LED显示。
##2. 系统仿真##
仿真过程是正确实现设计的关键环节,用来验证设计思想是否正确,及在设计实现过程中各种分布参数引入后,其设计的功能是否依然正确无误。仿真主要分为功能仿真和时序仿真。功能仿真是在设计输入后进行;时序仿真是在逻辑综合后或布局布线后进行。
###2.1 功能仿真###
功能仿真是指在一个设计中, 在设计实现前对所创建的逻辑进行的验证其功能是否正确的过程。 布局布线以前的仿真都称作功能仿真,它包括综合前仿真( Pre-Synthesis Simulation )和综合后仿真( Post-Synthesis Simulation )。 综合前仿真主要针对基于原理框图的设计;综合后仿真既适合原理图设计,也适合基于HDL语言的设计。

在这里插入图片描述

由功能仿真得,逻辑设计都是正确的。
###2.2 时序仿真###
时序仿真使用布局布线后器件给出的模块和连线的延时信息,在最坏的情况下对电路的行为作出实际地估价。时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的;惟一的差别是为时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时,并且在仿真结果波形图中,时序仿真后的信号加载了时延,而功能仿真没有。
####2.2.1 test bench编写####
编写testbench的主要目的是为了对使用硬件描述语言(HDL)设计的电路进行仿真验证,测试设计电路的功能、部分性能是否与预期的目标相符。
编写testbench进行测试的过程如下:

1) 产生模拟激励(波形);

2) 将产生的激励加入到被测试模块并观察其输出响应;

3) 将输出响应与期望进行比较,从而判断设计的正确性。

`timescale 1ns/1ns
`include "D:/FPGA1/quartus/led_control.v"

module led_control_vlg_tst();
reg clk;
reg rst;
reg start;
reg speed;

wire [15:0] LED;
wire speed1,speed2;
wire cclk;

divide divide1(clk,25,speed1);
divide divide2(clk,2500,speed2);
speed_control speed_control(speed,clk,start,speed1,speed2,cclk);
mled mled(cclk,rst,start,LED);

always
#10 clk=~clk;

initial
begin
	clk=0;rst=0;start=0;speed=1;
	#100 rst=1;
	#100 start=1;
	#100000 speed=0;
	#100000 speed=1;
	#100000 speed=1;
	#100000 speed=1;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=1;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=1;
	#100000 speed=0;
	#100000 speed=1;
	#100000 speed=1;
	#100000 speed=1;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=1;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=1;
	#100000 speed=0;
	#100000 speed=1;
	#100000 speed=1;
	#100000 speed=1;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=1;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=0;
	#100000 speed=1;
	#100000 $finish;
end
initial $monitor($time,,,"clk=%d LED=%d",clk,LED);
endmodule

由代码可知,时钟信号clk为50MHz,在initial段对相关输入信号进行了赋值。
####2.2.2 时序仿真结果####

在这里插入图片描述

由时序仿真图得,加入延时后的设计都是正确的,LED的花型能够循环显示六种不同的形态,复位、启动以及节奏开关都可以有效控制LED的变化。
###2.3 Signaltap 逻辑分析仪###
在上板之前,利用signaltap进行逻辑分析的正确性验证。

在这里插入图片描述

未开启控制开关LED的状态显示。

在这里插入图片描述

控制开关打开,节奏开关拨置零的LED状态显示。

在这里插入图片描述

控制开关打开,节奏开关拨置一的LED状态显示。

在这里插入图片描述

按下复位开关的LED状态显示。

由逻辑分析仪的结果知,系统能够完整且正确地实现设计功能的需求。
##3. 上板调试##
本设计选用器件Cyclone IV E:EP4CE6E22C8 来实现多路彩灯控制器。
###3.1 外设设计###
由于需要显示16路彩灯,所以需要一个16个LED组成的电路,16路LED阴极共地,每个LED的阳极连接板子上不同的管脚,得到不同高低电平,实现不同花型的显示。由于板子上的高电平设置输出为3.3V,而LED最大耐压值为3V左右,因此需要接16个限流电阻。由于白蓝绿灯的耐压值为3-3.2V,红黄灯的耐压值为1.8-2.0V,电流为15-20mA,所以白蓝绿灯选用47Ω的限流电阻,红黄灯选用200Ω的限流电阻。

在这里插入图片描述

###3.2 布局布板###
由板子管脚分配可知,系统时钟clk在PIN_23,复位信号rst在PIN_25,拨码开关在PIN_88、PIN_89、PIN_90和PIN_91,因此设计中的clk、rst、start以及speed只能分布在这几个管脚,LED的16个管脚分配在可以做普通I/O的管脚。

在这里插入图片描述

###3.3 上板结果

在这里插入图片描述

由上板调试结果知,系统可以很好地完成功能设计的要求,完成多路彩灯控制器系统的设计。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Word-表格法对齐公式(手把手教学,公式格式从此不再愁)

新建word文件 1&#xff09;鼠标点击【插入】—>【表格】,选择31列的表格 2&#xff09;鼠标置于中间表格&#xff0c;快捷键输入Alt&#xff0c;进入公式编辑器中&#xff0c;输入任意字母&#xff0c;如&#xff1a;A&#xff0c;点击居中即可。 3&#xff09;第三列表…

飞天使-k8s知识点7-kubernetes升级

文章目录 验证新版本有没有问题需要安装的版本微微 1.20.6.0kubeadm upgrade plan 验证新版本有没有问题 查看可用版本的包 现有的状态 查看版本 yum list kubeadm --showduplicates |grep 1.20 yum list kubelet --showduplicates |grep 1.20 yum list kubectl --showduplic…

代码随想录第四十天(一刷C语言)|单词拆分

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 单词拆分 思路&#xff1a;参考carl文档 动规五部曲分析如下&#xff1a; 1、确定dp数组以及下标的含义&#xff1a;dp[i] : 字符串长度为i的话&#xff0c;dp[i]为true&#xff0c;表示可…

DG报错ORA-01111、ORA-01110、ORA-01111备库不同步

刚同步好没多久的dg备库&#xff0c;过两天查看同步状态发现备库数据不同步&#xff0c;重新开启同步也不能正常同步。 查看alert日志&#xff0c;查看报错如下&#xff1a; MRP0: Background Media Recovery terminated with error 1111 Errors in file D:\APP\ADMINISTRATOR…

【IDEA】try-catch自动生成中修改catch的内容

编辑器 --> 文件和代码模板 --> 代码 --> Catch Statement Body

用Disruptor框架实现生产者-消费者模式

ConcurrentLinkedQueue队列的秘诀就在于大量使用了无锁CAS操作。 现成的Disruptor框架实现CAS进行编程。 无锁的缓存框架&#xff1a;Disruptor 它使用无锁的方式实现了一个环形队列&#xff0c;非常适合实现生产者-消费者模式&#xff0c; 比如事件和消息的发布。如果队列是环…

【网络安全 | 网络协议】结合Wireshark讲解TCP三次握手

TCP三次握手在Wireshark数据包中是如何体现的&#xff1f;在此之前&#xff0c;先熟悉TCP三次握手的流程。 TCP三次握手流程 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。在建立 TCP 连接时&#xff0c;需要进行三次握手&#xff0c;防止因为…

Python 直方图的绘制-`hist()`方法(Matplotlib篇-第7讲)

Python 直方图的绘制-hist()方法(Matplotlib篇-第7讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

【MySQL】脏读、不可重复读、幻读介绍及代码解释

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 数据库事务隔离级别是关系数据库管理系统中一个重要的概念&#xff0c;它涉及到多个事务并发执行…

14、Qt使用Eigen3

一、下载Eigen Eigen 二、创建项目 创建一个"Qt Widget Application"项目&#xff0c;基类选择“QMainWindow“&#xff0c;把Eigen拷贝到项目中 三、更改代码 在.pro中添加 INCLUDEPATH $$PWD\Eigen 在界面上添加一个pushButton&#xff0c;并转到槽&#xff0…

SpringIOC之AbstractResourceBasedMessageSource

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

simulink代码生成(四)——SCI发送模块(串口通信)

C2000中的SCI模块分为两种&#xff0c;一种是接收模块&#xff0c;一种是发送模块&#xff1b; 1 发送模块 发送模块如下图所示&#xff1a; SCI传输块使用指定的SCI硬件模块传输标量或矢量数据。采样率和数据类型是与输入端口一致&#xff1b; 注意&#xff1a;一个模型只能…

让某个页面一直处于最前面,可以屏蔽切屏检测

前言 学习通智慧树网课分屏&#xff0c;让某个页面一直处于最前面&#xff0c;可以屏蔽切屏检测。 页面一直处于最前面 前言1 安装包2 使用 1 安装包 https://download.csdn.net/download/qq_44850489/76684366 2 使用 一直下一步就可以 选择要放到前面的窗口&#xff0c…

【SSM】Spring MVC

Spring MVC 文章目录 Spring MVC1. 简介2. 核心组件与调用流程3. 入门使用4. SpringMVC接收数据4.1 访问路径设置4.2 接收参数&#xff08;重点&#xff09;4.2.1 param 和 json参数比较4.2.2 param参数接收4.2.3 路径参数接收4.2.4 json参数接收 4.3 接收Cookie数据和接收请求…

蓝桥杯备赛 day 1 —— 递归 、递归、枚举算法(C/C++,零基础,配图)

目录 &#x1f308;前言 &#x1f4c1; 枚举的概念 &#x1f4c1;递归的概念 例题&#xff1a; 1. 递归实现指数型枚举 2. 递归实现排列型枚举 3. 递归实现组合型枚举 &#x1f4c1; 递推的概念 例题&#xff1a; 斐波那契数列 &#x1f4c1;习题 1. 带分数 2. 反硬币 3. 费解的…

SQL实践篇(二):为什么微信用SQLite存储聊天记录?

文章目录 简介什么是SQLite在python中使用SQLite通过SQLite查询微信的聊天记录参考文献 简介 SQLite是一个嵌入式的开源数据库引擎&#xff0c;大小只有3M左右&#xff0c;因此我们可以将整个SQLite嵌入到应用中&#xff0c;而不再需要采用传统的客户端/服务器&#xff08;CS&…

ubuntu22.04 下载路径

ftp下载路径 csdn下载 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.001资源-CSDN文库 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.002资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.003资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.004资源-…

Jave EE 网络原理之网络层与数据链路层

文章目录 1. 网络层1.1 IP 协议1.1.1 协议头格式1.1.2 地址管理1.1.2.1 认识 IP 地址 1.1.3 路由选择 2. 数据链路层2.1 认识以太网2.1.1 以太网帧格式2.1.2 DNS 应用层协议 1. 网络层 网络层要做的事情&#xff0c;主要是两个方面 地址管理 &#xff08;制定一系列的规则&am…

数字化协同在服装行业:监狱服装生产的量身解决方案

内容来自演讲&#xff1a;苗子实 | 北京宜通华瑞科技有限公司 | 产品经理 摘要 这篇文章介绍了宜通世纪子公司北京宜通华瑞在服装行业智能制造方面的业务&#xff0c;以及明道云提供的业务支持。文章提到了服装行业的痛点及解决方案&#xff0c;并详细介绍了优化监狱服装企业的…

算法练习Day20 (Leetcode/Python-回溯算法)

虽然看似进入了一个新章节&#xff0c;但其实还是前几天二叉树章节的延续。。 回溯算法 &#xff08;以下内容摘抄自代码随想录&#xff09;&#xff1a; 回溯法解决的问题都可以抽象为树形结构&#xff0c;是的&#xff0c;我指的是所有回溯法的问题都可以抽象为树形结构&…
最新文章