北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(2)彩虹呼吸灯(bug已解决 更新至3.0)

北邮22信通一枚~

跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章

持续关注作者 迎接数电实验学习~

获取更多文章,请访问专栏:

北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客

目录

一.代码部分

1.1一些更新和讲解

1.2改正后的代码

二.管脚分配

三.实验效果


一.代码部分

1.1一些更新和讲解

12.03更新:

pwm......很抽象 原先版本的代码运行之后应该是亮白灯()我班大佬帮改了一下之后目前如下这个样子,,,,

逻辑都一样就是写法不同,,,不知道为啥就好使了,,,

还有佬能给解释一下不,,,

然后:借鉴的时候别忘了把我前面的注释删下去()

12.03更新2:

感谢评论区各位uu!!

明白原先是怎么错的了 例化的时候函数参数调用顺序错了

原先那么写也是可以的,,例化的时候调一下函数参数顺序就可以了

//完了C++知识是忘光了()

复制代码
//12.03更新:我班大佬帮改出来了::
//原先的这段不行 但不知道为啥不行(
//借鉴的时候别忘了把这段删下去(
/*
module pwm
(
	input [7:0] duty,
	input clk,
	output reg out
);
	reg [7:0] buffer;
	always @ (posedge clk)
		begin 
			buffer <= buffer + 1;
			if(buffer < duty)
				begin out <= 0;end
			else
				begin out <= 1;end
		end
endmodule
*/
/*
12.03更新2:
原pwm模块书写没有问题,例化的时候函数参数调用顺序出了问题
例化时应改为:pwm pwm_red(red,clk,red_buffer);
*/
// 模块定义: pwm
// 该模块实现一个简单的脉宽调制(PWM)发生器。
module pwm(out,duty,clk);
	input [7:0] duty;   // 输入,表示占空比,范围从0到255
	input clk;         // 输入,时钟信号用于同步
	output reg out;     // 输出信号,表示PWM波形
	reg [7:0] buffer;      // 8位寄存器,用于存储当前计数值

	always @ (posedge clk)
		begin 
			buffer <= buffer + 1;// 在每个时钟上升沿递增缓冲区值
			if (buffer < duty)// 将缓冲区值与占空比进行比较:如果缓冲区小于占空比,则将输出设置为0;否则,设置为1。
				begin
					out <= 0;
				end
			else
				begin
					out <= 1;
				end
		end
endmodule	

module rainbow_breathing_light
	(clk,red,green,blue);
	input clk;
	output red,green,blue;

	reg [15:0] wheel_position;
	reg [7:0] wheel_position_buffer;
	reg [7:0] red_buffer,green_buffer,blue_buffer;
	reg [31:0] divide_buffer;
	
	wire clk;
	reg divide_clk;
	
	pwm pwm_red(red,red_buffer,clk);
	pwm pwm_green(green,green_buffer,clk);
	pwm pwm_blue(blue,blue_buffer,clk);
	
	always @ (posedge clk)
		begin 
			if(divide_buffer < 50000)
				begin divide_buffer <= divide_buffer + 1;end
			else
				begin 
					divide_clk <= ~divide_clk;
					divide_buffer <= 0;
				end
		end
	always @ (posedge divide_clk)
		begin 
			if(wheel_position < 765)
				wheel_position <= wheel_position + 1;
			else
				wheel_position <= 0;
			if(wheel_position < 255)
				begin 
					red_buffer <= 255 - wheel_position;
					green_buffer <= 0;
					blue_buffer <= wheel_position;
				end
			else if(wheel_position < 510)
				begin 
					red_buffer <= 0;
					green_buffer <= wheel_position - 255;
					blue_buffer <= 255 - (wheel_position - 255);
				end
			else
				begin
					red_buffer <= wheel_position - 510;
					green_buffer <= 255 - (wheel_position - 510);
					blue_buffer <= 0;
				end
		end
endmodule

