1.概述
ALTERA的器件手册虽然介绍了LE,但是有些非常细节的内容在器件的handbook里是找不到的。实际上,大部分应用中FPGA工程师是没有必要详细了解这些细节的,只是如果了解这些细节对于FPGA的设计显然是有帮助的,比如当你进行诸如TDC的设计的时候。
Cyclone II的逻辑单元(Logic Cell)是在Cyclone基础上进行了成本优化,它们之间的主要区别有:
a、没有了取反端口(.inverta)
b、寄存器没有了异步加载(load)端口
c、简化了进位电路,没有了内部进位信号
根据我们以前对于FPGA中最小逻辑单元的了解(比如Stratix II中的ALM),基本的逻辑单元将主要分为两部分。一部分是组合逻辑部分,另一部分是寄存器部分。Cyclone II器件中的任一个LE都包含一个组合逻辑和一个寄存器模块。
同时,和Stratix II家族器件使用相同的WYSIWYG原理,基本上逻辑单元的每一个端口都是能够连接的,且功能必须直接由参数指示。
本文将主要包含以下几段内容:
2.LE组合逻辑原语
cycloneii_lcell_comb
(
.dataa(),
.datab(),
.datac(),
.datad(),
.cin( ),
.combout(),
.cout()
);
defparam .lut_mask = ;
defparam < lcell_name >.sum_lutc_input = < sum lut input choice>;
2.1 LE组合逻辑输入端口
:逻辑单元(Logic Cell)的唯一标识符。这只是一个命名而已,任何在HDL合法的标识都可以在这里使用,该标识是必须的。
.dataa(), … .datad ( ):逻辑单元的LUT输入端口。不同的LUT输入端口有不同的运行速度。Quartus II的fitter将会为设计选择最终的地连接。(注:在有关基于FPGA的TDC设计文章中,笔者介绍过其实可以通过ECO修改LUT的输入端口连接)。
.cin():逻辑单元的进位输入信号端口。该信号应该来自于另一个逻辑单元的.cout端口,它不能直接设置为GND,或者被取反,但是它能直接接VCC,后面会介绍如何连接.cin。
2.2 LE组合逻辑输出端口
.combout ( ):逻辑单元的组合逻辑输出。
.cout( ):逻辑单元的进位输出。需要注意的是当.cout连接到其它逻辑单元,那么它必须连接到其它逻辑单元的.cin端口。
2.3 LE组合逻辑模式
为连接到{datac,cin}中的一个。这里的模式(mode)表现的是什么连接到了求和LUT(sum LUT)中的“datac”,独立于逻辑单元的模式。如果“模式”是datac,那么上级LUT(或者全四输入LUT)的datac端口由datac上的信号驱动。如果是模式为cin,那么上一级LUT(upper LUT)(或者全四输入LUT)的datac端口由cin上的信号驱动。
是一个可选项,如果.cin端口连接了,那么默认为cin模式,否则默认为datac模式。
2.4 LE组合逻辑结构框图
图1展示了逻辑单元组合逻辑模块完整的功能框图。我们看到有五个输入和两个输出,下一节将详细介绍其最通常的应用。
图1:逻辑单元组合逻辑模块完整功能框图
2.5 LE组合逻辑使用
LE的组合逻辑模块可以工作于普通(Normal)或者算术(Arithmetic)两种模式。
2.5.1 普通模式
当LE配置为普通模式时,四输入查找表LUT能实现四输入变量的所有功能,其实是由四个数据输入描述的查找表LUT掩码决定。普通模式方程式如下所示:
Combout = F(dataa, datab, datac or cin, datad )
图2显示了普通模式下的LE的组合逻辑模块。
图2:普通模式下LE的组合逻辑模块
2.5.2 算术模式
在这个模式下,除了正常的查找表输出(即combout)外,还有第二个查找表用于计算进位输出。请注意这里两个查找表不是完全独立的,实际上,当你将上述组合逻辑输出(combout)方程式F中的datad固定为0时,你将得到的就是进位输出(carryout)功能。
通常,.datad是连接到VCC,那么正常的查找表的输出是通过统计.dataa,.datab,以及根据sum_lutc_input的值选择.datac或.cin这三者的和得到。而第二个查找表通过实现基于.dataa,.datab以及.cin的方程式来计算进位信号。上述两个方程式分别表示如下:
Combout = F1(dataa, datab, datac or cin) & datad # F0(dataa, datab, datac or cin) & ! datad
Cout = F0(dataa, d a tab, cin)
图3显示了工作于算术模式的LE组合逻辑模块。
图3:算术模式
2.6 LUT掩码推导
指明了逻辑单元中查找表LUT中的值。这些值是属于由4个十六进制数字组成的数字,或者16位二进制数值。
注:Quartus II编译器可以使用LUT掩码的任何格式,包括十六进制、二进制或者常数形式。如果使用Verilog为了兼容仿真模型以及第三方工具,最好给分配一个常数形式(十六进制或者二进制根均可)。比如,使用
defparam in stan ce_name .lut_mask = 16'hFF00; 或者
defparam instan ce_name .lut_mask = 16'b 111 111 11000000 00;
而不是使用
defparam instan ce_name .lut_mask = "FF00"; 或者
defparam instan ce_name .lut_mask = "1111111 100 000000";
查找表掩码使用正逻辑数,其组成格式如表1所示,表1显示了当这16-bit顺序如O15 O14 O13 …O2 O1 O0这样时数据是如何组成的。
表1:正常模式查找表掩码数据组成
四输入查找表就像一个二选一树一样,LUT的第一个输入控制第一级的二选一,第四个输入控制最后一级二选一(即在0和1之间选择),整个组合的输出就是LUT的输出。
如果我们设定LUT的第四个输入为0或者1,那么16-bit的LUT掩码天然地被分为两个8-bit部分,即F0和F1,每一个表现如一个三输入LUT。这对于逻辑单元工作于算术模式非常有用。在这种情况下,LUT第四个输入为0时对应的8个LUT输出位对应于F0方程式输出,第四个输入为1时对应的8个LUT输出位那么就对应于F1方程式输出。图4显示了LUT掩码AA34是如何映射到F0和F1查找表的。
图4:16-bit查找表掩码如何分别映射到F0和F1查找表中
2.7LE组合逻辑模块极性以及极性默认值
表2描述了LE所有输入端口的极性及其可编程取反硬件特性。能被可编程取反的端口信号具有双重极性。
表2:LE组合逻辑模块输入端口极性
如果在原语实例中没有明确的设置,那么逻辑单元中的端口信号默认是未连接任何信号的。
用户377235 2013-11-22 17:37
谢谢,这个帖子很关键。帮助到我了!
coyoo 2013-7-16 08:37
用户1653654 2013-7-15 16:34
用户1653654 2013-7-15 16:32
coyoo 2013-7-13 20:28
用户1653654 2013-7-13 10:17
用户1653654 2013-7-13 10:17
coyoo 2013-7-3 15:57
用户403664 2013-7-3 15:26
coyoo 2013-7-3 14:17