Verilog HDL输出PWM的疑问
- module PWM(clk,in,out);
- input clk;
- input [1:0]in;
- output out;
- reg [15:0] count;
- reg [15:0] pwm_count;
- reg pwm_flag;
- initial pwm_count = 16'h8000;
- always @(posedge clk)
- begin
- count = count + 1'b1;
- if (count < pwm_count)
- pwm_flag = 0;
- else
- pwm_flag = 1;
- end
- 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
- assign out = pwm_flag;
- endmodule
把上面的always @(posedge in[0] or posedge in[1])
改为
-
- always @(posedge in[0])
- begin
- if (in[0])
- pwm_count = (pwm_count + 1'b1);
- else
- pwm_count = pwm_count;
- 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
