Verilog -- "and reduction" & 占空比
Verilog -- "and reduction" & duty cycle
我正在研究这个 Verilog 文件:
`default_nettype none
module stroboscope(i_clk, o_led);
input wire i_clk;
output wire o_led;
reg [19:0] counter;
initial counter = 0;
always @(posedge i_clk)
begin
counter <= counter + 1'b1;
end
assign o_led = &counter[19:15];
endmodule
我已经发现,如果我将 assign
从它的当前状态更改为显示的状态,低于闪烁 LED o_led
的频率保持不变,同时它的占空比增加到 100% (开启时):
assign o_led = &counter[19:19];
现在可以通过将同一行设置为以下来降低占空比:
assign o_led = &counter[19:17];
再次...通过将同一行设置为:
assign o_led = &counter[19:15];
最后设置如下所示的同一行将使占空比为 0%:
assign o_led = &counter[19:0];
那么代表 和归约 的一元 &
运算符如何在当前案例中实现这一点?
我知道这是如何工作的一个简单例子,即
&`4b1101 = 0
"和减少"看起来像这样:
1101
101
01
0
但是,这个例子比较复杂,我没看懂。
&counter[19:15]
等同于:
counter[19] & counter[18] & counter[17] & counter[16] & counter[15]
reduction-AND 运算符只是对其每个位执行按位 AND。因此,只有当 counter
的所有这 5 位都为高时,您的 o_led
信号才为高,如下图中的光标之间(单击图像放大):
o_led
的脉冲宽度与您的 reduction-AND 表达式中的 LSB 匹配。在我上面的代码中,LSB 是 15。如果将 LSB 更改为 16,则脉冲宽度会加倍。
我正在研究这个 Verilog 文件:
`default_nettype none
module stroboscope(i_clk, o_led);
input wire i_clk;
output wire o_led;
reg [19:0] counter;
initial counter = 0;
always @(posedge i_clk)
begin
counter <= counter + 1'b1;
end
assign o_led = &counter[19:15];
endmodule
我已经发现,如果我将 assign
从它的当前状态更改为显示的状态,低于闪烁 LED o_led
的频率保持不变,同时它的占空比增加到 100% (开启时):
assign o_led = &counter[19:19];
现在可以通过将同一行设置为以下来降低占空比:
assign o_led = &counter[19:17];
再次...通过将同一行设置为:
assign o_led = &counter[19:15];
最后设置如下所示的同一行将使占空比为 0%:
assign o_led = &counter[19:0];
那么代表 和归约 的一元 &
运算符如何在当前案例中实现这一点?
我知道这是如何工作的一个简单例子,即
&`4b1101 = 0
"和减少"看起来像这样:
1101
101
01
0
但是,这个例子比较复杂,我没看懂。
&counter[19:15]
等同于:
counter[19] & counter[18] & counter[17] & counter[16] & counter[15]
reduction-AND 运算符只是对其每个位执行按位 AND。因此,只有当 counter
的所有这 5 位都为高时,您的 o_led
信号才为高,如下图中的光标之间(单击图像放大):
o_led
的脉冲宽度与您的 reduction-AND 表达式中的 LSB 匹配。在我上面的代码中,LSB 是 15。如果将 LSB 更改为 16,则脉冲宽度会加倍。