2016-09-14 101 views
0

我试图使这个示例代码感亮度发现here的Verilog:采用PWM控制的LED

module LED_PWM(clk, PWM_input, LED); 
    input clk; 
    input [3:0] PWM_input;  // 16 intensity levels 
    output LED; 

reg [4:0] PWM; 
always @(posedge clk) PWM <= PWM[3:0]+PWM_input; 

assign LED = PWM[4]; 
endmodule 

要开始了,它创建的4位寄存器PWM_input和5位寄存器PWM。然后它在每个时钟周期继续将PWM设置为自己的3位加上PWN_input。

究竟发生了什么?为什么PWM的5位中只有4位正在使用,PWM_input的值是多少?

当实际控制LED时,它将LED设置为PWM [4]。这是否与PWM [4:0]相同?还是它是一个独立的价值?

回答

1

PWM[4]本质上是一个4位加法器/累加器的进位,并且该位用于打开/关闭LED。 PWM_input的值决定了LED打开和关闭的速度。如果这个例子写成如下的话,可能会更清楚:

module LED_PWM(input clk, 
       input [3:0] PWM_input, // 16 intensity levels 
       output reg LED); 

    reg [3:0] PWM; // internal accumulator 

    always @(posedge clk) {LED,PWM} <= PWM + PWM_input; 

endmodule 
+0

好的,如果我想要显示特定的强度等级(1-16),我该如何去做呢?我一直在尝试将PWM_input设置为[3:2],但我无法达到特定亮度级别。更具体地说,将PWM + PWM_input改为PWM + PWM_input [3:3]的亮度等级为16? 15点左右,会不会是[3:2]? – Broadway

+0

亮度级别为1-15或4'b001至4'b1111。对于这个特定的设计,没有可预测的方式来将LED设置为常开或常闭。我不知道你的意思是[3:2]。这是一个有点范围。你的意思是4'b1100或12,即将位[3]和[2]设置为1。 –