FPGA计算中定标与位扩展的实现
我不知道名字取对没有,在FPGA计算中有时往往需要在不溢出的情况下将数扩大,从而获得更好的计算精度。
比如。在一个8位宽的系统中,将x=0000_0010,算术左移m=5位之后得到xt=0100_0000,此时的xt参与运算之后能得到更好计算精度,并且通过m我们可以把相应的结果移位回来。
典型的应用例子就是,使用cordic计算复数x+jy的相角与模值,那么此时我们可以在保证不溢出的情况下按比例的扩大(x,y),再进行cordic计算,此时我们就可以得到,将计算结果的模值右移相应的m位即可,那么我们就可以计算得到精度较高的模值与相角值。
下面就是移位的过程。以一个8位的数据为例 x=0000_0010为例
1.高四位全为符号位,所以,x<<<3=0_0010_000 m=3.
2.高三位全为符号位,所以,x<<<2=0_10_00000 m=m+2=5.
3.高两位不全为符号位,所以 x<<<0=0_10_00000 m=m+0=5.
对应到每一次的硬件结构为

代码为:
module data_expand
#(
parameter DSIZE = ,
parameter MSIZE =
)
(
input clk,
input nd,
output rdy, input signed [DSIZE-:] din,
output signed [DSIZE-:] dout,
output [MSIZE-:] mout ); wire [DSIZE-:] dtemp [:];
wire [MSIZE-:] mtemp [:];
wire rtemp [:]; data_expand_unit #(.DSIZE(DSIZE),.MSIZE(MSIZE),.K())
i0 (.clk(clk), .nd(nd), .rdy(rtemp[]), .din(din), .dout(dtemp[]), .min('d0), .mout(mtemp[0]));
data_expand_unit #(.DSIZE(DSIZE),.MSIZE(MSIZE),.K())
i1 (.clk(clk), .nd(rtemp[]), .rdy(rtemp[]), .din(dtemp[]), .dout(dtemp[]), .min(mtemp[]), .mout(mtemp[]));
data_expand_unit #(.DSIZE(DSIZE),.MSIZE(MSIZE),.K())
i2 (.clk(clk), .nd(rtemp[]), .rdy(rdy), .din(dtemp[]), .dout(dout), .min(mtemp[]), .mout(mout)); endmodule module data_expand_unit
#(
parameter DSIZE = ,
parameter MSIZE = ,
parameter [MSIZE-:] K =
)
(
input clk, input nd,
output reg rdy, input signed [DSIZE-:] din,
output reg signed [DSIZE-:] dout, input [MSIZE-:] min,
output reg [MSIZE-:] mout ); always@( posedge clk )begin
if( din[(DSIZE-)-:(K+)] == {(K+){'b0}} || din[(DSIZE-1)-:(K+1)] == {(K+1){1'b1}})begin
dout <= din <<< K;
mout <= min + K;
end else begin
dout <= din;
mout <= min;
end
rdy <= nd;
end endmodule
仿真结果如下:

FPGA计算中定标与位扩展的实现的更多相关文章
- 浅谈Java中的补零扩展和补符号位扩展
今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合. ...
- Java中符号位扩展
第一个例子: byte b=-100;b在内存中是以补码的形式存贮的:1001 1100 如果执行char c=(char)b;如3楼企鹅先生所说:b要先变为int,这时增加的位全要用b的符号位填充( ...
- EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他
原创 : EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他 转载,请注明出处哦!谢谢! 原创 : EasyUI datagrid 明细表格中编辑框 事件绑 ...
- AI芯片:高性能卷积计算中的数据复用
随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片.卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中 ...
- 【转】Cocoa中的位与位运算
转自:http://www.tuicool.com/articles/niEVjy 介绍 位操作是程序设计中对位模式或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常 ...
- FPGA计算3行同列数据之和
实验:FPGA计算3行同列数据之和 实验要求:PC机通过串口发送3行数据(一行有56个数据,3行共有56*3=168个数据)给FPGA,FPGA计算3行同一列数据的和,并将结果通过串口返回给上位机. ...
- 在x64计算机上捕获32位进程的内存转储
这是一个我经常遇到的问题,我们经常会遇到这样的情况:我们必须重新捕获内存转储,因为内存转储是以“错误”的方式捕获的.简而言之:如果在64位计算机上执行32位进程,则需要使用允许创建32位转储的工具捕获 ...
- Java 移位运算、符号位扩展
类型取值范围 short 是1字节,即8位.而且 Java 中只有有符号数,所以最大值 0111,1111=2^7-1. 同时计算机中以补码形式存负数,所以可以多表示一个数,则最小值 1000,000 ...
- linux内核学习之三:linux中的"32位"与"64位"
在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位"与"64位"的说法,类似的还有"x86"与"x86 ...
随机推荐
- 腾讯2019年暑期实习生招聘提前批在线笔试技术研究和数据分析方向t2(python)
小Q有一叠纸牌,一共有n张,从上往下依次编号为1~n.现在小Q要进行以下重复操作:把位于顶端的牌扔掉,把新的顶端的牌放到这叠牌的底部.小Q会一直操作到只剩下一张牌为止,小Q想知道每次扔掉的牌的编号.[ ...
- node杂谈(一)
在node中var作用域为当前js文件 每一个js文件都是一个module对象 global为全局对象,可以用在不同js之间访问(不要设立过多的全局对象,除非必要,比如设立生产环境还是开发环境) a ...
- gitlab 与 jenkins 关联
一.搭建 gitlab :https://www.cnblogs.com/carriezhangyan/p/10729158.html 二.搭建jenkins :https://www.cnblogs ...
- Hibernate基础一
前面已经学习了Struts2的基础知识,可以自己搭建一个简单的Struts2项目!现在开始Hibernate!从基础开始! 1.web内容回顾 JavaEE三层结构(后面要看下,三层架构是怎么区分的? ...
- EventEmitter事件处理器中的this问题
JavaScript中的this是一个比较绕的问题,有非常非常多的文章在讲这件事,这里推荐一篇文章,看了这篇文章基本上就能弄明白了. 这篇文章讲了关于this的一个基本原则: 包含this的Funct ...
- spring :Log4j各级别日志重复打印
使用filter进行日志过滤 这个其实是Log4j自带的方案,也是推荐方案,不知道为什么网上的资料却很少提到这点. 把log4j.properties配置文件修改成如下: #root日志 log4j. ...
- CSS样式内容
CSS代码规范:尽量不要在标签内使用样式代码. .css文档内部声明不换行可以节省内存. 谨记: 常犯的错误是.html文档和.css样式表都写好了,但总会忘记插入样式表. 1.字体的样式 2. ...
- 涂色(CQOI2007)
--BZOJ1260_区间dp Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:R ...
- linux学习第十九天 (Linux就该这么学) 结课了
今天最后一天课程了,结课了,还有点舍不得那,在些也祝 李老师 事业蒸蒸日上,超来超好, 今天内容是部署了 LNMP 部署动态网站环境(linux +nginx+mysql+php) 安装文件挺别多, ...
- java 日志体系(三)log4j从入门到详解
java 日志体系(三)log4j从入门到详解 一.Log4j 简介 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代 ...