提问人:Parsa 提问时间:11/17/2023 最后编辑:MikefParsa 更新时间:11/23/2023 访问量:91
带 axi 接口的绝对值
Absolute value with axi interface
问:
我有一个干涉仪波,想纠正它。
代码未正确执行绝对值。
这段代码有什么问题?
`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
答:
0赞
Mikef
11/17/2023
#1
原始邮政编码不编译。
进行了以下更改,以便它进行编译,充当绝对值转换器,更易于理解为 SO 答案,并提供使用 Verilog 运算符 WRT 有符号/无符号数字的参考。
清理、删除死代码、对齐、最小化以清晰。
更改代码以使其编译:
删除程序块中的语句。
将 过程块驱动的变量更改为 kind 。assign
reg
将赋值运算符从阻塞 ( ) 更改为非阻塞 ( ) 以对顺序逻辑(寄存器)进行建模。
=
<=
通过更改与要签名的运算符 ( ) 关联的所有内容来更改代码以处理签名号码。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
评论