带 axi 接口的绝对值

Absolute value with axi interface

提问人:Parsa 提问时间:11/17/2023 最后编辑:MikefParsa 更新时间:11/23/2023 访问量:91

问:

我有一个干涉仪波,想纠正它。
代码未正确执行绝对值。

这段代码有什么问题?

`timescale 1ns / 1ps

module abs(
  input clk,
  output  [15:0] m_axis_tdata,
  input m_axis_tready,
  output m_axis_tvalid,
            
  input[15:0] s_axis_tdata,
  output s_axis_tready,
  input s_axis_tvalid 
  );

  always@(posedge clk) begin
    if(m_axis_tready && s_axis_tvalid) begin 
      assign  m_axis_tdata = (s_axis_tdata< 0) ? -s_axis_tdata :s_axis_tdata;
    end 
  end 
    
endmodule
系统-Verilog

评论


答:

0赞 Mikef 11/17/2023 #1

原始邮政编码不编译。

进行了以下更改,以便它进行编译,充当绝对值转换器,更易于理解为 SO 答案,并提供使用 Verilog 运算符 WRT 有符号/无符号数字的参考。

  • 清理、删除死代码、对齐、最小化以清晰。

  • 更改代码以使其编译:
    删除程序块中的语句。
    将 过程块驱动的变量更改为 kind 。
    assignreg

  • 将赋值运算符从阻塞 ( ) 更改为非阻塞 ( ) 以对顺序逻辑(寄存器)进行建模。=<=

  • 通过更改与要签名的运算符 ( ) 关联的所有内容来更改代码以处理签名号码。OP 省略了变量的 type's/kind;Verilog 默认为 unsigned 。检查小于 0 时,在无符号变量上的行为将不按预期进行。<wire

请参阅 SystemVerilog 规范第 11.6.1 节 表达式位长度的规则。具体来说,上下文确定运算符,详细了解如何在有符号参数上使用运算符。

此代码编译并充当具有寄存器输出的绝对值转换器。

`timescale 1ns / 1ps
module abs(
  // inputs
  input      clk,
  input      m_axis_tready,
  input      s_axis_tvalid,
  input      signed [15:0] s_axis_tdata,
  // output
  output reg signed [15:0] m_axis_tdata
  );
  
  always@( posedge clk ) 
    if( m_axis_tready && s_axis_tvalid )  
      m_axis_tdata <= ( s_axis_tdata < 32'sb0 ) ? -s_axis_tdata : s_axis_tdata;

endmodule