1.2改正后的代码

将模块定义(类比C++函数接口定义)中的形参顺序改动:

rainbow_breathing_light.v

复制代码
// 模块定义: pwm
// 该模块实现一个简单的脉宽调制(PWM)发生器。
module pwm(out,duty,clk);
	input [7:0] duty;   // 输入,表示占空比,范围从0到255
	input clk;         // 输入,时钟信号用于同步
	output reg out;     // 输出信号,表示PWM波形
	reg [7:0] buffer;      // 8位寄存器,用于存储当前计数值

	always @ (posedge clk)
		begin 
			buffer <= buffer + 1;// 在每个时钟上升沿递增缓冲区值
			if (buffer < duty)// 将缓冲区值与占空比进行比较:如果缓冲区小于占空比,则将输出设置为0;否则,设置为1。
				begin
					out <= 0;
				end
			else
				begin
					out <= 1;
				end
		end
endmodule	

module rainbow_breathing_light
	(clk,red,green,blue);
	input clk;
	output red,green,blue;

	reg [15:0] wheel_position;
	reg [7:0] wheel_position_buffer;
	reg [7:0] red_buffer,green_buffer,blue_buffer;
	reg [31:0] divide_buffer;
	
	wire clk;
	reg divide_clk;
	
	pwm pwm_red(red,red_buffer,clk);
	pwm pwm_green(green,green_buffer,clk);
	pwm pwm_blue(blue,blue_buffer,clk);
	
	always @ (posedge clk)
		begin 
			if(divide_buffer < 50000)
				begin divide_buffer <= divide_buffer + 1;end
			else
				begin 
					divide_clk <= ~divide_clk;
					divide_buffer <= 0;
				end
		end
	always @ (posedge divide_clk)
		begin 
			if(wheel_position < 765)
				wheel_position <= wheel_position + 1;
			else
				wheel_position <= 0;
			if(wheel_position < 255)
				begin 
					red_buffer <= 255 - wheel_position;
					green_buffer <= 0;
					blue_buffer <= wheel_position;
				end
			else if(wheel_position < 510)
				begin 
					red_buffer <= 0;
					green_buffer <= wheel_position - 255;
					blue_buffer <= 255 - (wheel_position - 255);
				end
			else
				begin
					red_buffer <= wheel_position - 510;
					green_buffer <= 255 - (wheel_position - 510);
					blue_buffer <= 0;
				end
		end
endmodule

二.管脚分配

三.实验效果

彩虹呼吸灯。

相关推荐
第二层皮-合肥1 小时前
基于FPGA的雷达信号处理设计工具包分享
fpga开发·信号处理
美好的事情总会发生2 小时前
FPGA的LVDS接口电压
嵌入式硬件·fpga开发·硬件工程·智能硬件
卡奥斯开源社区官方7 小时前
量子计算“平价革命”深度解析:AMD破局FPGA方案+中国千比特云服务,技术拐点已至?
fpga开发·量子计算
贝塔实验室9 小时前
译码器的结构
驱动开发·算法·网络安全·fpga开发·硬件工程·信息与通信·信号处理
bnsarocket1 天前
Verilog和FPGA的自学笔记9——呼吸灯
笔记·fpga开发·verilog·自学·硬件编程
国科安芯1 天前
基于AS32A601型MCU芯片的屏幕驱动IC方案的技术研究
服务器·人工智能·单片机·嵌入式硬件·fpga开发
cmc10281 天前
145.vivado采信号时ILA用一个probe要比用多个节约资源
fpga开发
白又白、1 天前
数据cdc (clock domain cross)
fpga开发
FakeOccupational2 天前
fpga系列 HDL : Microchip FPGA开发软件 Libero 中导出和导入引脚约束配置
fpga开发
贝塔实验室2 天前
LDPC 码的构造方法
算法·fpga开发·硬件工程·动态规划·信息与通信·信号处理·基带工程