自定义位宽输入输出截位模块的灵活配置方案

描述

内容如标题。方便又简单。可作为类似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

审核编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分