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]