本帖最后由 FPGA课程 于 2024-8-15 14:07 编辑
软件版本:无
操作系统:WIN10 64bit
硬件平台:适用所有系列FPGA
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!
1概述由于FPGA需要被反复烧写,它实现组合逻辑的基本结构不可能像ASIC那样通过固定的与非门来完成,而只能采用一种易于反复配置的结构。查找表可以很好地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构。LUT本质上就是一个RAM。它把数据事先写入RAM后, 每当输入一个信号就等于输入一个地址进行查表,找出地址对应的内容,然后输出。 7系列FPGA中的函数发生器实现为六输入查找表(LUT)。slice的4个函数发生器(A,B,C和D)中的每一个都有六个独立输入(A输入A1至A6)和两个独立输出(O5和O6)。 这篇短文中,我们通过一个简单的加法器来了解下LUT如果实现加法器功能。 2加法器代码
- module ADDER(
- input [0:0]A,
- input [0:0]B,
- output [1:0]Q
- );
- assign Q = A + B;
- endmodul
复制代码
3加法器原理图从VIVADO 左侧的 RTL ANALYSIS选择打开原理图
加法器原理图如下图所示 4综合代码后查看原理图
综合后的原理图可以看到IBUF以及LUT和OBUF
单击红框的LUT2单元,然后在左手边查看LUT2的属性
同理单击红框的LUT2单元,然后在左手边查看LUT2的属性
可以看到以上图中的初始值,就是LUT查找表的值,通过查表我们可以看到加法器的可以执行的结果。 A:LUT2初值位4’h6 二进制表示位3’b110 ; B:LUT2初值位4’h8 二进制表示位4’b1000 A | B | ADDR | Q_OBUF[0]_inst_i_1 | ADDR | Q_OBUF[1]_inst_i_1 | Q[1:0] | 0 | 0 | 0 | 0 | 0 | 0 | 2’b00 | 1 | 0 | 1 | 1 | 2 | 0 | 2’b01 | 0 | 1 | 2 | 1 | 1 | 0 | 2’b01 | 1 | 1 | 3 | 0 | 3 | 1 | 2’b10 |
通过以上的简单分析,相信大家可以掌握LUT实现逻辑单元功能的本质了。 5带有进位链的加法运算增加加法运算的的位宽 - module ADDER(
- input [5:0]A,
- input [5:0]B,
- output [6:0]Q
- );
- assign Q = A + B;
- endmodule
复制代码
综合后,查看电路图结构
可以看到,此图中,使用到了6个LUT,那么6个LUT分布在2个竖直的Slice中,这一点,我们在前面介绍CLB结构的时候液晶介绍过CLB内部的进位链。不妨再温习下,如下图所示:
因此当一个CLB里面的LUT不足以完成加法运算的时候,通过进位链逻辑电路,可以实现多个Sclice级联完成更大的加法运算。 6那么乘法运算呢?这篇课程的内容主要目的还是以简单的例子,让大家认识FPGA,认识了FPGA的电路结构,对后需要的软件编程会有很大帮助,做到软件硬件的最佳配合。至于乘法器,主要会使用DSP48资源,目前我们不做介绍,以后有机会再去解密DSP48资源。 到目前为止,我们已经完成了3个课时的介绍,这3个课时介绍主要是未来让读者可以学习到FPGA的基本硬件基础。这个道理就比如虽然是做数字电路编程的,你依然得懂一些模拟电路。那么后续的编程中,虽然是对硬件编程,但是很多时候可能你不知道硬件电路的具体实现方式,依然可以写出可以正常运行的代码。但是经过我们这几个课时基础的分析,以及后面我再讲解完成基本的FPGA编程入门,完成一些项目方案后,笔者还要带领读者进一步学习FPGA硬件编程方面时序分析的内容,这样完成了FPGA的学习才能真正做到所写的代码更加适合在FPGA上运行。 在开始学习编程前,笔者把10个要点先总结下: 1)、不要太多的if—else 嵌套 2)、不要编写过于庞大的状态机 3)、复杂的状态机,可以采用2段式以上的实现 4)、尽量使用时序逻辑完成编程 5)、使用组合逻辑不要过于庞大 6)、复杂代码拆分简单模块 7)、复杂计算,增加流水设计 8)、高速模块和低速模块搭配使用 9)、case语句一定有default 10)、组合逻辑有if必须有else防止产生锁存器,锁存器所以出毛刺 为什么要有这10个要点,一切皆因FPGA是电路,是电路就有延迟,电路规模越大,走线越长,速度越高,可能就会超出电路的运行速度,从而产生错误。所以我们要让部分电路实现快慢有序,实现最佳的搭配。
|