zoukankan      html  css  js  c++  java
  • Verilog之SOS信号-仿顺序操作

    SOS信号:. . . _ _ _ . . . 

    1.

    module sos_module                    
    (                    
         CLK, RSTn, Pin_Out, SOS_En_Sig                    
    );                    
                        
        input CLK;                    
         input RSTn;                
         input SOS_En_Sig;                
         output Pin_Out;                
                         
         /****************************************/                
                         
         parameter T1MS = 16'd49_999;//DB4CE15开发板使用的晶振为50MHz,50M*0.001-1=49_999                
                         
         /***************************************/                
                         
         reg [15:0]Count1;                
                        
         always @ ( posedge CLK or negedge RSTn )                
             if( !RSTn )                
                  Count1 <= 16'd0;            
              else if( isCount && Count1 == T1MS )            
                  Count1 <= 16'd0;            
              else if( isCount )            
                  Count1 <= Count1 + 1'b1;            
              else if( !isCount )            
                  Count1 <= 16'd0;            
                        
        /****************************************/                    
                        
        reg [9:0]Count_MS;                    
                            
         always @ ( posedge CLK or negedge RSTn )                
            if( !RSTn )                    
                  Count_MS <= 10'd0;            
              else if( isCount && Count1 == T1MS )            
                  Count_MS <= Count_MS + 1'b1;            
              else if( !isCount )            
                  Count_MS <= 10'd0;            
                        
        /******************************************/                
                        
        reg isCount;                
        reg rPin_Out;                
        reg [4:0]i;                
                        
        always @ ( posedge CLK or negedge RSTn )                
            if( !RSTn )                
                 begin            
                     isCount <= 1'b0;            
                        rPin_Out <= 1'b0;
                        i <= 5'd0;
                  end        
             else             
                case( i )                
                          
                    5'd0 :         
                        if( SOS_En_Sig ) i <= 5'd1;
                        
                        5'd1, 5'd3, 5'd5, 
                        5'd13, 5'd15, 5'd17 :  
                        if( Count_MS == 10'd100 ) begin isCount <= 1'b0; rPin_Out <= 1'b0; i <= i + 1'b1; end // short
                        else begin isCount <= 1'b1; rPin_Out <= 1'b1; end
                        
                        5'd7, 5'd9, 5'd11 :
                        if( Count_MS == 10'd300 ) begin isCount <= 1'b0; rPin_Out <= 1'b0; i <= i + 1'b1; end // long
                        else begin isCount <= 1'b1; rPin_Out <= 1'b1; end
                        
                        5'd2, 5'd4, 5'd6,  
                        5'd8, 5'd10, 5'd12,
                        5'd14, 5'd16, 5'd18 :
                        if( Count_MS == 10'd50 ) begin isCount <= 1'b0; i <= i + 1'b1; end// interval
                        else isCount <= 1'b1;
                        
                        5'd19 :
                        begin rPin_Out <= 1'b0; i <= 5'd0; end  // end
                        
                  endcase        
                          
        /***************************************************/                    
                         
         assign Pin_Out = rPin_Out;                
                         
         /***************************************************/                
                        
                          
    endmodule                    

    2.

    “Start_Sig”如同 C 语言中的调用指令,“Done_Sig”如同 C 语言的返回指令。这两个信号的存在就是为了控制模块的调用。

    module sos_control_module                    
    (                    
        CLK, RSTn,                    
         Start_Sig,                
         S_Done_Sig, O_Done_Sig,                
         S_Start_Sig, O_Start_Sig,                
         Done_Sig                
    );                    
                        
        input CLK;                    
         input RSTn;                
         input Start_Sig;                
         input S_Done_Sig, O_Done_Sig;                
         output S_Start_Sig, O_Start_Sig;                
         output Done_Sig;                
                         
         /*************************************/                
                         
         reg [3:0]i;                
         reg isO;                
         reg isS;                
         reg isDone;                
                         
         always @ ( posedge CLK or negedge RSTn )                
            if( !RSTn )                    
                  begin            
                      i <= 4'd0;            
                         isO <= 1'b0;
                         isS <= 1'b0;
                         isDone <= 1'b0;
                   end        
              else if( Start_Sig )            
                  case( i )            
                            
                         4'd0:
                         if( S_Done_Sig ) begin isS <= 1'b0; i <= i + 1'b1; end
                         else isS <= 1'b1;
                         
                         4'd1:
                         if( O_Done_Sig ) begin isO <= 1'b0; i <= i + 1'b1; end
                         else isO <= 1'b1;
                         
                         4'd2:
                         if( S_Done_Sig ) begin isS <= 1'b0; i <= i + 1'b1; end
                         else isS <= 1'b1;
                         
                         4'd3:
                    begin isDone <= 1'b1; i <= 4'd4; end                    
                         
                         4'd4:
                         begin isDone <= 1'b0; i <= 4'd0; end
                          
                    endcase    
                        
        /*****************************************/                    
                        
        assign S_Start_Sig = isS;                    
        assign O_Start_Sig = isO;                    
        assign Done_Sig = isDone;                     
                         
         /*****************************************/                
                         
    endmodule                    
    module s_module                    
    (                    
        CLK, RSTn,                    
         Start_Sig,                
         Done_Sig,                
         Pin_Out                
    );                    
                        
         input CLK;                    
          input RSTn;                
          input Start_Sig;                
          output Done_Sig;                
          output Pin_Out;                
                          
          /****************************************/                
                         
         parameter T1MS = 16'd49_999;                
                         
         /***************************************/                
                         
         reg [15:0]Count1;                
                        
         always @ ( posedge CLK or negedge RSTn )                
             if( !RSTn )                
                  Count1 <= 16'd0;            
              else if( Count1 == T1MS )            
                  Count1 <= 16'd0;            
              else if( isCount )            
                  Count1 <= Count1 + 1'b1;            
              else if( !isCount )            
                  Count1 <= 16'd0;            
                        
        /****************************************/                    
                        
        reg [9:0]Count_MS;                    
                            
         always @ ( posedge CLK or negedge RSTn )                
            if( !RSTn )                    
                  Count_MS <= 10'd0;            
              else if( Count_MS == rTimes )            
                  Count_MS <= 10'd0;            
              else if( Count1 == T1MS )            
                  Count_MS <= Count_MS + 1'b1;            
                        
        /******************************************/                
                        
        reg [3:0]i;                
        reg rPin_Out;                
        reg [9:0]rTimes;                
        reg isCount;                
        reg isDone;                
                        
        always @ ( posedge CLK or negedge RSTn )                
            if( !RSTn )                
                 begin             
                      i <= 4'd0;        
                     rPin_Out <= 1'b0;            
                        rTimes <= 10'd1000;
                       isCount <= 1'b0;    
                       isDone <= 1'b0;    
                  end        
             else if( Start_Sig )            
                 case( i )            
                          
                      4'd0, 4'd2, 4'd4:        
                      if( Count_MS == rTimes ) begin rPin_Out <= 1'b0; isCount <= 1'b0; i <= i + 1'b1; end        
                       else begin isCount <= 1'b1; rPin_Out <= 1'b1; rTimes <= 10'd100; end    
                        
                        4'd1, 4'd3, 4'd5:
                        if( Count_MS == rTimes ) begin isCount <= 1'b0; i <= i + 1'b1; end
                        else  begin isCount <= 1'b1; rTimes <= 10'd50; end
                        
                        4'd6:
                        begin isDone <= 1'b1; i <= 4'd7; end
                        
                        4'd7:
                        begin isDone <= 1'b0; i <= 4'd0; end
                        
                  endcase        
                        
        /******************************************/                
                        
        assign Done_Sig = isDone;                
        assign Pin_Out = !rPin_Out;                
                        
        /******************************************/                
                        
    endmodule                    
    module o_module                    
    (                    
        CLK, RSTn,                    
         Start_Sig,                
         Done_Sig,                
         Pin_Out                
    );                    
                        
         input CLK;                    
          input RSTn;                
          input Start_Sig;                
          output Done_Sig;                
          output Pin_Out;                
                          
          /****************************************/                
                         
         parameter T1MS = 17'd49_999;                
                         
         /***************************************/                
                         
         reg [16:0]Count1;                
                        
         always @ ( posedge CLK or negedge RSTn )                
             if( !RSTn )                
                  Count1 <= 17'd0;            
              else if( Count1 == T1MS )            
                  Count1 <= 17'd0;            
              else if( isCount )            
                  Count1 <= Count1 + 1'b1;            
              else if( !isCount )            
                  Count1 <= 17'd0;            
                        
        /****************************************/                    
                        
        reg [9:0]Count_MS;                    
                            
         always @ ( posedge CLK or negedge RSTn )                
            if( !RSTn )                    
                  Count_MS <= 10'd0;            
              else if( Count_MS == rTimes )            
                  Count_MS <= 10'd0;            
              else if( Count1 == T1MS )            
                  Count_MS <= Count_MS + 1'b1;            
                        
        /******************************************/                
                        
        reg [3:0]i;                
        reg rPin_Out;                
        reg [9:0]rTimes;                
        reg isCount;                
        reg isDone;                
                        
        always @ ( posedge CLK or negedge RSTn )                
            if( !RSTn )                
                 begin             
                      i <= 4'd0;        
                     rPin_Out <= 1'b0;            
                        rTimes <= 10'd1000;
                       isCount <= 1'b0;    
                       isDone <= 1'b0;    
                  end        
             else if( Start_Sig )            
                 case( i )            
                          
                      4'd0, 4'd2, 4'd4:        
                      if( Count_MS == rTimes ) begin rPin_Out <= 1'b0; isCount <= 1'b0; i <= i + 1'b1; end        
                       else begin isCount <= 1'b1; rPin_Out <= 1'b1; rTimes <= 10'd400; end    
                        
                        4'd1, 4'd3, 4'd5:
                        if( Count_MS == rTimes ) begin isCount <= 1'b0; i <= i + 1'b1; end
                        else  begin isCount <= 1'b1; rTimes <= 10'd50; end
                        
                        4'd6:
                        begin isDone <= 1'b1; i <= 4'd7; end
                        
                        4'd7:
                        begin isDone <= 1'b0; i <= 4'd0; end
                        
                  endcase        
                        
        /******************************************/                
                        
        assign Done_Sig = isDone;                
        assign Pin_Out = !rPin_Out;                
                        
        /******************************************/                
                        
    endmodule                    
    module sos_module        
    (        
        CLK, RSTn,        
        Start_Sig,        
         Done_Sig,    
         Pin_Out    
    );        
            
        input CLK;        
         input RSTn;    
         input Start_Sig;    
         output Done_Sig;    
         output Pin_Out;    
             
         /*****************************/    
             
         wire S_Done_Sig;    
         wire S_Pin_Out;    
             
         s_module U1    
         (    
             .CLK( CLK ),    
              .RSTn( RSTn ),
              .Start_Sig( S_Start_Sig ),  // input - from U3
              .Done_Sig( S_Done_Sig ),    // output - to U3
              .Pin_Out( S_Pin_Out )       // output - to selector
              
          ) ;    
             
         /*********************************/    
             
         wire O_Done_Sig;    
         wire O_Pin_Out;    
             
         o_module U2    
         (    
             .CLK( CLK ),    
              .RSTn( RSTn ),
              .Start_Sig( O_Start_Sig ),  // input - from U3
              .Done_Sig( O_Done_Sig ),    // output - to U3
              .Pin_Out( O_Pin_Out )       // output - to selector
         );    
             
         /*********************************/    
             
         wire S_Start_Sig;    
         wire O_Start_Sig;    
             
         sos_control_module U3    
         (    
             .CLK( CLK ),    
              .RSTn( RSTn ),
              .Start_Sig( Start_Sig ),      // input - from top
              .S_Done_Sig( S_Done_Sig ),    // input - from U1
              .O_Done_Sig( O_Done_Sig ),    // input - from U2
              .S_Start_Sig( S_Start_Sig ),  // output - to U1
              .O_Start_Sig( O_Start_Sig ),  // output - to U2
              .Done_Sig( Done_Sig )         // output - to top
         );    
             
         /*********************************/    
             
         //selector    
             
         reg Pin_Out;    
             
         always @ ( * )    
             if( S_Start_Sig ) Pin_Out = S_Pin_Out;      // select from U1    
              else if( O_Start_Sig ) Pin_Out = O_Pin_Out;  // select from U2
              else Pin_Out = 1'bx; 
              
        /*********************************/        
            
    endmodule        

  • 相关阅读:
    Jetbrains IDE 中 compass sass 设置
    std::shared_ptr<void>的工作原理
    分辨率、DPI、PPI和屏幕尺寸,你都知道是啥么?
    《富爸爸,穷爸爸》阅读笔记
    [LeetCode] Interleaving String
    一致性哈希学习
    《精通正则表达式》笔记 --- “验证”Email格式
    字符串匹配算法
    [奇淫怪巧] 利用正则表达式判断素数
    《精通正则表达式》笔记 --- 选择引号内的文字
  • 原文地址:https://www.cnblogs.com/shaogang/p/4123489.html
Copyright © 2011-2022 走看看