zoukankan      html  css  js  c++  java
  • 在电源上叠加一个脉冲信号,模拟一个干扰信号

    原理:通过MCU控制开关K1通断,产生尖脉冲叠加到电源上,电位器对脉冲幅度、波形进

    行调节。通过按键(S1/2/3)选择输出不同频率,及占空比可调,使干扰测试更加灵活。

    这里的MCU用CPLD代替,因有现成的CPLD板子,故用的Verilog写的,代码如下:
      1 module Counter(
      2                 rst_n,
      3                 clk_in,
      4                 key_add,
      5                 key_sub,
      6                 key_mode,
      7                 oe,
      8                 clk_out
      9                 );
     10 input         clk_in;
     11 input         rst_n;
     12 input         key_add;
     13 input        key_sub;
     14 input        key_mode;
     15 output        oe;
     16 output        clk_out;
     17 
     18 parameter     T22MS = 20'd667_999;
     19 parameter     T33US = 10'd999;   //33us
     20 parameter     T11US = 9'd332;    //11us
     21 
     22 /*************************************************************/
     23 // key detect
     24 reg[2:0] key_add_clk;
     25 always @(posedge clk_in or negedge rst_n)
     26    if(!rst_n) key_add_clk <= 3'b111;
     27    else key_add_clk <= {key_mode,key_add,key_sub};
     28      
     29 reg[2:0] key_add_clk_r;
     30 always @(posedge clk_in or negedge rst_n)
     31     if(!rst_n) key_add_clk_r <= 3'b111;
     32     else key_add_clk_r <= key_add_clk;
     33       
     34 wire[2:0] key_clk_en;
     35 assign key_clk_en = key_add_clk_r & (~key_add_clk);
     36 
     37 //按键消抖
     38 reg[19:0] cnt;                                                   
     39 always @(posedge clk_in or negedge rst_n)                           
     40     if(!rst_n) cnt <= 20'd0;                                     
     41     else if(key_clk_en) cnt <= 20'd0;                                
     42     else cnt <= cnt + 1'b1;
     43                                        
     44 //每隔20ms就取按键上的值                                     
     45 reg[2:0] pin_status;                                             
     46 always @(posedge clk_in or negedge rst_n)                           
     47     if(!rst_n) pin_status <= 3'b111;                             
     48     else if(cnt == T22MS) pin_status <= {key_mode,key_add,key_sub};
     49                                                                  
     50 reg[2:0] pin_status_r;            
     51 always @(posedge clk_in or negedge rst_n)                           
     52     if(!rst_n) pin_status_r <= 3'b111;              
     53     else pin_status_r <= pin_status;    
     54                           
     55 //前20MS的值与后20MS的值                                         
     56 wire[2:0]  pin_status_ctrl;                                      
     57 assign pin_status_ctrl = pin_status_r & (~pin_status);  
     58 /*************************************************************/
     59        
     60 /*************************************************************/
     61 //mode selct  
     62 //CS = 0,regulating frequency 
     63 //CS = 1,regulating pulse 
     64 reg cs;
     65 always@(posedge clk_in or negedge rst_n)
     66     if(~rst_n)
     67         cs <= 1'b0;
     68     else if(pin_status_ctrl[2])
     69         cs <= ~cs;
     70     else 
     71         cs <= cs;
     72 /*************************************************************/
     73 
     74 /*************************************************************/
     75 //regulating frequency
     76 reg[11:0] buff;  //max = 135us
     77 always@(posedge clk_in or negedge rst_n)
     78     if(~rst_n)
     79         buff <= T11US;
     80     else if(~cs)
     81     begin
     82         if(pin_status_ctrl[1])
     83         begin
     84             if((buff < 12'd4095)&&(buff >= T11US))
     85             begin
     86                 buff <= buff + 7'd100;  //3us
     87                 if(buff >=12'd4095)
     88                     buff <= T11US;
     89             end
     90             else
     91                 buff <= T11US;
     92         end
     93         else if(pin_status_ctrl[0])
     94         begin
     95             if((buff > T11US) && (buff <=12'd4095))
     96             begin
     97                 buff <= buff - 7'd100;
     98                 if(buff <= T11US)
     99                     buff <= 12'd4095;
    100             end
    101             else 
    102                 buff <= 12'd4095;
    103         end
    104     end
    105     
    106 reg[11:0]     cnt1;
    107 reg         clk_tmp;
    108 always@(posedge clk_in or negedge rst_n)
    109     if(~rst_n)
    110         begin
    111             cnt1 <= 0;
    112             clk_tmp <= 1'b0;
    113         end
    114     else if(~cs)
    115     begin
    116         if(cnt1 == buff)
    117         begin
    118             cnt1 <= 0;
    119             clk_tmp <= ~clk_tmp;
    120         end
    121         else
    122             cnt1 <= cnt1 + 1'b1;
    123     end
    124 /*************************************************************/
    125 /*************************************************************/
    126 //regulating pulse width (duty ratio)
    127 reg[31:0] number;
    128 always@(posedge clk_in or negedge rst_n)
    129     if(~rst_n)
    130         number <= buff;//32'd10;
    131     else if(cs)
    132     begin
    133         if(number == period)
    134             number<= 32'd10;
    135         else if(pin_status_ctrl[1])
    136         begin
    137             number <= number + 4'd10;//1'b1;
    138             if(number >= period)
    139                 number <= 32'd10;
    140         end
    141         else if(pin_status_ctrl[0])
    142         begin
    143             number <= number - 4'd10;//1'b1
    144             if(number <= 32'd10)
    145                 number <= period - 1'b1;
    146         end
    147         else 
    148             number <= number;
    149     end
    150     else
    151         number <= buff;
    152         
    153 reg[31:0]     cnt2;
    154 always@(posedge clk_in or negedge rst_n)
    155     if(~rst_n)
    156         cnt2 <= 32'h0000_0000;
    157     else if(cs)
    158     begin
    159         if(cnt2 == period)
    160             cnt2 <= 32'h0000_0000;
    161         else
    162             cnt2 <= cnt2 + 1'b1;
    163     end
    164     else
    165         cnt2 <= 32'h0000_0000;
    166 
    167 reg         pwm_tmp;            
    168 always@(posedge clk_in or negedge rst_n)
    169     if(~rst_n)
    170         pwm_tmp <= 1'b0;
    171     else if(cs)
    172     begin
    173         case(cnt2)
    174         32'd0:        pwm_tmp <= 1'b1;
    175         number:        pwm_tmp <= 1'b0;
    176         period:     pwm_tmp <= 1'b1;
    177         default:    pwm_tmp <= pwm_tmp;
    178         endcase
    179     end
    180 /*************************************************************/
    181 /*************************************************************/
    182 wire[31:0]     period;
    183 assign         period = buff<<1;  //period = buff x 2
    184 assign         oe = 1'b0;
    185 assign         clk_out = cs ? pwm_tmp:clk_tmp;
    186 /*************************************************************/
    187 endmodule
    View Code

    该代码功能输出的频率可调,占空比也可调。

  • 相关阅读:
    mysql删除重复数据
    Spring缓存注解
    Spring事物不回滚
    java.net.MalformedURLException: no protocol: www.baidu.com
    shred:减少删除文件的还原度
    rm命令防止误操作
    软链接:要根据软链接来写路径
    linux与windows文本文件间的转换:针对回车换行
    cat:文本编辑工具
    算术运算;赋值
  • 原文地址:https://www.cnblogs.com/wen2376/p/4360428.html
Copyright © 2011-2022 走看看