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

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

  • 相关阅读:
    POJ 2236 Wireless Network(并查集)
    POJ 2010 Moo University
    POJ 3614 Sunscreen(贪心,区间单点匹配)
    POJ 2184 Cow Exhibition(背包)
    POJ 1631 Bridging signals(LIS的等价表述)
    POJ 3181 Dollar Dayz(递推,两个long long)
    POJ 3046 Ant Counting(递推,和号优化)
    POJ 3280 Cheapest Palindrome(区间dp)
    POJ 3616 Milking Time(dp)
    POJ 2385 Apple Catching(01背包)
  • 原文地址:https://www.cnblogs.com/wen2376/p/4360428.html
Copyright © 2011-2022 走看看