×
接口总线驱动 > 总线 > 详情

一个简单串行总线方案的veilog语言实现

发布时间:2020-05-25 发布时间:
|
1.    线路状态:在平时不发送数据的时候,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
       Buff<={DI,Buff[7:1]};
       Cnt <= Cnt+1;
       if (Cnt==8)
          begin
               Cnt<=1;
               Stage<=Stage+1;
               if (Stage==Status7) Stage<=Status0;
             
          end
     
      end    
   end  
  always @(posedge Load,negedge INIT)   //组合出需要的数据
    begin
       if (INIT==0)                     //如果是起始位,所有数据清零 
        begin Width <=0;Cycle<=0; PWM<=0; end
       else
       //begin
      case(Stage)                        //不同状态下的数据输出
        //Status0:                   
        Status1: Width<=Buff;            //脉宽数据
        Status2: Cycle<={ Cycle[23:8],Buff};  //周期数据
        Status3: Cycle<={ Cycle[23:16],Buff,Cycle[7:0]};
        Status4: Cycle<={ Buff,Cycle[15:8],Cycle[7:0]};
        Status5: PWM<=Buff;   //PWM 数据
     endcase
   // end 
    end
  endmodule   

仿真结果



注意图中认为中断了数据发送(通过设置起始位来实现)。

   初学verilog语言,用的可能不够规范,主要是不习惯不能在不同进程里对同一个变量赋值的约束,只好加一个init变量进行信号传递。 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PROFIBUS总线介绍及网络