左对齐并用零填充一个输入到另一个输入的大小
Left-justify and pad with zeros one input to the size of another input
我想比较两个输入的位大小,比如 N
和 x
。我会减去位数 (m = size(N) - size(x)
) 并将 m
个零连接到 x
的 LSB。我如何使用 Verilog 解决这个问题?
例如N
的大小是16位,说x
是1011
(即x
的大小是4位)。所以 m
是 12 位。我想要得到的输出是将 12 位的 0 连接到 LSB。输出将是 1011000000000000
.
我认为您对“比较”这个词的使用令人困惑。听起来您想将 x
的赋值左对齐到 N
,并在右侧填充 0。通常 Verilog 右对齐并在左侧填充 0。
除非您首先使用参数来声明 N
和 x
的大小,否则在 Verilog 中无法轻易做到这一点。那么你可以这样写:
reg [sizeN-1:0] N;
reg [sizex-1:0] x;
...
N = {x,{sizeN-sizex{1'b0}}};
如果您可以使用 SystemVerilog,它具有 $bits
系统函数,可以让您对向量进行内省,而 Verilog 没有。
N = {x,{$bits(N)-$bits(x){1'b0}}};
它还有一个流运算符,可以直接左对齐赋值
N = {>>{x}};
我想比较两个输入的位大小,比如 N
和 x
。我会减去位数 (m = size(N) - size(x)
) 并将 m
个零连接到 x
的 LSB。我如何使用 Verilog 解决这个问题?
例如N
的大小是16位,说x
是1011
(即x
的大小是4位)。所以 m
是 12 位。我想要得到的输出是将 12 位的 0 连接到 LSB。输出将是 1011000000000000
.
我认为您对“比较”这个词的使用令人困惑。听起来您想将 x
的赋值左对齐到 N
,并在右侧填充 0。通常 Verilog 右对齐并在左侧填充 0。
除非您首先使用参数来声明 N
和 x
的大小,否则在 Verilog 中无法轻易做到这一点。那么你可以这样写:
reg [sizeN-1:0] N;
reg [sizex-1:0] x;
...
N = {x,{sizeN-sizex{1'b0}}};
如果您可以使用 SystemVerilog,它具有 $bits
系统函数,可以让您对向量进行内省,而 Verilog 没有。
N = {x,{$bits(N)-$bits(x){1'b0}}};
它还有一个流运算符,可以直接左对齐赋值
N = {>>{x}};