【问题标题】:Arithmetic Shift Operation In verilogVerilog中的算术移位操作
【发布时间】:2014-09-09 20:44:12
【问题描述】:

我有一个 Verilog 模块,它必须一次移动一位。
请帮我完成模块。

module shift_right1 (
  output logic [15:0] shifted,
  input  wire  [15:0] unshifted,
  input  wire   [3:0] amt );

  localparam int width = 16;

  always @* begin 
    automatic int limit = width - amt;

    for ( int i=0; i<limit; i++ ) begin
      shifted[i] = unshifted[i+amt];
    end
  end
endmodule

【问题讨论】:

  • localparam int, automatic int 我不知道有什么指南可以写出这样的verilog。您想通过自动标记变量来做什么?一次移动 1 位通常意味着每个时钟周期 1 位,并且您的示例中没有时钟。你能试着澄清这个问题吗?很好地包含了一些代码,虽然很高兴看到。
  • 实际上这是我的家庭作业项目的一部分,教授要求我更改代码以一次输入一位。
  • 模块 shift_right1 应该对 16 位数量执行逻辑右移。您的解决方案应该像现有代码一样一次分配一位。 (换句话说,不要只使用右移运算符。)测试台输出可能会提供问题所在的线索。提示:问题可以用一两行代码解决
  • @user3159419:看起来您只想完成当前代码,只是缺少对位 [width-1:limit] 的分配。对于逻辑转变,只需在下面的答案中将我的代码更改为shifted[i] = 1'b0;

标签: verilog system-verilog


【解决方案1】:

算术移位在移位时保持符号不变。在 for 循环之后,您需要设置移位值的符号。这样的事情可能会奏效:

for ( int i=limit; i<width-1; i++ ) shifted[i] = unshifted[width-1];

请注意,从左侧插入的所有位数字应等于未移位值的符号位,即unshifted[width-1]

Example:

Shifting 1011000 by 3, should be: 1111011
Shifting 0011000 by 3, should be: 0000011

【讨论】:

  • cmets 提到'逻辑右移'不是算术移位,但仅从问题中并不清楚。
【解决方案2】:

我认为关键是一次输入一点。这意味着输入是 1 位,右移旧数据。这是串行到并行转换器的实现。

module shifter(
   input               dat_rx, //1bit data input    
   input               clk,
   output logic [15:0] dat_tx  //Parallel output
);
   always @(posedge clk) begin
     dat_tx <= {dat_rx, dat_tx[15:1]}; //Next input and right shift
   end
endmodule

需要外部触发器的组合版本:

module shifter_comb(
   input dat_rx,
   input  logic [15:0] dat_old,
   output logic [15:0] dat_tx
);
   always @* begin
     dat_tx = {dat_rx, dat_old[15:1]}; //Next input and right shift
   end
endmodule

【讨论】:

  • 摩根,谢谢你的回答。但是在上述代码中,我需要使用与我的教授所说的相同的变量,即 amt [3:0]。我必须提出一个额外的逻辑,但不改变变量左右。
  • @user3159419 很高兴您发现它很有用,问题和答案在此站点上更有用(首选),对许多人有帮助,而且它不是代码编写服务。您没有说明问题中的 amt 是什么,也没有回答我在您的问题上留下的问题。如果端口列表是固定的,问题应该说明这一点,并清楚地解释端口是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多