不同宽度的变址寄存器
Index register with different widths
有没有办法索引一个偏移量相同但宽度可变的多位寄存器?我想这样做:
module foo (input [1:0] data_bits);
always @ (posedge clk) begin
case (data_bits)
2'b11:
assign wire_data_out = {3(1'b0), data_received[7:3]};
2'b10:
assign wire_data_out = {2(1'b0), data_received[7:2]};
2'b01:
assign wire_data_out = {(1'b0), data_received[7:1]};
2'b00:
assign wire_data_out = data_received;
endcase
end
搜索答案我找到了索引部分 Select 运算符“+: 或 -:”,但它需要固定宽度,这不符合我的需要。上面的代码有没有更简单的写法?
always @ (posedge clk)
wire_data_out <= data_received>>data_bits;
顺便说一句:
- 您不能在 always 块中使用赋值。
- 在时钟部分,您应该使用非阻塞分配。
如您所愿,单行。但我不会那样写我的代码。它要求 reader 知道 Verilog 会将零位添加到顶部并丢失底部位。我会使用你写的代码(但没有语法错误:-):
always @ (posedge clk) begin
case (data_bits)
2'b00: wire_data_out <= data_received;
2'b01: wire_data_out <= {1'b0,data_received[7:1]};
2'b10: wire_data_out <= {2'b0,data_received[7:2]};
2'b11: wire_data_out <= {3'b0,data_received[7:3]};
endcase
最终结果会是完全相同的逻辑,但可读性更好。
有没有办法索引一个偏移量相同但宽度可变的多位寄存器?我想这样做:
module foo (input [1:0] data_bits);
always @ (posedge clk) begin
case (data_bits)
2'b11:
assign wire_data_out = {3(1'b0), data_received[7:3]};
2'b10:
assign wire_data_out = {2(1'b0), data_received[7:2]};
2'b01:
assign wire_data_out = {(1'b0), data_received[7:1]};
2'b00:
assign wire_data_out = data_received;
endcase
end
搜索答案我找到了索引部分 Select 运算符“+: 或 -:”,但它需要固定宽度,这不符合我的需要。上面的代码有没有更简单的写法?
always @ (posedge clk)
wire_data_out <= data_received>>data_bits;
顺便说一句:
- 您不能在 always 块中使用赋值。
- 在时钟部分,您应该使用非阻塞分配。
如您所愿,单行。但我不会那样写我的代码。它要求 reader 知道 Verilog 会将零位添加到顶部并丢失底部位。我会使用你写的代码(但没有语法错误:-):
always @ (posedge clk) begin
case (data_bits)
2'b00: wire_data_out <= data_received;
2'b01: wire_data_out <= {1'b0,data_received[7:1]};
2'b10: wire_data_out <= {2'b0,data_received[7:2]};
2'b11: wire_data_out <= {3'b0,data_received[7:3]};
endcase
最终结果会是完全相同的逻辑,但可读性更好。