北邮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
二.管脚分配
文章来源:https://www.toymoban.com/news/detail-762621.html
三.实验效果
彩虹呼吸灯。 文章来源地址https://www.toymoban.com/news/detail-762621.html
到了这里,关于北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(2)彩虹呼吸灯(bug已解决 更新至3.0)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!