verilog中的数据转换

时间:2015-01-28 11:03:13

标签: 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:我是这种语言的新手。

1 个答案:

答案 0 :(得分:2)

您拥有的任务是正确的,但您只获得一位,因为您将data_out重新声明为单位注册。尝试更改:

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]