FPGA中软件逻辑等级 逻辑思维能力等级 - 电脑|办公 - 电脑办公-杀毒安全-网络-V3学习网
微商网
 
 
导航:首页 |电脑|办公|正文

FPGA中软件逻辑等级 逻辑思维能力等级

时间:2020-06-25 14:25:51
举例说明FPGA是如何通过查找表来实现其逻辑功能的 在计算机科学中,查找表是用简单的查询操作替换运行时计算的数组或者 associative array 这样的数据结构。由于从内存中提取数值经常要比复
作者:

FPGA中软件逻辑等级

举例说明FPGA是如何通过查找表来实现其逻辑功能的

在计算机科学中,查找表是用简单的查询操作替换运行时计算的数组或者 associative array 这样的数据结构。

由于从内存中提取数值经常要比复杂的计算速度快很多,所以这样得到的速度提升是很显著的。

一个经典的例子就是三角表。

每次计算所需的正弦值在一些应用中可能会慢得无法忍受,为了避免这种情况,应用程序可以在刚开始的一段时间计算一定数量的角度的正弦值,譬如计算每个整数角度的正弦值,在后面的程序需要正弦值的时候,使用查找表从内存中提取临近角度的正弦值而不是使用数学公式进行计算。

在计算机出现之前,人们使用类似的表格来加快手工计算的速度。

非常流行的表格有三角、对数、统计 density 函数。

另外一种用来加快手工计算的工具是滑动计算尺。

一些折衷的方法是同时使用查找表和插值这样需要少许计算量的方法,这种方法对于两个预计算的值之间的部分能够提供更高的精度,这样稍微地增加了计算量但是大幅度地提高了应用程序所需的精度。

根据预先计算的数值,这种方法在保持同样精度的前提下也减小了查找表的尺寸/ 在图像处理中,查找表经常称为LUT,它们将索引号与输出值建立联系。

颜色表作为一种普通的 LUT 是用来确定特定图像所要显示的颜色和强度。

另外需要注意的一个问题是,尽管查找表经常效率很高,但是如果所替换的计算相当简单的话就会得不偿失,这不仅仅因为从内存中提取结果需要更多的时间,而且因为它增大了所需的内存并且破坏了高速缓存。

如果查找表太大,那么几乎每次访问查找表都回倒置 cache miss,这在处理器速度超过内存速度的时候愈发成为一个问题。

在编译器优化的 rematerialization 过程中也会出现类似的问题。

在一些环境如Java 编程语言中,由于强制性的边界检查带来的每次查找的附加比较和分支过程,所以查找表可能开销更大。

何时构建查找表有两个基本的约束条件,一个是可用内存的数量;不能构建一个超过能用内存空间的表格,尽管可以构建一个以查找速度为代价的基于磁盘的查找表。

另外一个约束条件是初始计算查找表的时间——尽管这项工作不需要经常做,但是如果耗费的时间不可接受,那么也不适合使用查找表。

[编辑本段] 例子 [编辑本段] 计算正弦值 许多计算机只能执行基本的算术运算,而不能直接计算给定值的正弦值,它们使用如下面泰勒级数(en:Taylor series)这样的复杂公式计算相当高精度的正弦值: (x 接近 0) 然而,这样的计算费用可能是非常大的,尤其是在低速的处理器上。

有许多的应用程序,尤其是传统的计算机图形每秒需要几千次的正弦值计算。

一个常用的解决方案就是在刚开始计算许多均匀分布数值的正弦值,然后在表中查找最接近所需 x 的正弦值,这个值非常接近于正确的数值,这是因为正弦函数是一个有限变化率的连续函数。

例如: real array sine_table[-1000..1000] for x from -1000 to 1000 sine_table[x] := sine(x/1000/pi) function lookup_sine(x) return sine_table[round(x/1000/pi)] Image:Interpolation example linear.png 部分正弦函数的线性插值不幸的是,查找表需要一定的空间:如果使用 IEEE 双精度浮点数的话,将会需要 16,000 字节。

如果使用较少的采样点,那么精度将会大幅度地下降。

一个较好的解决方案是线性插值,在表中待计算点左右两侧两个点的值之间连直线,这个点对应的直线上的值就是所计算点的正弦值。

这种方法计算速度也很快,对于如正弦函数这样的平滑函数来说也有更高的精度。

这里是使用线性插值的一个例子: function lookup_sine(x) x1 := floor(x/1000/pi) y1 := sine_table[x1] y2 := sine_table[x1+1] return y1 + (y2-y1)*(x/1000/pi-x1) 当使用插值的时候,可以得益于不均匀采样,也就是说在接近直线的地方,使用较少的采样点,在变化较快的地方使用较多的采样点以最大限度地接近实际的曲线。

更多的信息请参考插值。

[编辑本段] 计算 1 的位数 population function。

例如,数字 37 的二进制形式是 100101,所以它包含有三个设置成 1 的位。

一个计算 32 位整数中 1 的位数的简单c语言程序是: int count_ones(unsigned int x) { int i, result = 0; for(i=0; i result += x & 1; x = x >> 1; } return result; } 不幸的是,这个简单的算法在现代的架构上将需要数以百计的时钟周期才能完成,这是因为它造成了许多分支和循环,而分支的速度是很慢的。

