电子商务网站规划建设方案,网络建设方式,龙岩市网站建设,名城苏州文章目录 一、WS2812C-2020-V11、产品概述2、引出端排列及功能3、数据传输时间4、数据传输方法 二、使用WS2812C显示图片1、静态显示2、动态显示 一、WS2812C-2020-V1
1、产品概述
WS2812C-2020-V1是一个集控制电路与发光电路于一体的智能外控LED光源#xff1b;其外型采用最… 文章目录 一、WS2812C-2020-V11、产品概述2、引出端排列及功能3、数据传输时间4、数据传输方法 二、使用WS2812C显示图片1、静态显示2、动态显示 一、WS2812C-2020-V1
1、产品概述
WS2812C-2020-V1是一个集控制电路与发光电路于一体的智能外控LED光源其外型采用最新的molding封 装工艺将IC与发光芯片封装在一个2020的封装尺寸中每个元件即为一个像素点像素点内部包含了智能数字 接口数据锁存信号整形放大驱动电路还包含有高精度的内部振荡器和可编程定电流控制部分有效保证了像素 点光的颜色高度一致。
主要特点 ● IC控制电路与LED点光源共用一个电源。 ● 每个通道工作电流5mA. ● 控制电路与RGB芯片集成在一个2020封装的元器件中构成一个完整的外控像素点。 ● 内置信号整形电路任何一个像素点收到信号后经过波形整形再输出保证线路波形畸变不会累加。 ● 内置上电复位和掉电复位电路。 ● 每个像素点的三基色颜色可实现256级亮度显示完成16777216种颜色的全真色彩显示。 ● 端口扫描频率2KHz/s。 ● 串行级联接口能通过一根信号线完成数据的接收与解码。 ● 任意两点传输距离在不超过5米时无需增加任何电路。 ● 当刷新速率30帧/秒时级联数不小于1024点。 ● 数据发送速度可达800Kbps。 ● 光的颜色高度一致性价比高。
2、引出端排列及功能 序号符号管脚名功能描述1DO数据输出控制数据信号输出2GND地信号接地和电源接地3DI数据输入控制数据信号输入4VDD电源供电管脚
3、数据传输时间 时序波形图
4、数据传输方法 注其中 D1 为 MCU 端发送的数据D2、D3、D4 为级联电路自动整形转发的数据。 24bit 数据结
二、使用WS2812C显示图片
1、静态显示
显示F为例 首先将图片信息存入rom中通过读出rom中的数据将数据中的值通过高低电平的脉宽调制显示至WS2812C上。 显示模块
module ws2812b_driver (input wire clk ,input wire rst_n ,input wire [23:0] data_in ,//输入的RGBinput wire data_vld ,output wire ready ,output wire pwm //输出波形
);localparam IDLE 3b001,RST 3b010,DATA 3b100;localparam T0H 300/20,T0L 900/20,T1H 600/20,T1L 600/20;parameter MAX_RES 15d20_000;reg [2:0] state_c;//现态
reg [2:0] state_n;//次态wire idle_rst ;//IDLE - RST
wire rst_data ;//RST - DATA
wire data_idle ;//DATA - IDLEwire [23:0] fifo_wr_data;
wire [23:0] fifo_rd_data;
wire fifo_wr_req;
wire fifo_rd_req;
wire fifo_empty;
wire fifo_full;reg [14:0] cnt_res ;
wire add_cnt_res ;
wire end_cnt_res ;reg [5:0] cnt_time ;
wire add_cnt_time ;
wire end_cnt_time ;reg [4:0] cnt_bit ;
wire add_cnt_bit ;
wire end_cnt_bit ;reg [6:0] cnt_num ;
wire add_cnt_num ;
wire end_cnt_num ;reg pwm_r;//****************************************************************
//-- 状态机
//****************************************************************
always (posedge clk or negedge rst_n) beginif(!rst_n) beginstate_c IDLE;endelse beginstate_c state_n ;end
endalways ( *) begincase (state_c) IDLE : beginif(idle_rst) beginstate_n RST;endelse beginstate_n state_c;endendRST : beginif(rst_data) beginstate_n DATA;endelse beginstate_n state_c;endendDATA : beginif(data_idle) beginstate_n IDLE;endelse beginstate_n state_c;endendendcase
endassign idle_rst state_c IDLE data_vld;
assign rst_data state_c RST end_cnt_res;
assign data_idle state_c DATA end_cnt_num;//****************************************************************
//--fifo
//****************************************************************
fifo fifo_inst (.aclr ( ~rst_n ),.clock ( clk ),.data ( fifo_wr_data ),//GRB.rdreq ( fifo_rd_req ),.wrreq ( fifo_wr_req ),//GRB.empty ( fifo_empty ),.full ( fifo_full ),.q ( fifo_rd_data ),.usedw ( ));assign fifo_wr_data {data_in[15:8],data_in[23:16],data_in[7:0]};
assign fifo_wr_req data_vld ~fifo_full;assign fifo_rd_req end_cnt_bit ~fifo_empty;
//****************************************************************
//-- 复位时间
//****************************************************************always (posedge clk or negedge rst_n)begin if(!rst_n)begincnt_res d0;end else if(add_cnt_res)begin if(end_cnt_res)begin cnt_res d0;endelse begin cnt_res cnt_res 1b1;end end
end assign add_cnt_res state_c RST;
assign end_cnt_res add_cnt_res cnt_res MAX_RES - 1;//****************************************************************
//-- 数据传输时间
//****************************************************************always (posedge clk or negedge rst_n)begin if(!rst_n)begincnt_time d0;end else if(add_cnt_time)begin if(end_cnt_time)begin cnt_time d0;endelse begin cnt_time cnt_time 1b1;end end
end assign add_cnt_time state_c DATA;
assign end_cnt_time add_cnt_time cnt_time 1200/20 - 1;always (posedge clk or negedge rst_n)begin if(!rst_n)begincnt_bit d0;end else if(add_cnt_bit)begin if(end_cnt_bit)begin cnt_bit d0;endelse begin cnt_bit cnt_bit 1b1;end end
end assign add_cnt_bit end_cnt_time;
assign end_cnt_bit add_cnt_bit cnt_bit 24 - 1;always (posedge clk or negedge rst_n)begin if(!rst_n)begincnt_num d0;end else if(add_cnt_num)begin if(end_cnt_num)begin cnt_num d0;endelse begin cnt_num cnt_num 1b1;end end
end assign add_cnt_num end_cnt_bit;
assign end_cnt_num add_cnt_num cnt_num 64 - 1;//****************************************************************
//-- pwm输出
//****************************************************************
always (posedge clk or negedge rst_n) beginif(!rst_n) beginpwm_r 0;endelse begincase (state_c)IDLE : beginpwm_r 0;endRST : beginpwm_r 0;endDATA : beginif(fifo_rd_data[23-cnt_bit] 0) beginif(cnt_time T0H)beginpwm_r 1;endelse beginpwm_r 0;endendelse if(fifo_rd_data[23-cnt_bit] 1) beginif(cnt_time T1H)beginpwm_r 1;endelse beginpwm_r 0;endendenddefault : pwm_r 0;endcaseend
endassign pwm pwm_r;
assign ready state_c IDLE;endmodule //led_control数据控制模块
/** Description: 显示图片* Author: Fu Yu* Date: 2023-08-14 10:04:45* LastEditTime: 2023-08-14 15:32:59* LastEditors: Fu Yu*/module ws2812_control(input clk ,input rst_n ,output [23:0] pix_data ,output pix_data_vld ,input ready //可以接收图像数据了
);parameter IDLE 0,DATA 1,DONE 2;reg [2:0] state ;reg [5:0] cnt_x;wire add_x_cnt,end_x_cnt; reg [4:0] cnt_y;wire add_y_cnt,end_y_cnt; localparam RED 24hFF0000, //红色ORANGE 24hFF8000, //橙色YELLOW 24hFFFF00, //黄色GREEN 24h00FF00, //绿色CYAN 24h00FFFF, //青色BLUE 24h0000FF, //蓝色PURPPLE 24h8000FF, //紫色BLACK 24h000000, //黑色WHITE 24hFFFFFF, //白色GRAY 24hC0C0C0; //灰色wire rom_rd_req ;
wire rom_rd_data_vld ;
reg rom_rd_req1 ;
reg rom_rd_req2 ;
/**************************************************************状态机
**************************************************************/always(posedge clk or negedge rst_n)if(!rst_n)state IDLE;else case(state)IDLE : if(ready)state DATA;DATA : if(end_y_cnt)state DONE;default : state IDLE;endcase/**************************************************************图像数据个数计数器
**************************************************************/ always(posedge clk or negedge rst_n) if(!rst_n) cnt_x d0; else if(add_x_cnt) begin if(end_x_cnt) cnt_x d0; else cnt_x cnt_x 1b1; end assign add_x_cnt state DATA;assign end_x_cnt add_x_cnt cnt_x 8 - 1;always(posedge clk or negedge rst_n) if(!rst_n) cnt_y d0; else if(add_y_cnt) begin if(end_y_cnt) cnt_y d0; else cnt_y cnt_y 1b1; end assign add_y_cnt end_x_cnt;assign end_y_cnt add_y_cnt cnt_y 8 - 1;// assign pix_data_vld add_x_cnt;// always(*)// case(cnt_y)// 0 : pix_data RED ;// 1 : pix_data ORANGE ;// 2 : pix_data YELLOW ;// 3 : pix_data GREEN ;// 4 : pix_data CYAN ;// 5 : pix_data BLUE ;// 6 : pix_data PURPPLE ;// 7 : pix_data GRAY ;// default : pix_data RED ;// endcaserom rom_inst (.aclr ( ~rst_n ),.address ( cnt_x cnt_y*8 ),.clock ( clk ),.rden ( rom_rd_req),.q ( pix_data));assign rom_rd_req state DATA;always (posedge clk or negedge rst_n) beginif(!rst_n) beginrom_rd_req1 0 ;rom_rd_req2 0 ;endelse beginrom_rd_req1 rom_rd_req ;rom_rd_req2 rom_rd_req1 ;end
endassign pix_data_vld rom_rd_req2;endmodule
2、动态显示
动态显示图片时只需要改变数据控制模块以及所需要显示的数据图片
/** Description: 动态显示图片* Author: Fu Yu* Date: 2023-08-14 15:34:55* LastEditTime: 2023-08-14 17:21:36* LastEditors: Fu Yu*/module ws2812_control_dynamic(input clk ,input rst_n ,output [23:0] pix_data ,output pix_data_vld ,input ready //可以接收图像数据了
);parameter IDLE 0 ,DATA 1 ,DELAY 2 ,DONE 3 ;reg [2:0] state ;reg [5:0] cnt_x;wire add_x_cnt,end_x_cnt; reg [4:0] cnt_y;wire add_y_cnt,end_y_cnt; reg [24:0] cnt_500ms ;
wire add_cnt_500ms ;
wire end_cnt_500ms ;parameter MAX_500MS 25d24_999_999;reg [5:0] cnt_offest ;
wire add_cnt_offest ;
wire end_cnt_offest ;wire [4:0] real_row;//0~31wire rom_rd_req ;
wire rom_rd_data_vld ;
reg rom_rd_req1 ;
reg rom_rd_req2 ;
/**************************************************************状态机
**************************************************************/always(posedge clk or negedge rst_n)if(!rst_n)state IDLE;else case(state)IDLE : if(ready)state DATA;DATA : if(end_y_cnt)state DELAY;DELAY : if(end_cnt_500ms)state IDLE;default : state IDLE;endcase//****************************************************************
//--500ms
//****************************************************************always (posedge clk or negedge rst_n)begin if(!rst_n)begincnt_500ms d0;end else if(add_cnt_500ms)begin if(end_cnt_500ms)begin cnt_500ms d0;endelse begin cnt_500ms cnt_500ms 1b1;end end
end assign add_cnt_500ms state DELAY;
assign end_cnt_500ms add_cnt_500ms cnt_500ms MAX_500MS;/**************************************************************图像数据个数计数器
**************************************************************/ always(posedge clk or negedge rst_n) if(!rst_n) cnt_x d0; else if(add_x_cnt) begin if(end_x_cnt) cnt_x d0; else cnt_x cnt_x 1b1; end assign add_x_cnt state DATA;assign end_x_cnt add_x_cnt cnt_x 8 - 1;always(posedge clk or negedge rst_n) if(!rst_n) cnt_y d0; else if(add_y_cnt) begin if(end_y_cnt) cnt_y d0; else cnt_y cnt_y 1b1; end assign add_y_cnt end_x_cnt;assign end_y_cnt add_y_cnt cnt_y 8 - 1;//****************************************************************
//--帧偏移
//****************************************************************always (posedge clk or negedge rst_n)begin if(!rst_n)begincnt_offest d0;end else if(add_cnt_offest)begin if(end_cnt_offest)begin cnt_offest d0;endelse begin cnt_offest cnt_offest 1b1;end end
end assign add_cnt_offest end_cnt_500ms;
assign end_cnt_offest add_cnt_offest cnt_offest 32 - 1;assign real_row cnt_x cnt_offest;rom2 rom2_inst (.aclr ( ~rst_n ),.address ( real_row cnt_y*32 ),.clock ( clk ),.rden ( rom_rd_req),.q ( pix_data));assign rom_rd_req state DATA;always (posedge clk or negedge rst_n) beginif(!rst_n) beginrom_rd_req1 0 ;rom_rd_req2 0 ;endelse beginrom_rd_req1 rom_rd_req ;rom_rd_req2 rom_rd_req1 ;end
endassign pix_data_vld rom_rd_req2;endmodule