设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 203|回复: 1
收起左侧

Quartus Verilog HDL/FPGA 状态机实现驱动一颗 WS2812B 全彩RGB LED灯 并演示颜色渐变

[复制链接]
发表于 2023-4-1 15:13:31 | 显示全部楼层 |阅读模式
本帖最后由 HDL 于 2023-4-1 15:19 编辑

main.png
  1. module ws2812b(                        //WS2812B全彩RGB LED灯驱动模块 (此模块只能驱动1颗,不支持级联)
  2.         input clk,                                //50Mhz 时钟输入
  3.         input [7:0] red,                //[8位宽]红色值:0~255
  4.         input [7:0] green,        //[8位宽]绿色值:0~255
  5.         input [7:0] blue,                //[8位宽]蓝色值:0~255
  6.         output reg dout                //接ws2812b的din
  7. );
  8. initial dout = 1'b0;
  9. wire [0:23] rgb = {green,red,blue};
  10. reg [0:23] old = 24'd0;
  11. reg [11:0] delay = 12'd0;
  12. reg [1:0] state = 2'd0;
  13. reg [4:0] i = 5'b0;
  14. reg run = 1'b0;
  15. always @(posedge clk) begin
  16.         old <= rgb;
  17.         if(rgb != old) begin
  18.                 run <= 1'b1;
  19.         end
  20.         if(run) begin
  21.                 if(|delay) begin                                //有延时
  22.                         delay <= delay - 12'd1;
  23.                 end else begin                //没有延时
  24.                         case(state)
  25.                                 2'd0:begin                        //高电平时间
  26.                                         dout <= 1'b1;
  27.                                         delay <= rgb[i] ? 12'd43 : 12'd20;
  28.                                         state <= 2'd1;
  29.                                 end
  30.                                 2'd1:begin                        //低电平时间
  31.                                         dout <= 1'b0;
  32.                                         delay <= rgb[i] ? 12'd20 : 12'd43;
  33.                                         i = i + 5'd1;
  34.                                         if(i >= 24) begin
  35.                                                 i = 0;
  36.                                                 state <= 2'd2;
  37.                                         end else begin
  38.                                                 state <= 2'd0;
  39.                                         end
  40.                                 end
  41.                                 2'd2:begin                        //帧复位信号
  42.                                         dout <= 1'b0;
  43.                                         delay <= 12'd2500;                //延时50us
  44.                                         state <= 2'd3;
  45.                                 end
  46.                                 default:begin
  47.                                         run <= 1'b0;
  48.                                         state <= 2'd0;
  49.                                 end
  50.                         endcase
  51.                
  52.                 end
  53.         end
  54. end
  55. endmodule

  56. module main(
  57.         input clk,                        //50Mhz Pin17
  58.         output dout                        //接WS2812B的din Pin40
  59. );
  60. reg [8:0] i = 9'd0;
  61. wire [8:0] j = i + 9'd170;
  62. wire [8:0] k = i + 9'd340;

  63. ws2812b ws2812b(
  64.         .clk(clk),
  65.         .red((i < 256) ? i : 255 - i),
  66.         .green((j < 256) ? j : 255 - j),
  67.         .blue((k < 256) ? k : 255 - k),
  68.         .dout(dout)

  69. );
  70. integer t=0;
  71. always @(posedge clk) begin
  72.         t = t + 1;
  73.         if(t >= 781250) begin
  74.                 t = 0;
  75.                 i <= i + 9'd1;
  76.         end
  77. end
  78. endmodule
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-3-29 19:41 , Processed in 0.434025 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表