微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > Verilog HDL输出PWM的疑问

Verilog HDL输出PWM的疑问

时间:10-02 整理:3721RD 点击:
我想要的过程是,刚开始输出输入时钟clk经2的16次方分频的占空比为50%的方波,然后用in[0]的上升沿增大占空比,用in[1]的上升沿减少占空比。即检测到in上升沿才变化。但是仿真时,发现pwm_count的值不正常。

  1. module PWM(clk,in,out);
  2. input clk;
  3. input [1:0]in;
  4. output out;

  5. reg [15:0] count;
  6. reg [15:0] pwm_count;
  7. reg pwm_flag;

  8. initial pwm_count = 16'h8000;

  9. always @(posedge clk)
  10.     begin
  11.         count = count + 1'b1;
  12.         if (count < pwm_count)
  13.             pwm_flag = 0;
  14.         else
  15.             pwm_flag = 1;
  16.     end

  17. always @(posedge in[0] or posedge in[1])
  18. begin
  19.     if (in[0])
  20.          pwm_count = (pwm_count + 1'b1);

  21.     else if (in[1])
  22.          pwm_count = (pwm_count - 1'b1);
  23.     else
  24.          pwm_count = pwm_count;
  25. end

  26. assign out = pwm_flag;

  27. endmodule

复制代码


把上面的always @(posedge in[0] or posedge in[1])
改为


  1. always @(posedge in[0])
  2.       begin
  3.             if (in[0])
  4.                  pwm_count = (pwm_count + 1'b1);
  5.             else
  6.                  pwm_count = pwm_count;
  7.      end

复制代码


pwm_count就会在in[0]的每个上升沿加1。请问这是为什么呢?刚学Verilog HDL不久,请教各位大侠!谢谢!

你後一段代碼的意思是:
只要in(0)為1的時候,PWM_count都會加1,而且條件是in(0)為上升沿。
所以仿真的結果是正確的
只是不知道你想要做什麼?

我是想实现在in[0]的上升沿时对pwm_count加1,在in[1]的上升沿时对pwm_count减1(这两个操作都只在上升沿才动作,而不管高电平保持的时间长短)从而控制out输出方波的占空比大小。但是我用第一段代码时,pwm_count不能正常加减,请问是不是这段代码有什么问题么?我老是想不通...
always @(posedge in[0] or posedge in[1])
begin
    if (in[0])
         pwm_count = (pwm_count + 1'b1);
    else if (in[1])
         pwm_count = (pwm_count - 1'b1);
    else
         pwm_count = pwm_count;
end

reg [1:0] in_reg;
        always @(posedge clk)
                begin
                        in_reg <= in;
                        if (in[0] && !in_reg[0])
                                begin
                                        pwm_count = (pwm_count + 1'b1);
                                end
                        else
                                begin
                                        if (in[1] && !in_reg[1])
                                                begin
                                                        pwm_count = (pwm_count - 1'b1);
                                                end
                                        else
                                                begin
                                                        pwm_count = pwm_count;
                                                end
                                end
                end
换成这样试一下

你这样写显然有问题。
你期待的是in[1]的上升沿,占空比变小是吧?
那你想想看,如果in[0]为1的时候,来了in[1]的上升沿,
你的else if (in[1])语句能执行到吗?

简单的问题...
你这段代码
always @(posedge in[0])
      begin
            if (in[0])
                 pwm_count = (pwm_count + 1'b1);
            else
                 pwm_count = pwm_count;
     end
触发条件是“posedge in[0]”,判断条件是in[0]==1,每次被触发以后,in[0]必然是1,所以你这个always实际上会永远都只执行
pwm_count = (pwm_count + 1'b1);
这个语句,else完全就不会执行....
在always块的敏感信号表里面,沿只能做到触发效果,在块内部,实际上是用的敏感信号的沿后值,比如 posedge a,a在块内部值是1,negedge则为0.

简单的问题...
你这段代码
always @(posedge in[0])
      begin
            if (in[0])
                 pwm_count = (pwm_count + 1'b1);
            else
                 pwm_count = pwm_count;
     end
触发条件是“posedge in[0]”,判断条件是in[0]==1,每次被触发以后,in[0]必然是1,所以你这个always实际上会永远都只执行
pwm_count = (pwm_count + 1'b1);
这个always块里面,else完全就不会执行....
在always块的敏感信号表里面,沿只能做到触发效果,在块内部,实际上是用的敏感信号的沿后值,比如 posedge a,a在块内部值是1,negedge则为0.
绝大部分的仿真器都是用的沿后值.....

Thank you . I need ITT

thank you

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top