原创 【博客大赛】所见即所得之Cyclone II架构中LE的详细描述

2013-12-8 11:13 5315 22 31 分类: FPGA/CPLD 文集: 所见即所得(WYSIWSG)

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原理,基本上逻辑单元的每一个端口都是能够连接的,且功能必须直接由参数指示。

本文将主要包含以下几段内容:

  • 组合逻辑WYSIWYG模块描述
  • 寄存器WYSIWYG模块描述
  • 描述逻辑单元中WYSIWYG模块的连接

2LE组合逻辑原语

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.jpg

 

图1:逻辑单元组合逻辑模块完整功能框图

2.5 LE组合逻辑使用

       LE的组合逻辑模块可以工作于普通(Normal)或者算术(Arithmetic)两种模式。

2.5.1 普通模式

         当LE配置为普通模式时,四输入查找表LUT能实现四输入变量的所有功能,其实是由四个数据输入描述的查找表LUT掩码决定。普通模式方程式如下所示:

Combout = F(dataa, datab, datac or cin, datad )

         图2显示了普通模式下的LE的组合逻辑模块。

1.jpg

 

图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组合逻辑模块。

1.jpg

 

图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:正常模式查找表掩码数据组成

1.jpg

 

         四输入查找表就像一个二选一树一样,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查找表的。

1.jpg

 

图4:16-bit查找表掩码如何分别映射到F0和F1查找表中

2.7LE组合逻辑模块极性以及极性默认值

         表2描述了LE所有输入端口的极性及其可编程取反硬件特性。能被可编程取反的端口信号具有双重极性。

表2:LE组合逻辑模块输入端口极性

1.jpg

 

         如果在原语实例中没有明确的设置,那么逻辑单元中的端口信号默认是未连接任何信号的。

 

 

 

 

 

 

 

 

 

 

 

 

 

文章评论9条评论)

登录后参与讨论

用户377235 2013-11-22 17:37

谢谢,这个帖子很关键。帮助到我了!

coyoo 2013-7-16 08:37

我所说的非法就是你所谓的“要求”本身就有可能非法。至于LE的工作模式,我这篇博文应该有详细的描述。说白了,如果只有combout输出,那肯定是normal模式,如果有sumout输出,那肯定是算是模式

用户1653654 2013-7-15 16:34

你说的值非法是什么意思?是说这个掩码有个范围,超过这个范围就不起作用了吗???我在chip planner里面也改过这个掩码,但是好像每次都不按我的要求来?? 另外还有一个问题,LE的两种工作模式怎么设定啊??是编译器自动按照功能来设置吗?

用户1653654 2013-7-15 16:32

你说的值非法是什么意思?是说这个掩码有个范围,超过这个范围就不起作用了吗???我在chip planner里面也改过这个掩码,但是好像每次都不按我的要求来?? 另外还有一个问题,LE的两种工作模式怎么设定啊??是编译器自动按照功能来设置吗?

coyoo 2013-7-13 20:28

你所谓的设置的掩码是在例化原语的时候设置的吗?如果在chipplanner里看到的值和你设置的不一样,有可能是设置的值非法,你可以试着在chipplanner里修改到你当初设置的值,看是否可行?

用户1653654 2013-7-13 10:17

怎么提交的代码格式消失了啊????

用户1653654 2013-7-13 10:17

楼主,能否请教个问题。我之前在使用这个原语(CycloneIII,QuartusII10.1)时遇到一个问题,现在还没有弄明白原因。当我设置了lut_mask后使用chip planner观察到的lut的值和设置的不同。比如: module Cycloneiii_lcell_comb_test(in,out,result); input[3:0] in; output out; output[1:0] result; wire cout;/*synthesis keep*/ cycloneiii_lcell_comb w1( .dataa(in[0]), .datab(in[1]), .datac(in[2]), .datad(in[3]), .combout(result[0]) ); defparam w1.lut_mask = 16'hf588; defparam w1.sum_lutc_input = "datac"; defparam w1.lpm_type = "cycloneiii_lcell_comb"; defparam w1.dont_touch = "off"; endmodule 你有没有试过这样做?或者说,我这里哪个地方出错了,能否指点下?

coyoo 2013-7-3 15:57

我知道这个功能,也一直在用,呵呵。我的意思是不知道什么原因导入的时候老是统计我的字数超标。一般这种超标根据我的经验:1.是图片;2.是表格;3.代码等。感觉EDN博客统计字数是根据占用的行数来统计吧。

用户403664 2013-7-3 15:26

在IE浏览器下可以使用高级编辑直接导入word文档呀,你是什么浏览器?

coyoo 2013-7-3 14:17

版面好差哦,无法使用高级功能直接导入word文档,只能打开word进行一段一段的复制粘贴工作,体力活啊。一不小心就超字数了^0^.看来要分两次了,说明一下,这里最后一张表格就是本人前面在开篇里提到的解决我一直以来在FPGA tdc设计中的疑惑,即逻辑单元(或者更高层的LAB)的端口具有可编程取反硬件结构,programable inversion。这个结构的作用在Stratix/Cyclone的EDA工具开发指导里有一些介绍。当然如果我们要对设计进行ECO修改,了解这个东东对我们理解综合工具以及fitter如何处置我们的逻辑设计非常有帮助。如果不能对底层布局布线有很好地理解,何谈ECO手动修改。
相关推荐阅读
coyoo 2024-11-16 13:54
不同ADC采样同一前端模拟信号时转换用时差异分析
概述 同一组前端模拟信号接入由不同型号ADC组成的模数转换电路时,采样后在FPGA中发现采样用时差异较大。本文主要分析这个时间差异形成的原因,并记录该差异产生对系统造成的影响。系统数字化简介 项目前端...
coyoo 2024-11-10 13:04
ALTERA Cyclone 10器件的使用-7:FPGA片内RAM资源利用率思考
概述 项目使用的FPGA目标器件为Cyclone 10 GX系列规模最大一颗料,由于功能升级增加了功能模块更多,发现器件片内RAM不够使用了。为了探索片内RAM使用的利用率问题,从代码RTL级与编译软...
coyoo 2024-11-10 12:30
转知乎:幽灵般的人体成像技术-PET
幽灵般的人体成像技术——PET - 知乎...
coyoo 2024-11-09 10:26
AD9633默认情况下调试记录(二)
概述 所谓默认情况,即如器件手册中图2所标示那样。对应AD9633的调试,除了涉及到ADC自身,还需要兼顾前端驱动器,系统中AD9633驱动器使用了差分运算放大器,这里不在赘述,笔者已有相关文章论述。...
coyoo 2024-11-07 10:40
AD9633默认情况下调试记录(一)
AD9633在旁路SPI接口时如何在FPGA逻辑中确认字边界概述 AD9633与FPGA之间的LVDS接口初调试,ADC可以通过SPI接口对其内部寄存器进行各项配置。在SPI接口未调通之前,对LVDS...
coyoo 2024-11-02 12:18
比较器检测模拟脉冲说明(三)
概述 继续说明(二)探讨的比较器使用问题,然后延展到高速比较器选型问题。第四次迭代已经修正了比较器与后级或门器件的互联端接问题,然而比较器输出仍然在较低参考阈值电压设置时出现了问题。本文主要探索该问题...
我要评论
9
22
关闭 站长推荐上一条 /2 下一条