gpt4 book ai didi

Verilog 案例陈述

转载 作者:行者123 更新时间:2023-12-02 04:38:32 25 4
gpt4 key购买 nike

我们可以使用 case 语句可扩展的语法吗?让我用一个例子来解释:Mux

如果只有2条选择线

always @(A[1:0]) begin
case (A[1:0])
2'b00 : select = 4'b1110;
2'b01 : select = 4'b1101;
2'b10 : select = 4'b1011;
2'b11 : select = 4'b0111;
endcase
end

对于 3 个选择行

always @(A[2:0]) begin
case (A[2:0])
3'b000 : select = 8'b1111_1110;
3'b001 : select = 8'b1111_1101;
3'b010 : select = 8'b1111_1011;
3'b011 : select = 8'b1111_0111;
3'b100 : select = 8'b1110_1111;
3'b101 : select = 8'b1101_1111;
3'b110 : select = 8'b1011_1111;
3'b111 : select = 8'b0111_1111;
endcase
end

我的问题:

  • 是否有一种通用的编写代码的方法可以使用任意数量的选择行寻址多路复用器? 2,3,4...

  • 除了 case 语句之外,还有其他语法实现方式吗?

欢迎任何反馈。问候

最佳答案

如果它是你之后的行走 0 的模式:

  localparam SHIFT_W = 3;
localparam OUT_W = 2**SHIFT_W;
reg [SHIFT_W-1:0] shift;
reg [OUT_W-1:0] out;

always_comb begin
out = ~(OUT_W'(1'b1 << shift));
end

根据 nguthrie 的建议 。移动以创建步行 1,然后反转以创建步行 0。


我最初的建议(有点冗长)使用 SystemVerilog 直接创建一个行走的 0:

  localparam SHIFT_W = 3;
localparam OUT_W = 2**SHIFT_W;
reg [SHIFT_W-1:0] shift;
reg [OUT_W-1:0] out;
always_comb begin
out = OUT_W'( $signed{ 1'b1, 1'b0, {OUT_W{1'b1}} }) >>> (OUT_W-shift) );
end

WIDTH`()转换到正确的宽度以停止 LHS RHS 宽度不匹配警告。 $signed()强制转换为有符号数以允许 >>>通过符号扩展移动。这也可以写成:

out = OUT_W'( { {OUT_W{1'b1}}, 1'b0, {OUT_W{1'b1}} } >> (OUT_W-shift) );

对于 Verilog-2001,您只会收到 LHS RHS 宽度不匹配警告:

out = { {OUT_W{1'b1}}, 1'b0, {OUT_W{1'b1}} } >> (OUT_W-shift);

这消除了在轮类期间签署延期的需要。

关于Verilog 案例陈述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21401557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com