这可以使用 loop unrolling 和其它一些聪明的技巧进行改进,但是最简单快捷的解决方案是查找表:简单地构建一个 包含每个字节可能值包含的 1 的个数的256 个条目的表。

然后使用这个表查找整数中每个字节包含的 1 的个数,并且将结果相加。

没有分支、四次内存访问、几乎没有算术运算,这样与上面的算法相比就可以大幅度地提升速度。

int count_ones(unsigned int x) { return bits_set[x & 255] + bits_set[(x >> 8) & 255] + bits_set[(x >> 16) & 255] + bits_set[(x >> 24) & 255]; } [编辑本段] 硬件查找表 在数字逻辑中,n位查找表可以使用多路复用器来实现,它的选择线是 LUT 的输入,它的输入是常数。

n 位 LUT 通过将布尔逻辑函数建模为真值表从而可以编码任意 n 位输入,这是编码布尔逻辑函数的一...

什么是fpga逻辑综合?

就算用了百分之95都不会有问题节省方法在于算法FPGA可以用来多任务并行处理,而不是和MCU一样的一条指令一条指令的进行!可以考虑用编译软件的自带系统优化Quartus就有,例如全加器之类的,库里有最优化的,直接调用比自己写好很多.

FPGA中组合逻辑和时序逻辑的区别

1. 概念太泛了,各有特点,不能直接比较。

两者的关系,就像两个圆,但是中间有一部分交集。

2. FGPA,包含硬件电路和软件编程。

硬件电路方面,因FPGA多用于高速信号处理上,所以更多偏向于PCB布线。

在软件方面(在某种意义上是嵌入式软件的一部分),需要花费更多的心思,这个是精华所在。

如果在大公司工作的话,基本上要么做硬件,要么做软件,只要一样能做精通就可以了。

小公司的话,可能两方面的能力都需要。

3. 嵌入式软件,顾名思义,在于软件编程。

软件需要在特定的硬件平台上实现,而硬件平台包含各种单片机,FPGA,DSP等。

在选择上,看你选用的是什么基础平台。

FPGA中 case和逻辑式的区别是什么?

1、FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。

它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

2、CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件,是从PAL和GAL器件发展出来的器件,相对而言规模大,结构复杂,属于大规模集成电路范围。

是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。

其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现设计的数字系统。

3、FPGA和CPLD的区别:①CPLD更适合完成各种算法和组合逻辑,FPGA更适合于完成时序逻辑。

换句话说,FPGA更适合于触发器丰富的结构,而CPLD更适合于触发器有限而乘积项丰富的结构。

②CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的,而FPGA的分段式布线结构决定了其延迟的不可预测性。

③在编程上FPGA比CPLD具有更大的灵活性。

CPLD通过修改具有固定内连电路的逻辑功能来编程,FPGA主要通过改变内部连线的布线来编程;FPGA可在逻辑门下编程,而CPLD是在逻辑块下编程。

④FPGA的集成度比CPLD高,具有更复杂的布线结构和逻辑实现。

⑤CPLD比FPGA使用起来更方便。

CPLD的编程采用E2PROM或FASTFLASH技术,无需外部存储器芯片,使用简单。

而FPGA的编程信息需存放在外部存储器上,使用方法复杂。

⑥CPLD的速度比FPGA快,并且具有较大的时间可预测性。

这是由于FPGA是门级编程,并且CLB之间采用分布式互联,而CPLD是逻辑块级编程,并且其逻辑块之间的互联是集总式的。

⑦在编程方式上,CPLD主要是基于E2PROM或FLASH存储器编程,编程次数可达1万次,优点是系统断电时编程信息也不丢失。

CPLD又可分为在编 程器上编程和在系统编程两类。

FPGA大部分是基于SRAM编程,编程信息在系统断电时丢失,每次上电时,需从器件外部将编程数据重新写入SRAM中。

其 优点是可以编程任意次,可在工作中快速编程,从而实现板级和系统级的动态配置。

⑧CPLD保密性好,FPGA保密性差。

⑨一般情况下,CPLD的功耗要比FPGA大,且集成度越高越明显。

随著复杂可编程逻辑器件(CPLD)密度的提高,数字器件设计人员在进行大型设计时,既灵活又容易,而且产品可以很快进入市常许多设计人员已经感受到 CPLD容易使用。

时序可预测和速度高等优点,然而,在过去由于受到CPLD密度的限制,他们只好转向FPGA和ASIC。

现在,设计人员可以体会到密度 高达数十万门的CPLD所带来的好处。

怎样才能写好FPGA逻辑时序

描述组合逻辑时,always 语句中的敏感信号列表中需要列出全部的可能影响输出的变量描述组合逻辑时,always 语句中的赋值总是使用阻塞赋值符号 =组合逻辑是描述输入和输出关系的功能块,由于延时的原因,输出可能会有毛刺,为避免避免毛刺需要引入冗余逻辑。

if..else case 语句只能用在 always 语句中,而且分支条件必须健全,否则会引入不必要的锁存器...

大家还关注
阅读排行
推荐阅读