一个Verilog HDL程序的疑问(标题不合格,封锁ID)
初写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 in_reg;
reg count;
reg 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 && (pwm_count < 16'hFFF9))
pwm_count = (pwm_count + 16'h1C71); //占空比增加
else if (!DOWN_DUTY && in_reg && (pwm_count > 16'h1C71))
pwm_count = (pwm_count - 16'h1C71); //占空比减少
in_reg = {DOWN_DUTY, UP_DUTY};
end
end
endmodule module amo(CLK_IN, PWM_OUT, UP_DUTY, DOWN_DUTY ,RESET);
input CLK_IN;
input UP_DUTY;
input DOWN_DUTY;
output PWM_OUT;
output RESET;
reg RESET;
reg PWM_OUT;
reg count;
reg pwm_count;
initial pwm_count = 35; //³õʼֵ
always @(posedge CLK_IN)
begin
if(count == 99)
begin
if (!UP_DUTY && DOWN_DUTY && (pwm_count < 99))
pwm_count <= (pwm_count + 1); //Õ¼¿Õ±ÈÔö¼Ó
else if (!DOWN_DUTY && UP_DUTY && (pwm_count > 1))
pwm_count <= (pwm_count - 1); //Õ¼¿Õ±È¼õÉÙ
RESET<=1;
count<=0;
end
else
begin
count <= count + 1'b1;
RESET<=0;
if (count < pwm_count)
PWM_OUT = 1'b1;
else
PWM_OUT = 1'b0;
end
end
endmodule
改了一下,仿真过,可以用~~你把上下限的数值和每次跳变的数值改一下就可以了。另外,你设置的上限的16‘hfff9,不合理,最大也就只能到FFFF-1C71。注意一下这边 本帖最后由 pigy 于 2012-12-19 14:07 编辑
mayiqing888 发表于 2012-12-18 16:17 static/image/common/back.gif
改了一下,仿真过,可以用~~你把上下限的数值和每次跳变的数值改一下就可以了。另外,你设置的上限的16‘hf ...
上限没错吧?16位计数器范围为0000 ~ FFFF,以初始值8E35 开始每次增减1C71最小到1C71,最大到FFF9。用你的代码下载后不能运行! pigy 发表于 2012-12-19 13:56 static/image/common/back.gif
上限没错吧?16位计数器范围为0000 ~ FFFF,以初始值8E35 开始每次增减1C71最小到1C71,最大到FFF9。用你 ...
不能运行不可能吧?你改了MODULE的名字了吗?我当时建立工程起的名字是amo,就把module的名字也改成amo了,在我这里跑的好好的啊
页:
[1]