搜索
bottom↓
回复: 4

一个Verilog HDL程序的疑问(标题不合格,封锁ID)

[复制链接]

出0入0汤圆

发表于 2012-12-18 15:41:10 | 显示全部楼层 |阅读模式
初写Verilog HDL程序,感觉无法理解程序运行的过程。如下是我写的一个调整占空比输出的小程序,本想实现的是计数CLK_IN数0xFFFF后,置RESET为高。这时占空比调节功能有效,在每个UP_DUTY的上升沿加大占空比,在DOWN_DUTY的上升沿减小占空比。但是一上电,占空比初始输出就不对,调整UP_DUTY或DOWN_DUTY输入,可调占空比输出,但是发现(pwm_count < 16'hFFF9)或 (pwm_count > 16'h1C71)没起作用,有时调到最大占空比后,再输入UP_DUTY的上升沿,PWM_OUT又变小了。请问这是为什么啊?谢谢!
CLK_IN:12MHz时钟输入
PWM_OUT:PWM输出
RESET:复位输出
UP_DUTY:增大占空比输入控制
DOWN_DUTY:减小点空比输入控制

module PWM(CLK_IN, PWM_OUT, RESET,  UP_DUTY, DOWN_DUTY);
input         CLK_IN;
input         UP_DUTY;
input         DOWN_DUTY;
output      PWM_OUT;
output         RESET;

reg RESET;
reg PWM_OUT;
reg rst_flag;
reg [1:0] in_reg;
reg [15:0] count;
reg [15:0] pwm_count;

initial pwm_count = 16'h8E35;        //初始值
initial rst_flag = 1'b0;
initial in_reg   = 2'b00;

always @(posedge CLK_IN)
  begin
    count = count + 1'b1;   //计数累加                                 
    if ((count == 'hFFFF) && (rst_flag == 1'b0))
                begin
             RESET = 1'b1;   //全局复位完成
                  rst_flag = 1'b1;
      end
  
    if (rst_flag)
      begin
        if (count < pwm_count)
          PWM_OUT = 1'b1;
        else
          PWM_OUT = 1'b0;
               
        if (!UP_DUTY && in_reg[0] && (pwm_count < 16'hFFF9))
            pwm_count = (pwm_count + 16'h1C71);        //占空比增加                                                  
        else if (!DOWN_DUTY && in_reg[1] && (pwm_count > 16'h1C71))
            pwm_count = (pwm_count - 16'h1C71);         //占空比减少       
               
       in_reg = {DOWN_DUTY, UP_DUTY};
      end
  end
endmodule

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-12-18 16:17:42 | 显示全部楼层
  1. module amo(CLK_IN, PWM_OUT, UP_DUTY, DOWN_DUTY ,RESET);
  2. input         CLK_IN;
  3. input         UP_DUTY;
  4. input         DOWN_DUTY;
  5. output        PWM_OUT;
  6. output        RESET;

  7. reg RESET;
  8. reg PWM_OUT;
  9. reg [15:0] count;
  10. reg [15:0] pwm_count;

  11. initial pwm_count = 35;        //³õʼֵ

  12. always @(posedge CLK_IN)
  13.   begin                                    
  14.     if(count == 99)
  15.        begin
  16.         if (!UP_DUTY && DOWN_DUTY && (pwm_count < 99))
  17.             pwm_count <= (pwm_count + 1);        //Õ¼¿Õ±ÈÔö¼Ó                                                  
  18.         else if (!DOWN_DUTY && UP_DUTY && (pwm_count > 1))
  19.             pwm_count <= (pwm_count - 1);         //Õ¼¿Õ±È¼õÉÙ      
  20.         RESET<=1;
  21.         count<=0;
  22.       end
  23.    
  24.     else
  25.                 begin
  26.                         count <= count + 1'b1;  
  27.                         RESET<=0;
  28.                         if (count < pwm_count)
  29.                           PWM_OUT = 1'b1;
  30.                         else
  31.                           PWM_OUT = 1'b0;
  32.                 end
  33.   end
  34. endmodule
复制代码
改了一下,仿真过,可以用~~你把上下限的数值和每次跳变的数值改一下就可以了。另外,你设置的上限的16‘hfff9,不合理,最大也就只能到FFFF-1C71。注意一下这边

出0入0汤圆

 楼主| 发表于 2012-12-19 13:56:14 | 显示全部楼层
本帖最后由 pigy 于 2012-12-19 14:07 编辑
mayiqing888 发表于 2012-12-18 16:17
改了一下,仿真过,可以用~~你把上下限的数值和每次跳变的数值改一下就可以了。另外,你设置的上限的16‘hf ...


上限没错吧?16位计数器范围为0000 ~ FFFF,以初始值8E35 开始每次增减1C71最小到1C71,最大到FFF9。用你的代码下载后不能运行!

出0入0汤圆

发表于 2012-12-25 11:30:37 | 显示全部楼层
pigy 发表于 2012-12-19 13:56
上限没错吧?16位计数器范围为0000 ~ FFFF,以初始值8E35 开始每次增减1C71最小到1C71,最大到FFF9。用你 ...

不能运行不可能吧?你改了MODULE的名字了吗?我当时建立工程起的名字是amo,就把module的名字也改成amo了,在我这里跑的好好的啊
头像被屏蔽

出0入0汤圆

发表于 2012-12-25 11:31:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表