内容如标题。方便又简单。可作为类似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条评论
快来发表一下你的评论吧 !