线路状态:在平时不发送数据的时候,DI 为高电平。SCK为低电平。
2. 起始位:SCK 为高的时候,DI 的下降沿决定了一次数据传送的开始。也就是说,在发送数据的时候,SCK为高电平的期间,DI 不允许变化。
3. 起始位有效后,SCK的上升沿输出数据。
4. 时序图
5. 所有数据低位在前
数据为单向发送,目的是产生宽度可频率可以调节的信号。同时产生一路Pwm信号,本设计只是发送数据部分
代码:
module SetData(Rst,SCK,DI,Width,Cycle,PWM);
input SCK,DI,Rst;
output reg [7:0]Width; //脉冲宽度
output reg [23:0]Cycle; //周期
output reg [7:0] PWM; //Pwm数据
reg [7:0]Buff;
reg [7:0] Buff1;
reg [2:0]Stage; //状态变量
reg [5:0]Cnt;
reg Load;
reg INIT; //起始位标记
parameter Status0= 3'b000; //状态定义
parameter Status1= 3'b001;
parameter Status2= 3'b010;
parameter Status3= 3'b011;
parameter Status4= 3'b100;
parameter Status5= 3'b101;
parameter Status6= 3'b110;
parameter Status7= 3'b111;
always @(negedge Rst,negedge SCK) //产生串并转换完成信号(8bit)
begin
if(!Rst) Load<=0;
else if ((!SCK)&&(Cnt==8))
Load<=1;
else Load<=0;
end
always @(negedge DI) //检测起始位
begin
if(SCK==1)INIT<=0; //标记到init 中
else INIT<=1;
end
always @(negedge Rst,posedge SCK,negedge INIT) //状态转换
begin
if ((Rst==0) || (INIT==0)) //强制到状态0
begin
Stage<=Status0;
Buff<=0;
end
else if ((SCK==1)&&(Stage==Status0)) begin Stage<=Status1;Cnt<=0; end
else if ((SCK==1)&&(Stage!=Status0))
begin