基于FPGA的多路彩灯设计及代码

1.技术规范
1.1实现功能
本次课程设计要 ModelSim 仿真工具进行逻辑仿真和时序仿真和利用QuartusII 工具进行设计综合利用多路彩灯控制器,能够使花型循环变化,具有复位清零功能,并可以选择花型变化节奏。并且可以实现如下功能
⑴彩灯控制器由 16 路发光二极管构成,当控制开关打开时,能够自动在6 种不同的花型之间循环变化。
⑵控制器具有复位清零功能,当复位信号有效时,不管花型状态如何,都会立即清零,恢复到初始状态。
⑶设置节拍控制开关,控制多路彩灯的花型以快慢两种节奏变化。
1.2引脚定义
彩灯基准时钟信号 clk :提供系统的初始时钟信号。
系统清零信号 reset:当reset为高电平,系统复位,回到初始状态;reset为低电平,系统自动在六种花型中循环变化。
彩灯节奏快慢选择开关sel :当sel为0彩灯花型以快节奏变化。当sel为1彩灯花型以慢节奏变化。
16彩灯个输出信号z :控制16个彩灯的输出花型。

2.系统设计方案
2.1系统总体设计
根据题目的设计要求,将输入信号分三种:控制彩灯节奏快慢的基准时钟信号 clk,系统清零信号 reset,彩灯节奏快慢选择开关sel;并通过 16个输出信号,分别用于控制十六路彩灯 经过分析,将整个系统分为三个模块。分别是分频模块、数据选择模块、彩灯花型控制模块。其中分频模块能够将系统的时钟信号进行分频,以产生高频和低频的彩灯输入信号。数据选择模块可以根据用户控制要求,选择合适的分频后信号,从而实现彩灯变化的快和慢。最后一个模块是彩灯控制模块,通过对Z输出端口的控制实现不同花色之间的变换。各模块连接关系如图2.1所示。

2.2系统各个模块设计
2.2.1 分频模块
实验要求中规定彩灯的变化可以提供快速和慢速两种模式,为了达到这种目的,可以对clkin输入的信号进行分频处理。在本设计中,快速信号clkout1是对clkin信号的二次分频,慢速信号clkout2是对clkout1的四次分频。除此之外,复位部分也可在此部分实现,通过对代码的设计,可以在当reset位于高电平时,clkout1和clkout2输出都为0,从而实现复位功能。在实验代码中,可以通过修改参数实现更好层次的分频,从而能够根据用户需要进行合适的速度设定,图

2.2.2数据选择模块
实验中要求可以实现彩灯循环快慢的控制,为此通过分频系统产生了高频和低频和信号,然后需要进行数据选择,才能让合适的信号输入彩灯控制模块,实现实验的要求。在该模块中,通过Sel控制out的输出信号,当Sel为0,输出out为int1;当sel为1,输出为int2。图2.3为数据选择模块原理图。

图2.3 数据选择模块
2.2.3 彩灯花型控制模块
设计中的分频模块和数据选择模块已经完成了彩灯激励信号的产生,彩灯控制模块主要是通过程序设计,完成彩灯花型的设计和循环功能。为此通过引入6个常数并使用case语句完成花型和设计和循环功能。图2.4位彩灯花型控制模块原理图。

3.验证方案和仿真激励代码
3.1分频模块
对于分频模块输入端口为系统输入时钟clk和复位控制reset,输出为分频后的信号clkout1和clkout2。因此激励文件应该是对clk信号和reset信号的控制。在分频模块,通过在固定延时后clk信号的取反实现输入时钟信号clk;而复位信号在最初为高电平,实现复位功能,延时100ns后,变成低电平开始正常的分频功能。
代码:
%分频测试
timescale 1ns/1nsdefine clk_cycle 50
module fenpin_tb;
reg reset,clkin;
wire clkout1,clkout2;
fenpin fenpinw1(
.reset(reset),
.clkin(clkin),
.clkout1(clkout1),
.clkout2(clkout2));

				always #`clk_cycle
				        clkin=~clkin;
				initial
			     begin 
				       reset=1;
						 clkin=0;
						 #100 reset=0;
						 #10000 $stop;
						end 			 

endmodule

3.2数据选择模块
对于数据选择模块输入端口为分频模块产生的两个输出信号clkout1、clkout2和数据选择控制sel,输出端口为选择后的输出信号out。因此激励文件应该是对sel信号的控制。在数据选择模块,通过对sel的设定,可以实现对输入信号的选择。下面测试代码,将sel设定为0,并设置了两个脉冲信号int1,int2通过仿真来验证数据选择功能。
代码:
%二选一数字选择器测试
`timescale 1ns/1ns
module mux2_1_tb;
reg int1,int2,sel;
wire out;
reg clock;
mux2_1 mux2_1w1(
.out(out),
.int1(int1),
.int2(int2),
.sel(sel));

	 initial
	 begin 
	     int1=0;
		  int2=0;
		  clock=0;
		  sel=0;
	end
	always#50 clock=~clock;
	always@(posedge clock)
		  begin
		   
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值