verilog 中的数据移动
Data shifting in verilog
我有几个32位的。我只需要它的前 8 位。我想我可以通过两种方法做到这一点:一种是将数字右移 24 位,另一种是简单地将最后 8 位分配给一个变量。
这是我正在尝试做的事情:
module Data_shiftin(
input reset_n, clk,
input [31:0] data_in,
output [31:0] data_out
);
reg [31:0] data_reg;
reg data_out;
always @ (posedge clk)
begin
data_out<=data_in[31:23];
end
endmodule
但我只得到最后一位,即数字的第 32 位。我不知道我在哪里做错了。
谢谢!
P.S: 我是这门语言的新手。
您的分配是正确的,但您只得到一位,因为您将 data_out
重新声明为一位 reg。尝试更改:
reg data_out
收件人:
reg[31:0] data_out
更好的选择是使用 Verilog-2000 样式的端口声明并将 reg
关键字放在端口列表中。
示例:
module Data_shiftin(
input wire reset_n,
input wire clk,
input wire [31:0] data_in,
output reg [31:0] data_out
);
always @ (posedge clk)
begin
data_out <= data_in[31:23];
end
endmodule
另请注意,您的工具可能会警告您宽度不匹配,因为您正在将 8 位值分配给 32 位值。要显式仅分配 data_out
的低 8 位,您应该使用:
data_out[7:0] <= data_in[31:23]
我有几个32位的。我只需要它的前 8 位。我想我可以通过两种方法做到这一点:一种是将数字右移 24 位,另一种是简单地将最后 8 位分配给一个变量。 这是我正在尝试做的事情:
module Data_shiftin(
input reset_n, clk,
input [31:0] data_in,
output [31:0] data_out
);
reg [31:0] data_reg;
reg data_out;
always @ (posedge clk)
begin
data_out<=data_in[31:23];
end
endmodule
但我只得到最后一位,即数字的第 32 位。我不知道我在哪里做错了。 谢谢!
P.S: 我是这门语言的新手。
您的分配是正确的,但您只得到一位,因为您将 data_out
重新声明为一位 reg。尝试更改:
reg data_out
收件人:
reg[31:0] data_out
更好的选择是使用 Verilog-2000 样式的端口声明并将 reg
关键字放在端口列表中。
示例:
module Data_shiftin(
input wire reset_n,
input wire clk,
input wire [31:0] data_in,
output reg [31:0] data_out
);
always @ (posedge clk)
begin
data_out <= data_in[31:23];
end
endmodule
另请注意,您的工具可能会警告您宽度不匹配,因为您正在将 8 位值分配给 32 位值。要显式仅分配 data_out
的低 8 位,您应该使用:
data_out[7:0] <= data_in[31:23]