文档库 最新最全的文档下载
当前位置:文档库 › 玩转 IP core

玩转 IP core

之一之一::我们的目标是ASIC .......................................................2 之二之二::所见非所得....................................................................4 之三之三::统一行动听指挥............................................................7 之四之四::踏雪寻熊踏雪寻熊---------面积与速度的协调面积与速度的协调................................11 之五之五::我还要有激励我还要有激励---------测试向量生成测试向量生成................................14 之六之六::程咬金的三板斧程咬金的三板斧------系统基本结构系统基本结构..............................16 之七之七::一个计数器引起的思考..............................................21 之八之八::小学一年级水平小学一年级水平,,加法器的结构..............................25 之九之九::小学二年级水平小学二年级水平,,乘法器的结构..............................30 之十之十::升入小学三年级升入小学三年级,,除法器的结构..............................33 之十一之十一::非线性求值的孤独九剑非线性求值的孤独九剑,CORDIC ,CORDIC 方法..................36 之十二之十二::电路串串香电路串串香,,D 触发器链.......................................40 之十三之十三::简直的层层叠简直的层层叠,,FIR 滤波器的串联实现..............42 之十四之十四::我的地盘我做主我的地盘我做主,,锁相与分频..............................48 之十五之十五::国球与其它国球与其它,,输入输出系统介绍..........................52 之十六之十六::来个批发价来个批发价,,多路数字中频系统设计..................56 之十七之十七::看客做饭看客做饭,,CDMA 接收机的同步.............................61 之十八之十八::磨刀不误砍柴工磨刀不误砍柴工,,程序的风格 (66)

《玩转IP core

ASIC

之一:

:我们的目标是ASIC

IP core》

》之一

---FPGA/ASIC设计流程与IP core介绍

各种讲座一般都是从“痛说革命家史”开始的,例如哪年出现了什么啊的。感觉从PN结、晶体管说起的,都算客气,没说开天辟地、三皇五帝。这里我不免俗的给大家几个网址,自己看看好了,如果你有兴趣(如果英文好,建议看对应的英文资料,更翔实些):

FPGA介绍:

https://www.wendangku.net/doc/934623807.html,/wiki/FPGA

ASIC介绍:

https://www.wendangku.net/doc/934623807.html,/wiki/%E7%89%B9%E6%AE%8A%E6%87%89%E7%94%A8%E7%A9%8D%E9%AB%94 %E9%9B%BB%E8%B7%AF

具体到一个产品里面,到底是采用FPGA还是ASIC,这个问题是多方面确定的。简单说,如果产品出货量小、时间紧、生命周期短,那么FPGA比较适合;反之就建议ASIC。但是,也不是完全绝对的,就像很难说少林和武当那个更牛一样。幸好,这不是大多数一般工程师需要考虑的问题。我们就不详细讨论了,把这个恼人的问题留给高薪(实际也没大家想象的高,但是,阿Q 说:你总比我富)的架构师和产品经理们去头疼好了。

闲言少叙,言归正传。

估计大多数客官应该是数字逻辑设计工程师,我就看人下菜碟,首先介绍一下,我们职位的输入和输出、还有如何从输入走到输出。装严肃,这就叫数字逻辑的设计流程。

为了叫我们干活以获得剩余价值,资本家们会雇佣一些系统架构工程师和算法工程师来写文档给我们输入。这些输入一般叫做算法说明书和系统架构说明书。

算法说明书里面,洋洋洒洒充满了各种各样的数学公式、计算流程。如果你足够幸运遇到好的算法工程师,那么你还能看到算法的结构图。这些都是告诉我们,我们该把什么量做什么运算,以及什么时候运算。

系统架构说明书的作者,显然和我们更有共同语言,因为他们大多数是我们的前辈。在这些资料里面,会有系统有那些模块、模块如何设置、模块何时启动以及模块之间的接口定义、模块的时钟频率等等。按道理,还应该有各个模块的规模要求,但是这个太难了,大多数系统架构师也得叫“臣妾,我做不到啊”。

那么我们又如何说服老板:“我们干活了,您花的薪水不亏”呢?如果您是在FPGA上实现的,那么您需要利用软件生成可以在FPGA上运行的二进制文件,叫二进制文件欢快的跑起来。如果你的目标是ASIC,那么我们不叫ASIC工程师,而是ASIC前端工程师。(有前端肯定还有后端了,他们的区别属于“小孩没娘,说来话长”,我就不多啰嗦了,省的您说我话唠。)ASIC前端工程师输出的是所谓网表文件,里面是门级电路的连接和约束关系。这个给后端的兄弟来布局布线,后面还有加工的孩子们研究工艺、加工什么的。(ASIC就是麻烦,没办法,谁叫人家速度快、后期价格便宜呢?)

