本模块实现输入与输出位宽相同数据加法,并对结果进行四舍五入截位,对标matlab round函数。
`timescale 1ns/1ns module data_in_width_out_width_add_round # ( parameter DATA_WIDTH = 16 ) ( // 系统接口 input i_clk_sys , input i_rst , // 数据输入 input signed [DATA_WIDTH-1:0] i_din_a , input i_din_a_vld , input signed [DATA_WIDTH-1:0] i_din_b , input i_din_b_vld , // 数据输出 output signed [DATA_WIDTH-1:0] o_dout , output o_dout_vld ); /****************************************************************************/ /* parameter /****************************************************************************/ /****************************************************************************/ /* signal /****************************************************************************/ logic signed [DATA_WIDTH-1+1:0] din_add_result ; logic din_add_result_vld ; logic signed [DATA_WIDTH-1+2:0] din_add_result_round ; logic signed [DATA_WIDTH-1:0] din_add_result_truncate ; logic din_add_result_vld_1dly ; logic din_add_result_vld_2dly ; /****************************************************************************/ /* process /****************************************************************************/ always @(posedge i_clk_sys or posedge i_rst) // 数据加法 begin if (i_rst) begin din_add_result <= {{DATA_WIDTH+1}{1'b0}}; end else begin din_add_result <= i_din_a + i_din_b; end end always @(posedge i_clk_sys) begin din_add_result_vld <= i_din_a_vld && i_din_b_vld; end always @(posedge i_clk_sys) // 数据四舍五入,根据要舍弃的位宽加不同的值 begin if (din_add_result[DATA_WIDTH] == 1'b0) // 每次加法先扩充一个符号位,再对小数点位置进行 加减 0.5 begin din_add_result_round <= {din_add_result[DATA_WIDTH],din_add_result + 1'b1}; end else // 4'b1000}; +4bit 1是为了modelsim仿真,modelsim仿真规定小数至少3位 begin din_add_result_round <= {din_add_result[DATA_WIDTH],din_add_result - 1'b1}; end end always @(posedge i_clk_sys or posedge i_rst) // 数据截位 begin if (i_rst) begin din_add_result_truncate <= {DATA_WIDTH{1'b0}}; end else if (din_add_result_round[DATA_WIDTH+1] == din_add_result_round[DATA_WIDTH]) begin // 如果数据没有溢出,舍弃最后一位,赋值; 先补充符号位,再取表示起始bit为1,包含bit1并往上升DATA_WIDTH-1位 din_add_result_truncate <= {din_add_result_round[DATA_WIDTH+1],din_add_result_round[1+ :(DATA_WIDTH-1)]}; end else if (din_add_result_round[DATA_WIDTH+1] == 1'b0 && din_add_result_round[DATA_WIDTH] == 1'b1) begin // 如果正数溢出了,就给一个设置的位宽bit正数最大值,'h7fff din_add_result_truncate <= {1'b0,{(DATA_WIDTH-1){1'b1}}}; end else if (din_add_result_round[DATA_WIDTH+1] == 1'b1 && din_add_result_round[DATA_WIDTH] == 1'b0) begin // 如果负数溢出了,就给一个设置的位宽bit负数最大值,'h8000 din_add_result_truncate <= {1'b1,{(DATA_WIDTH-1){1'b0}}}; end end always @(posedge i_clk_sys) // 数据有效流水打拍 begin din_add_result_vld_1dly <= din_add_result_vld; din_add_result_vld_2dly <= din_add_result_vld_1dly; o_dout <= din_add_result_truncate; o_dout_vld <= din_add_result_vld_2dly; end endmodule
代码中如果直接截位,数据的输出将会产生直流,所以需要对数据的符号位进行判断,并进行处理。简单的思路如下:
1.数据先进行加法。
2.对加法后的结果,进行判断,正数+0.5,负数-0.5,此操作用于去除直流。
3.再对去除直流后的结果,进行需要的截位取值,例如16bit+16bit=17bit,而最终的输出结果,如果要16bit,那就去掉末位,也可以只要15bit,去掉末2bit,只要bit15-bit2。
上述代码是简单的例子处理,输入进来的两种数据同位宽,输出也用同位宽输出。后续可以改进。
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
FPGA
+关注
关注
1630文章
21796浏览量
605583 -
matlab
+关注
关注
185文章
2980浏览量
230905
原文标题:FPGA加法截位处理
文章出处:【微信号:pdh的FPGA,微信公众号:pdh的FPGA】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
为什么研究浮点加法运算,对FPGA实现方法很有必要?
处理等方面受到了限制,由于FPGA中关于浮点数的运算只能自行设计,因此,研究浮点加法运算的FPGA实现方法很有必要。
发表于 07-05 06:21
如何利用FPGA实现高速流水线浮点加法器研究?
处理等方面受到了限制,为什么研究浮点加法运算的FPGA实现方法很有必要? 因为FPGA中关于浮点数的运算只能自行设计 。
发表于 08-15 08:00
32位处理器的开发与8位处理器的开发有哪些明显的不同?
32位处理器的开发与8位处理器的开发有哪些明显的不同?开发一个32位的嵌入式系统需要哪些工具和环境呢?32位嵌入式系统的开发过程中存在哪些技术难点?有什么方法去应对呢?
发表于 04-19 08:11
求一种在FPGA上实现单精度浮点加法运算的方法
介绍一种在FPGA上实现的单精度浮点加法运算器,运算器算法的实现考虑了FPGA器件本身的特点,算法处理流程的拆分和模块的拆分,便于流水设计的
发表于 04-29 06:27
Intel 64位处理器,Intel 64位处理器结构原理
Intel 64位处理器,Intel 64位处理器结构原理
现在人们广泛使用的是由32位微处理器构成的计算系统,但是32位的计算和操作系统不能支持
发表于 03-26 15:07
•3328次阅读
FPGA信号截位策略研究
在FPGA中,随着信号处理的层次加深,对信号进行乘、累加、滤波等运算后,可能输入时仅为8位位宽的信号会扩展成几十位位宽,位宽越宽,占用的硬件资源就越多,但位宽超过一定范围后,位宽的增宽并不会对处理
发表于 11-18 12:37
•2039次阅读
单片机位处理指令的使用方法
1.位处理指令的一般性说明
在分类时将位传送归入传送指令类,条件转移归入程序控制类。其余位操作归为位处理指令。
位逻辑运算以C为目标,/ b i t表示取(b i t)的非值运算,但不影响原值。
发表于 04-10 16:22
•2648次阅读
为什么研究浮点加法运算,对FPGA实现方法很有必要?
,浮点加法器是现代信号处理系统中最重要的部件之一。FPGA是当前数字电路研究开发的一种重要实现形式,它与全定制ASIC电路相比,具有开发周期短、成本低等优点。 但多数FPGA不支持浮点
评论