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,则脉冲宽度会加倍。