内容如标题。方便又简单。可作为类似IP使用。
/**********************************************************当前版本修订**********************************************************************
** 文件名称: round_truncation
** 创建人/修改人: pdh
** 版本日期: 2024.4.24
** 版本号: v1.0
** 版本功能描述: 本模块实现可配置,输入任意位宽,输出任意位宽的截位操作,对标matlab round函数
**
*******************************************************************************************************************************************/
`timescale 1ns / 1ps
module round_truncation #
(
parameter IN_WIDTH = 22 ,
parameter TRUNC_WIDTH = 5 ,
parameter OUT_WIDTH = IN_WIDTH-TRUNC_WIDTH
)
(
input i_clk ,
input [IN_WIDTH-1:0] i_full_data ,
input i_full_data_vld ,
output logic [OUT_WIDTH-1:0] o_trunc_data ,
output logic o_trunc_data_vld
);
/****************************************************************************/
/* signal
/****************************************************************************/
logic [IN_WIDTH-1:0] round_data ;
logic round_data_vld ;
/****************************************************************************/
/* process
/****************************************************************************/
always @(posedge i_clk)
begin
if (i_full_data[IN_WIDTH-1] == 1'b0) // 正数,就加0.5,位宽大小以要截位的位宽大小
begin
round_data <= i_full_data + {{1'b0},{(TRUNC_WIDTH-1){1'b1}}};
end
else if (i_full_data[IN_WIDTH-1]) // 负数,就减0.5,位宽大小以要截位的位宽大小
begin
round_data <= i_full_data + {{1'b1},{(TRUNC_WIDTH-1){1'b0}}};
end
end
always @(posedge i_clk)
begin
if (round_data[IN_WIDTH-1] == 1'b0 && round_data[IN_WIDTH-2])
begin
o_trunc_data <= {{1'b0},{(OUT_WIDTH-1){1'b1}}}; // 如果正数溢出,就给正数最大值,7ff,位宽大小以要截位的位宽大小
end
else if (round_data[IN_WIDTH-1] && round_data[IN_WIDTH-2] == 1'b0)
begin
o_trunc_data <= {{1'b1},{(OUT_WIDTH-1){1'b0}}}; // 如果负数溢出,就给负数最大值,800,位宽大小以要截位的位宽大小
end
else
begin
o_trunc_data <= round_data[(IN_WIDTH-1):TRUNC_WIDTH]; // 没溢出,就直接给需要截位的值
end
end
always @(posedge i_clk)
begin
round_data_vld <= i_full_data_vld;
o_trunc_data_vld <= round_data_vld;
end
endmodule
审核编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !