在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4244|回复: 8

[求助] Verilog HDL输出PWM的疑问

[复制链接]
发表于 2011-11-15 09:19:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我想要的过程是,刚开始输出输入时钟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不久,请教各位大侠!谢谢!
发表于 2011-11-15 09:40:09 | 显示全部楼层
你後一段代碼的意思是:
只要in(0)為1的時候,PWM_count都會加1,而且條件是in(0)為上升沿。
所以仿真的結果是正確的
只是不知道你想要做什麼??
 楼主| 发表于 2011-11-15 09:47:03 | 显示全部楼层
本帖最后由 pigy 于 2011-11-15 09:48 编辑

我是想实现在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
发表于 2011-11-16 08:42:43 | 显示全部楼层
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

换成这样试一下
发表于 2011-11-16 23:06:13 | 显示全部楼层
你这样写显然有问题。
你期待的是in[1]的上升沿,占空比变小是吧?
那你想想看,如果in[0]为1的时候,来了in[1]的上升沿,
你的else if (in[1])语句能执行到吗?
发表于 2011-11-17 00:07:31 | 显示全部楼层
简单的问题...
你这段代码
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.
发表于 2011-11-17 00:08:56 | 显示全部楼层
简单的问题...
你这段代码
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.
绝大部分的仿真器都是用的沿后值.....
发表于 2013-10-29 15:24:54 | 显示全部楼层
Thank you . I need ITT
发表于 2013-10-30 00:47:11 | 显示全部楼层
thank you
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-24 12:39 , Processed in 0.030598 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表