按照设计流程,我们上面定义了系统的输入输出,下来我们来掰扯掰扯模块行为。首先,我们需要把输入的文档变成真正硬件描述语言需要的图,可以是原理图、时序图或者状态机图。(有的看官要说了:竟然没有流程图,这个可以有啊?答曰:这个真没有。具体原因我们会在后面一讲里面介绍。)下来,我们照图说话,用硬件描述语言实现系统/模块的行为模型。接着,经过前仿真(行为仿真)、实现、布局布线和后仿真(时序仿真),我们就打完收工了。(妈妈咪啊,一堆名词啊。鉴于篇幅,不详细解释了,可以参考我可爱的Wiki百科:

https://www.wendangku.net/doc/934623807.html,/wiki/%E9%9B%86%E6%88%90%E7%94%B5%E8%B7%AF%E8%AE%BE%E8%AE%A1。还有与非文章参考https://www.wendangku.net/doc/934623807.html,/rainlt/blog/07-10/75596_d8dc7.html。“拿人的手短,吃人的嘴短”,就算投桃报李吧。如果您不是专门的设计工程师,可能有些晕。不过没关系,这些绝对不会影响您下来的理解。因为,这个讲座不是讲如何做工作的,而是关注于步骤一,如何画图。下来步骤都是经验,只要做过一次就驾轻就熟了。)多说一句,对于ASIC设计,最后一步是前后端乃至工厂合作完成的。当然,所有步骤都有验证和测试工作,这个不劳多说。

上图是一个描述,下面是可以采用的对应软件。(对于这个图,请求您不要和我较真。如果你该非说为什么用Modelsim而不用VCS啊,我无话可说,真的没有拿Mentor的广告费。当然,如果M愿意资助本讲座,我自当笑纳。)图里面,多了一个简单后仿真,此乃Synpilify一个功能,可能模拟处理时延,叫我们更早验证设计。(又有广告嫌疑啊。)以上内容,可以在FPGA厂家的集成环境,例如Xilinx的ISE或者Altera的Quartus II。(这次说全点,这叫避嫌。)

花开两朵,各表一枝。

话说工程界里面总是充满着各种争论,例如:到底是多用DSP呢,还是ASIC?我们都是工程师,不属于时尚界,在开发的过程中也会遇到各种取舍。FPGA的开发总而言之,存在着两个流派:到底是基于厂家的IP core的快速开发 ,还是面向ASIC的基础开发。前者,工作量小、开发效率高,但是,却无法直接将我们在FPGA上的设计引入未来的ASIC设计。后面的方法呢,虽然存在直接将我们在FPGA上的设计引入未来的ASIC设计的可能,但是耗时耗力,开发周期长。还是武当少林的说法,这两个方法都没有绝对的对错,所谓“存在即合理”,只是要区别应用场合选择。

我不会讨论什么商业模式啊,FPGA公司可持续发展啊,这些无聊的内容,省的背你们转发五百次。各位看看本讲的内容,也应该明白了,以后的内容肯定是为后面的方法定制的。(哗啦啦,走了一半的人。开口饭难吃啊。为了某家明天的嚼谷,请列位准我做一个小小的广告:“这个讲座也适合做算法的人员。所谓“知己知彼,百战不殆”。听了我的讲座,就不会出现下文书里所讲的 ‘被除3’的尴尬了。”

《玩转IP core

所见非所得

之二:

:所见非所得

IP core》

》之二

Verilog语言与实现性

古人有诗赞道:“道德三皇五帝 ,语言二V相争,五霸七雄闹春秋 ,功过兴亡过手,设计几人操心 ,公司无数白首 ,前人播种后人收 ,都是硬件描述。”(练家子:古人?Verilog 语言是由Gateway设计自动化公司的工程师于1983年末创立的;VHDL语言诞生于1983年,1987年被美国国防部和IEEE确定为标准的硬件描述语言。这个古人也“古”不到哪里去。上板砖!前排的:谁家熊孩子乱扔垃圾。。。。。。。。。。。。)

却说某日,上海张江路上来了一位帅小伙,但见他:二十四五岁,穿青挂皂,长得眉清目秀,面白如玉,干净利落,傲骨迎风,鼻梁上颤巍巍,一副深度大眼镜。挽着袖面,右手一张明晃晃硬件设计聘用书。书中暗表,怀里揣着某著名大学硕士毕业证。此人就是江湖人称作妙手程序无人敌,道号变成小新的新大虾。

但见此人沿路缓缓前行,忽然遇到一双阳岔道。只见,左边树立一块路标,上书:“Verilog,人见人爱,花见花开”,下面几行小字“通用HDL,易学易用;与C语言类似;允许对同一个电路进行不同抽象层次的描述,包括开关级、门级、RTL级或者行为级描述电路; 即可以设计电路,也可以描述电路的激励,用于电路的验证; IEEE标准,得到绝大多数EDA工具的支持;设计的工艺无关性,支持综合;等等等等”。也见,右侧那个路牌式样一般无二,金灿灿几个大字:“VHDL,有些事一旦错过就不在”,再向下也是介绍“用来描述逻辑设计的结构;采用类似高级语言的语句格式完成对硬件行为的描述,具备更强的模块化能力; VHDL调试过程灵活;balabala……”。 新少侠正在犹豫之间,看到路边有一茶馆,名曰“与非茶社”。茶馆内端坐一位掌柜,五短身材,满脸肥肉,一双小眼睛四处放电,一看便是包打听之类的人物。少侠忙进店,要了一壶上好的猴魁,顺道打探道:“敢问掌故的,门前两条道,那条方为正途?”那掌故,微微一笑,说道:“少侠莫急,带我慢慢道来:

前几日,我店来一大汉,手持哨棒,要了一十八碗好酒,一饮而尽,兴冲冲向着左边道路而去。又有一客官,坐定时浑如虎相,走动时有若狼形。在我壁上题诗一首,后面两句小子还记得是:‘他时若遂凌云志,敢笑武平不丈夫!’。此人向右边走了。”

“那后来呢?”

“后来?后来都在H公司加班呢!”

“为何不同的方向都到一起了?此中有何蹊跷?”

“说来简单,难得哦君不知古语有云:殊途同归。”

话外音:在下从事数字逻辑设计都是用的Verilog,因此写起来顺手一些,所以以后例子什么的都用Verilog描述。子曾经说过:说书的一张嘴,表不来两家事。敬请各位VHDL高手见谅,不要口诛笔伐了,都是出来混的,相煎何太急啊。

新少侠汇了茶钱,抬腿便要向左行去,却被掌柜拦住去路。

“少侠莫急,某家拦你并非为了剪径打劫。只是觉得与客官投缘,免费指路则个。左边一路下去,三山五关并一江。

三山是:‘寄存器传输级描述’峰、‘逻辑门级描述’山和‘晶体管级描述’岭,一山更比一山高。

五关为:数据关,主司数据类型定义;流程关,主司数据流向;运算关,主司数学运算;任务关,主司程序输入输出;编译关,主司文件替换。

一江就是‘时延’河,无比宽广。”

新手一听发了怒,用手一拍桌子:“说人话!”

掌柜忙把广告发:“WIKI百科无所不包:https://www.wendangku.net/doc/934623807.html,/wiki/Verilog。”

但见那少侠向着加班的目的地,大步而去。

这段书就叫:新手侠问道与非网,胖掌柜细说描述语。

(说书的正想把台下,小二传来老板的话:接着说,老板叫你接着说。唉,到底是资本家啊,狠。所谓浮动工时,我们这行没加班费的。。。。。他不仁,休怪我不义,来个甄嬛体恶心人。)

方才臣妾见皇后在屋中烦闷,想必是在做软件做久了,再好的程序也难免腻歪。可巧儿前期与非网放出消息来,说是FPGA板块有个什么劳什子讲座,单就说书倒也罢了,断不敢惊扰皇上的,奇就奇在如何应用Verilog语言上。我空长这许多年,从来只是想Verilog既然和C语言类似,定然编程方法和流程也是一般无二的。哪曾想到模样儿一样,这做法竟然大相径庭,这对奴家真的是匪夷所思啊。难为那说书巴巴地唠叨,还邀请了各路名角儿撑场,只盼着能说服臣妾痛改前非。如若置之不理,倒真真辜负了他们的一番心意。奴家仔细听解,也与皇后皇帝细说端详,一则可体现皇上虚怀若谷之心,二则可解后宫姐妹编程烦躁之苦,四郎以为如何?臣妾闲来无事,拟了个要点单子,供四郎一览。

私心想着,数字逻辑这大好河山,怎得和程序语言一般谋划?如此这般下去,却让数字逻辑工程师情何以堪?FPGA自古至今都是并行工作,越发不似程序语言顺序运行。方才主力开会,本宫自是无言以对,料想再搬语言设计,后果定是真真严重的。怎奈积习难改,本宫也只得四处奔走劝说,却也是泥牛入海。宫里王大总管方才回话,要本宫写一流程,也好对孩儿们说明。回想本宫工作多年,却也落得个如此下场,打工的日子真真是越发难过了。

旦逢项目的第一天,切勿忙着编码,却谨记原理图设计为先的要点。虽是用语言表示,逻辑设计归根到底还是电路设计不是?窃思,如此原理图可以放宽表现,以为电路图、时序图与状态机图皆为可用。

说人话:Verilog设计应该“看图说话”。

这里买一送一,再提供硬件描述语言的综合流程图一份:

妾身。。。。。呸呸呸,还是说人话吧。

不知各位在看书还有写程序的的时候,是否想过:这句话如何实现啊?例如:看到IF语句,小脑瓜里面出现一个选择器。如果想过,那么恭喜你,你已经不是菜鸟了。如果还没有,那么恳切地建议你试着想一想,绝对有好处。

老衲在学Verilog的时候,还是一个小沙弥。当时,想破了我的乳(乳是小的意思,别邪恶)头,也没想明白那个时延10 ps(#10)在电路里面是如何严格控制的。直到一天,我遇到了Synopsys 的烧火头陀,才被告知不是每个语句都会被实现的。Sodesune(そうですね,有一种个人感情在里面,就想“是呢”“就是这样呀”,有一种感叹的感觉)!把我激动的都说鬼子语了。一句话点醒梦中人啊。于是,发一宏愿,要把所有Verilog语句列一个表,纪录其可实现性。结果呢,现在还在这里加班,没有成佛。

这里给个小例子,假设仿真时间单位是ps:

A = #10 B;

在仿真里面,B信号变化10 ps之后,A变成与B一致。

实现后,就成了:

A = B;

实现工具会自动忽略不可实现部分。

虽然没有完全总结,但是以下东东肯定不会被实现:

initial

events

real

time

force

release

assign

deassign

fork join

primitives

table

说完收工,回家抱娃,谁拦我,和谁急。

还有一个广告,一讲尤其重要,亲们一定要来啊。

:统一行动听指挥

统一行动听指挥

《玩转IP core

之三:

》之三

IP core》

系统中的时钟与时延

今天,我将带领大家来个缩骨大法,将我们缩小到原子的尺度,来参观FPGA/ASIC的内部风景。新《旅游法》已经实施了,本次旅游绝无自费项目和强制消费,请诸位放心。尚未买保险的客人们,请与与非门联系购买事宜。

各位游客,现在我们正沿着PCB数据大道,走向芯片大厦----就是大家眼前的巨大的、银色的大厦。我是本次旅行的导游,敝姓十,大叫可以叫我十导。路途之中,为了大家不感到无聊,本人先给大家略略介绍一下,什么是数字电路的时钟。

数字电路中,时钟是整个电路最重要、最特殊的信号。

第一:系统内大部分器件的动作都是在时钟的跳变沿上进行,这就要求时钟信号时延差 要非常小,否则就可能造成时序逻辑状态出错。

第二:时钟信号通常是系统中频率最高的信号。

第三:时钟信号通常是负载最重的信号, 所以要合理分配负载。

好的,今天的参观,我们就从芯片的时钟树结果开始。由于上面介绍的特点,在芯片这类可编程器件内部一般都设有数量不等的专门用于系统时钟驱动的全局时钟网络,这种网络就叫做时钟树。从顶端看下去,可以看到从相同的时钟管脚开始向下延伸,如同人类的血液系统,芯片中的时钟信号被传递到各个寄存器。这个时钟,到达远端的寄存器,需要经过漫长的电路,所以片外的时钟芯片需要被锁定和增强,才能够驱动这数以亿计的寄存器。不仅如此,为了达到系统同步的目的,所有寄存器的时钟信号到达时刻允许的差别(时延,用洋文说就是skew)也需要特别的小。还需要考虑信号的完整性问题。妈妈咪啊,这些看起来似乎很难。套用一句13年春晚里面的台词:幸好,我们不必操心这些。

话虽如此,如果你抱着“事不关己,高高挂起”的态度,乱设计系统的时钟的话,后端设计工程师绝对会带着刀子找你拼命的。不要叫别人打你个满脸桃花开,你才知道花儿为什么这样红。“本是同根生,相煎何太急”啊,兄弟。

大伙,随我来,将会看到四座巨大的雕像。这几座雕像以后现代解构主义的手法,表现了四种不同的时钟形式。

第一位是大名鼎鼎(小名吗不清楚)的全局时钟(Global Clock)。它是由片上的时钟管脚引入,经过锁相和放大之后,输出给寄存器的稳定、可靠的信号。这种时钟的时延被设计的最小,相对时延也最小。

图一

第二座是为了纪念数字逻辑设计里面愚蠢的时钟:门控时钟。这种时钟从一些信号经过组合逻辑产生,表面上看着一个字:美。但是,既然设计中连时钟的同步都做不到,难道组合逻辑的同步就那么简单吗?答案是:(做到同步)这个真的没有。于是,麻烦来了,这个组合逻辑的时钟,也会上窜下跳的了,整个一个孙猴。试问,这种时钟谁敢用?哪个艺高人胆大的,来试试?

图2

下来,为了体现IQ无下限,我们见到了第三座雕像:多级逻辑时钟。它不仅仅用了组合逻辑还加入了前级寄存器的输出。所谓,毛刺也无极限啊。哪个艺高人胆大的,想来试试?

图3

最后也是一个“英明”的设计:行波时钟。如同莫小贝的最爱----糖葫芦,上级寄存器的输出作为下级寄存器的时钟逐次传下去。理论上,行波时钟可以非常完美的运行下去。但是,在这里总是有但是的,但是,考虑到这些寄存器时间的时钟的时延控制的难度,我们不得不说:行 波链上的时钟波动会变得极大,最终破坏整体时延要求,使得系统的整体工作时钟严重降低。

图4

有诗赞曰:芯片设计万万千,抓住时钟是关键。四大金刚长得帅,修得正果唯全局。

有的客人会说了:不是有多时钟系统吗?多时钟是有的,但是或者需要通过同步化,或者不同时钟系统之间需要某种隔离。这两个技术,在后面的讲座中,都是会遇到的。

来,我们会进入时延实验室,免费体验一下信号的时延。下图是一个信号有全0变为全1的例

子,可以看出不同阶段的信号变化时机不完全一致。只有后仿真的结果,才是与系统比较契合的。所以,如果只做前仿真,再快的时钟也是可以的。

图5

但是,如果在后仿真阶段,时钟快到了低于系统的处理时延,麻烦就来了。见下图,如果时钟上升沿在信号变化的中间,那么输出信号就不是”1111”而是”1011”。你就摊上事了,摊上 大事了。

另外,还有一点,信号的位宽越大,那么对应的处理时延和skew也会越大,这点很重要。

图6

各位游客,今天的旅行到此就结束了。欢迎下次光临。

玩转IP core IP core》》之四之四::踏雪寻熊踏雪寻熊---------面积与速度的协调面积与速度的协调面积与速度的协调 考TOEFL 和IELTS 的时候,记住了了一个英文词“dilemma”。汉语翻译呢,文艺青年叫:“进退维谷”,一般青年是:“窘境”,2B 青年会说:“两难”。孟老夫子在几千年前曰:“鱼与熊掌不可兼得”,徐克大虾就在《满汉全席》里面解决了这个千年难题:“踏雪寻熊”。(附菜谱:用北极白熊的掌,和高丽参、法国白酒一起炖六个小时;去骨后用针板扎出密密麻麻的小孔,用针筒注入无色无味的低温氮气,再加入一碗鲟龙鱼汤,氮气在高温下把汤吸入熊掌,表面抹上鱼子酱,然后放入冰箱急冻。酥烂的熊掌中包含着清澈透明的鲟龙鱼汤冻,表面上是黑亮的黑海鱼子酱,银勺子舀下去,满满的颤微微亮晶晶,鱼子先在口腔里迸放,鱼冻又继而在舌尖上融化,这样当熊掌从牙齿上被切割开的时候,愉悦就无法不从心底里产生了。)

可惜,我们做工程的不能这么不计成本。所以,又有一个装B 的词来了“tradeoff”(记住了以后忽悠用)。具体到我们的FPGA/ASIC 设计,这个“鱼”就是面积,而“熊掌”时钟频率(速度)。能不能很好的协调面积与速度的关系,是衡量一个数字逻辑设计工程师能力的一个重要标准。在本讲座的第二篇里面,会说明各种单元模块的不同面积和速度的基本解构;在第三篇中,则会通过例子,介绍如何在系统中很好综合考虑两者的关系,选择比较合适的实现解构(上面那一堆话,就是所谓tradeoff 了)。

先给大家讲一个故事,是我在某著名山寨手机芯片设计厂家的事情。有一次面试一位南洋某著名大学毕业的interviewee (被面试者,‘-ee’词根,表示被…者;对应主动的词根是‘-er’,所以我是interviewer,面试者。Sorry,串台了,今天不是英文课。)。当时,此人主要申请的就是数字逻辑设计工程师。所以,我提问:“请给我设计一个计数器…”。我话声未落,这位老兄就开始写了。于是乎,判语:此人顶多就在学校学过,绝对没有搞过工程。为咩呢?理由1:我没给计数器位数;理由2:我没给时钟频率。在这两个条件缺失的前提下,大罗金仙也不知道该如何设计。天地良心,我真不是故意的,是这位仁兄太心急了。后来呢?后来,此人没有应聘上。再后来,老板不叫我做面试了。因为我面的太严,招不到人的。这是我不识时务的结果,大家共勉啊。

如果在座的谁有Xilinx 或者Altera 的集成环境,可以准备好。试验一下下,感觉更好。子曾经曰过:“学而时习之,不亦说乎?”。(由于版权问题,我没有这些软件。谁有了结果给我提供一下,设计评估出来的面积(LE 数量)以及时钟频率,鄙人在此不胜感激涕零。) 先来一段程序

module adder1_LUT (a, b, c);

%============================================

%Module definition: LUT increaser

%Ports:

% a: input number, 2 bits

% b: results as a + 1, 2 bits

% c: carry flag, 1 bit

%History:

% 10/08/2013: Creation

%============================================

input[0:1] a;

output[0:1] b;

output c;

always (a)

begin

case (a)

%results depends on the value of a

2’b00 : b <= 2’b01; c <= 1’b0;

%a = 0, then b = 1, c = 0

2’b01 : b <= 2’b10; c <= 1’b0;

%a = 1, then b = 2, c = 0

2’b10 : b <= 2’b11; c <= 1’b0;

%a = 2, then b = 3, c = 0

2’b11 : b <= 2’b00; c <= 1’b1;

%a = 3, then b = 0, c = 1

endcase

endmodule

顶你个肺啊,这是嘛东东啊?

这就是一个2 bits的加1器,b是a+1,c是进位标志。“有图有真相”,本例子的卡诺图见下。

这个例子很简单,但是代表了一个很极端的例子:查找表(LUT, Look Up Table)。事实上,所有的逻辑都可以用查找表实现,代价是面积奇大无比。组合逻辑如何实现,想来大家明白了。即使是带有时序的逻辑,也可以通过一个计时器加上case的方式实现,由于实际中应用不广, 就不详细介绍了。

这个例子由于位宽很小(只有2 bits),实现的面积还是可以接受的。现在软件很牛的,连卡诺图化简都不用您亲自动手了。大家只要有耐心,只要ctrl-C和ctrl-V,请试试32 bits或者64 bits的情况。那个面积用得哗哗的,很感觉败家啊。(心理说:反正不是自己的钱。面积是公司的,身体是自己的。但是,你敢全是查找表,自然有人收拾你。我们,骑驴看电视----走着

瞧。)

也不是说,不能用查找表来实现工程,要不我也不啰嗦这么多了(有没有版面费的)。还是那句(绝对正确却不知道如何操作的)话:看实际系统要求决定。

顺便说来个广告,这个程序的风格是鄙人推荐的。具体有哪些需要注意的,我们番外篇《磨刀与砍柴----程序的风格》见。

话分两头,我们再看看所谓的pipeline(流水线)解构,还是上面的2 bits的加1器,其结构如图。这里面,有一个假设,就是a与时钟同步的,否则会产生问题。这个后面的讲座,有具体介绍。

我们可以看到,每个时钟节拍,只进行一次全加器运算,逻辑的建立时间很短,所以这个结构可以允许更高的时钟频率。但是,流水线把一个运算分解成了多个步骤,所以运算的整体建立时间一般不会提高的。

总而言之(这个英文叫all in all),我们的设计是三个方面在拔河。这三个方面是:系统需求、面积和速度。三个力量最终的中心点,就是一个最好的设计了。可惜啊,这种“中庸”的结果很难得到的。

估计大家都在等我的打油诗,好去睡觉了。这就来了。

这正是:孟轲长叹做菜难,徐导妙手寻熊宴。面积速度相较能,中庸之道保平安。

《玩转IP core IP core》》之五之五::我还要有激励我还要有激励---------测试向量生成测试向量生成测试向量生成 在前面的话:

我本来很犹豫是不是还要写这一讲的内容,按理说每个讲FPGA 或者数字逻辑设计的材料中都会不遗余力的对测试向量(Test bench)进行介绍。而且,如何对于测试向量进行编程,也是数字逻辑设计者的基本功。更重要的是,这部分内容比较乏味,绝对会减少某家很多观众。(这是私利,不能明说的。)

在看了一些有关别处的资料之后,我发现很多材料还是就设计说设计。这样不能说错,但是还是有偏颇的。所以,我决定从系统角度和大家掰扯掰扯这个测试向量的问题。

在不考虑电源输入的前提下,在我们系统/板子上,能够不依靠其他外界输入而产生输出信号的器件有木有呢?当然有,而且必须有,那就是大名鼎鼎的晶振了,用来产生我们说过的——对系统极端重要的系统时钟信号。

除此之外呢,不说什么电容、电阻和电源模块之类的,和我们数字逻辑设计无关的玩意。不依靠其他外界输入而产生输出信号的器件还真没有。下面这位开始抬杠了:这个可以有啊,比如我做一个导航用的发射机,配置什么的都固定、发射信号固定,不是不要输入了。大哥,您忘了?这个不也要时钟输入吗?要不,不就成模拟发射机了?这小子想叫各位数字逻辑设计的工程师都失业啊,给我往死里打,打的他妈妈都不认得他!

(插句话,我们一般工程师作为一个工作单元,其输入就是薪水。为什么老板总觉得员工懒呢?其原因是激励不足啊。)

接着设问(苏格拉底式教学):测试向量是从哪里来的?是从天上掉下来的吗?当然不是。测试向量,也包括可能的外部器件,的可能来源有三种,待小子细细表来。

俗话说:“好汉不提当年勇”。那么我所说当年的段子,估计不会影响我的光辉形象吧?想当年,我也是以能做出一个计数器什么的单元而沾沾自喜的。套用刘若英的《后来》歌词:“…复位信号,用时延,我总是那么的编写;‘时钟’,我自然想,用forever,信号自然出现;那个永恒的日子,工作才一年,我首次测试的那个日子;让我往后的时光,每当有感叹,总想起,当天的程序;那时候的测试,总是那么的简单…”。这里说的就是测试向量的第一个来源:当设计的单元简单、输入输出关系明确的时候,可以由设计者直接设计测试向量完成验证。这也是大多数资料里面介绍的方法,其中内容不必详述。比如,你做一个计数器,然后你做一下reset 和clock 信号,于是在reset 不生效之后,输出就是1-2-3…了,OK,恭喜啊,你得设计正确。再如,你设计一个加法器,你就需要做不同的加数和被加数的组合,如果得到0 + 1 = 1,1 + 1 =2, 1 + 2= 3…那么就可以交货了。领会精神!不想找打,就表抬杠,我们有前车之鉴!

第二类情况是这样的,你设计了一个对于复杂芯片的接口或者控制器,你就需要外部芯片的行为模型配合你得测试了。举个例子,你需要设计一个SDRAM 的控制器,用来控制大容量的SDRAM 来存储数据。首先,你会得到一个对应RAM 的datasheet(数据手册),里面会有芯片的电气特征啊什么的,数字逻辑设计不感兴趣的内容。大家需要注意的就是读写的时序,还有SDRAM 的刷新要求(不懂这个?没关系了,就是一个例子。等到你做的时候,自然就了解了。如果还是不懂,那么等着丢数据吧,别抱怨我没说过。)。这个控制器基本就是一个状态机。在设计完之后,需要

进行验证的时候,问题来了:“如何测试这种系统呢?”。竖起耳朵听着,找供货商要对应芯片的行为模型,这个可以有的。事实上,在选择芯片的时候,有没有这种模型是很重要的一个指标,必须向采购要求。叫甲方们在吃回扣之余,一定要选择有行为模型的芯片。要不然,逻辑设计的工作量就是加倍了。而且即使我们按照自己的理解设计了外部芯片的行为,还不能保证我们做的模型是完全正确的。这就陷入了验证-再验证的死循环了,命苦啊。

最后一种验证可以帮助大家复习一下第一讲。子曾经曰过:温故而知新,可以为师矣。这次有给我们输入文档的算法工程师一起来联合工作。可惜,这类工程师里面也缺乏美女/帅哥,很难达到“男女搭配,干活不累”的要求。这种情况一般发射在我们设计信号处理类的系统的时候,例如:通讯里面的发射机、接收机等。和我们一样辛劳的算法工程师们,需要给我们提供测试向量。这种向量一般是以文件形式提供的,里面有输入和输出数据,一般是十六进制的几列。大家需要利用文件读写函数(Verilog里面就是$readmemh之流),读取输入(可能也要输出)数据,输入需要验证的系统,来考察设计是否正确。

说到这里,又可以显示一下我的卑鄙了(有诗云:卑鄙是卑鄙者的通行证。这样我可以畅通无阻了。老衲特别卑鄙,该发特别通行证了。)。我做算法工程师的时候,给设计工程师用来单元验证的测试向量,与给测试工程师用来集成和系统测试的测试向量,向来是不同的两组。这样可以防止设计工程师作弊。设计的哭了:“本是同根生,相煎何太急”。于是乎,当年联调的时候,我就可以搬个椅子睡觉了,告诉别的单元的人:“有问题叫醒我”。我从来是睡到自然醒的。 最后还有点时间,和大伙儿简单地唠唠复杂系统自动测试的事情。

首先,仿真器提供一个编程语言接口PLI( program language interface )。PLI,把C 程序嵌入到HDL设计中,用户可以用C写扩展的系统任务和函数,扩充了HDL语言的功能。有了PLI,C和HDL之间就可以直接通讯,去掉了文件交互的环节,大大提高了效率和方便性。然后,C还可以嵌入Matlab和ADS等,NB的一腿。

其次,如果采用上面说的第三种验证方法。可以通用比较器来验证设计,例如用相等比较器,相同输出为“1”。如果见到了“0”,恭喜了,子曰:闻过则喜。这种方法里面需要注意的是时延问题。我们的所有设计,在输入和对应输出之间,总是存在时延的。这个时延,就是我们以前提到过的建立时延。在有效输出建立之前,会存在若干无效的过渡性数据,这些数据需要被删除。具体的时延是多少,圣上在设计的时候应该确定的。我就不在这里“皇帝不急太监急”了。

竟然写了一篇“无图无真相”的讲座,罪过罪过。

顺便预告一下,下一讲开始,有很多干货了。欲知后事如何,且听下回分解。

《玩转IP core IP core》》之六之六::程咬金的三板斧程咬金的三板斧------系统基本结构系统基本结构系统基本结构 有诗赞曰:

手持宣化开山钺,胯下大肚蝈蝈红;称霸混世大魔王,官拜大唐鲁国公。皇杠劫在小孤山,三斧定得瓦岗山;征南大战王世充,开唐位列凌烟阁。

这里说的是一位古人,姓程名咬金,小名阿丑,山东东昌府东阿县斑鸠镇小耙子村人士。隋唐年间一员副将,他老人家最拿手的就是三板斧。所谓“一招鲜,吃遍天”,此人靠这一手,行遍大江南北,被封为唐朝的鲁国公,享尽人间荣华。

今天我们开始进入本讲座的第二部分:单元篇。大家将会发现,我们在基本单元设计里面,也就是三板斧:查找表、时分复用和流水线。但是,我们比程大将军稍稍高一点,我们会把这三招糅合,能产生变招。

闲言少叙,言归正传。下面我们分别介绍这三招。(至于变招,我们会在后面的相关内容里面进行描述,评书里面说:“欲知后事如何,且听下回分解”。等等,别走!这还没开讲呢!)徒儿们,你们要听清楚、多记笔记,过了这个村可没这个店了。

第一招:查找表。汉语名字叫查找表,(英文名字叫“Chazhaobiao”?您小沈阳看多了。)英文叫LUT,Look Up Table。是一种最简单的实现结构,传统上被贴上了大面积的标签(具体分析见本讲座“踏雪寻熊”一节),很少被待见(L 兄哭了:“我招谁惹谁了,凭什么不用我啊?”)。在我们最初学习《数字电路》的时候,应该最常用的方法了。是否还记得,大家曾经乐此不疲的化简卡诺图,这就是查找表法了。现在EDA 软件发达了,简化卡诺图工作不需要大家操心,计算机帮我们做的很好的,这对LUT 是个好消息。

下面给一个通用的LUT 的形式:查找表原理上就是给出全部输入可能的输出,作出一张输出的“表”。假设输入为in1,in2…,输出为out1,out 2…,那么查找表可以表示为下图所示。里面好多的点点啊,左面是全部输入的组合(很多的啊,如果全部输入N bits,那么就有2N 个呢),右边是出入对应的输出(可以由其他程序,例如仿真,得到)。如果输入规模很大时候,这个表是非常复杂的,因此很多材料不建议采用的原因。但是,考虑某些情况下,输入规模会很小的场景。此时,是不是可以考虑采用LUT 了呢?L 君终于有用武之地了。例如,后面会介绍的全加器,输入3 bits,输出2 bits。对于这种器件,可以考虑在Verilog 用查找表实现,叫实现软件实现卡诺图的简化。简化的结果吗,就是我们数电老师成天和我们自夸的那两个公式了。(什么公式?不会吧,找本随便什么《数字电路》看看好了,一定有的。)

LUT还有一种产生方法,就是利用RAM完成,如下图所示。具体方法是,用输入组成{…,in1,in0}作为RAM的地址,把这些输入的输出作为值存在RAM里面。这样读对应地址,就得到想要的输出了。这个方法在二进制逻辑里面用得不多,但是对于非线性函数求值却是一个常用的策略。这个问题,我们以后关于非线性函数求值的章节里面,有详细的介绍。

为了便于记忆,这里给招法口诀一首专门讲的是如何做查找表:“皆说查找身材胖,瘦身即需输入少。全部输入连一串,输出数值列身旁。”第一招打完,收功了。

下来是第二招,不是小鬼剔牙了,是时分复用。时分复用的基本思想是:对于一些需要处理速度比较慢、有重复运算的单元,在可以接受的建立时间内,多次重复利用有关的运算器件,以达到减少整个单元面积的目的。

说了一堆严格的非人话,总结一下是必要的。

首先,時分复用的应用场合是“对于一些需要处理速度比较慢”,也就是需要的建立时间较长的单元。

其次,这些单元里面,必须“有重复运算的单元”。例如:在FIR滤波器里面存在很多相同位数的加法,就合适采用时分复用。

最后,时分复用的手段是“多次重复利用有关的运算器件”。

前两个要点是第二招适用的场景,第三点是时分复用的实战招式(对方招架时,收斧头,献斧纂,攻击对方的脸。)。

同学们,我们来解剖时分复用的结构。时分复用在流程上,很类似程序语言,运算不是以前我们介绍硬件描述语言那样并行进行的,而是按照一定顺序串行完成的。这个顺序,是设计人员按照系统的要求设计的,一般用时序图的形式表现。由于硬件描述语言的特殊性,在采用时分复用的单元里面,一般需要一个计数器来控制时序。

以下用一个简单的例子来说明时分复用的方法,计算 e = a + b + c + d。时序图如下,我们在节拍0(计数器为0),计算x = a + b;我们在节拍1,计算e = e + c;;我们在节拍2,计算e = e + d。

好了,下来是设计代码(为了简化,就不写常规操作和计数器部分,只写操作有关的部分了): …

case (counter)

2’b00: e = a + b;

2’b01: e = e + c;

2’b10: e = e + d;

endcase

简单吧?对不起这位仁兄,来人啊,拖出去给我打。还真的以为是程序语言了,这个实现里面还是三个加法器,而不是一个加法器的复用。

还是看看正解吧:

assign x = y + z;

case (counter)

2’b00: #2 y = a; #2 z = b; #2 e = x;

2’b01: #2 y = e; #2 z = c; #2 e = x;

2’b10: #2 y = e; #2 z = d; #2 e = x;

endcase

这才是用一个加法器,实现了3次加法。在实际设计种,还需要注意的是加法的进位问题。这个和时分复用关系不大,为了突出重点,就忽略了。

另外,里面的“#2”是模拟加法器的处理时延。具体的原因,我们会在《番外篇:磨刀与砍柴----程序的风格》里面详细介绍。

现在是提问时间,我们需要的四个数字相加的结果在什么时候有效?“节拍2!”,谁回答的?接着打,打得长记性位置。听好了,记住了,四个数字相加的结果在下一个节拍0才真正建立。回答2的忘记了寄存器在时钟上升沿才采样了。

第二招也有口诀:(“他强由他强,清风抚山冈。 他横由他横,明月照大江。”,错了。串台了,在看马大嘴的《倚天屠龙记》,sorry)“时分妹子身材棒,找个计数(器)掌节拍。重复操作单独撰,输入输出时钟控。”我看谁敢说:“忘记一半了”!我不是张真人,这里也不教太

极拳;还有更重要的是:你以为你是张无忌啊。

最后,压轴的好戏来了,第三招:流水线(P君,pipeline)。小P可是FPGA/ASIC界的风云人物啊。您随便去baidu一下“流水线+FPGA”,网上的资料可谓汗牛充栋。给人的感觉是:您不会流水线,都不好意思说自己是FPGA界的。(作者本人是娱乐界的,这个可以没有。) 流水线的主要思想是把一个操作分为多个步骤,每个时钟节拍做一个步骤。对于单个数据,经过N个步骤之后,获得最终的结果。硬币的另一面,对于整个数据流而言,每个时钟节拍,有一个数据进入处理。这样,由于每个步骤的处理时延小于总的处理时延,系统能够以更高的时钟周期工作,相应处理的数据流的速度也就提高了。然而,考察一个处理的建立时间,由于N个时钟之后才能获得最终结果,实际的建立时间一般比较其他方式会长。对于面积的考虑,流水线也没有节约面积,反而由于其中必然采用的寄存器延时链,系统的面积一般大于其他方法。一句话,流水线也是用面积和建立时延换系统工作频率和数据流速度的一种实现方式。

P君这个人属于开热线之前的范厨子----一根筋,用北京土话说就是“轴”。数据流的方向必须是勇往直前的“奔腾到海不复还”。因此上,如果是“数据处理”的话,流水操作是再适合不过。如果是“驱动”、“控制”之类的工作,还想交给P君完成,那就是三两棉花----免谈(弹)。

下面的图是一个流水线的一般模型。可以看出,一个流水线由三部分组成:数据延迟链(组)负责原始数据的存储、结果延时链(组)完成各步骤结果的存储,组合逻辑链接这两种延时链(组)是各个步骤的真实操作。通用模型里面值得注意的是,结果延时链(组)可能是D触发器的串联,也可能是单独的D触发器用于存储中间结果,还可能是两者的组合。

这个描述比较抽象,以后的章节里面会针对不同功能的单元,给出对应的具体实现。俗话说得好:心急吃不得热豆腐。

最后,也有几句口诀赞扬P君:“双边两条延迟链,组合逻辑中间站,数据结果每节拍,高速设计流水线。”

最后----已经说了“最后”了,那就----最最后,需要叮嘱一句,本次讲的三种基本结构只是典型的例子。在设计中,这三种结构不是泾渭分明的。真实的设计中,大家需要根据需要,自由组合。真正做到你中有我,我中有你,才是高手,高高手。这种例子,在后面的讲座中鄙人也会给大家介绍一二的----好戏刚刚开场。

相关文档