• 郁闷了两个钟的蜂鸣器代码!

  • 2010-09-06 16:59:56 发表
  • 标签:

今天下午改了艾米的led闪烁的代码,下载到板子上。
想实现蜂鸣器响一秒,不响一秒的效果。
改了led寄存器
改了输出管脚(接在蜂鸣器上)

但是蜂鸣器没有实现蜂鸣器响一秒,不响一秒的效果。
而是响的时间相当短暂,不响的时间倒是有一秒!一直很不解!
不是每一秒信号翻转一次吗?

后来才发现原来蜂鸣器一直给1,一直给0,都是不响的!
是需要PWM来让它响的!
所以不能简单的拿LED闪烁的代码来驱动蜂鸣器!这样是不行的!

以下第一段代码是艾米LED闪烁的代码
第二段是Backkom写的,响一秒,不响一秒的代码!(还在理解中)奉上!!

第一段:
module led1 (clk ,led_show);    // 模块名及端口参数
input clk;                // 输入端口定义
output led_show;//[7:0]led;        // 输出端口定义

reg led = 1'b0 ;          // 输出端口定义为寄存器型
reg [25:0] buffer;       // 中间变量buffer定义为寄存器型

always@(posedge clk)  
     begin             // 顺序语句,到end止
           buffer<=buffer+1'b1; // 计数器buffer按位加1
          if(buffer==26'd25000000) //判别buffer中的数值为25000000时,
         begin                  //做输出处理
                 led <= 1'b1;
          end
          else if(buffer==26'd50000000)
                                begin
                                                led <=1'b0;
                                                buffer<=0;
                                        end
                                       
       end

assign  led_show = led;      
endmodule


第二段:
module led1 (clk ,led_show);   
input clk;            
output led_show;

reg led, led1;         
reg [25:0] buffer, buffer1;     

always@(posedge clk)  
      begin      
           if(buffer<=26'd25000000)  led<= led1 ;
           else  led<= 1'b0 ;

       end
      

always@(posedge clk)  
      begin         
           buffer1<=buffer1+1'b1;
           if(buffer1==26'd25000)  begin led1 <= !led1 ; buffer1 <= 26'b0; end

       end


always@(posedge clk)  
      begin         
           if(buffer<=26'd50000000)  buffer<=buffer+1'b1;

           else buffer <= 26'b0;
       end


assign  led_show = led;      
endmodule