1 / 76

EDA 技术

EDA 技术. 廖义奎. 第10章 FPGA Verilog HDL编程基础. 本章内容. 详细讲解 Verilog HDL 硬件 语言. 本次课内容. 10.1 Verilog HDL 简介 10.2 Verilog HDL 模块 10.3 Verilog HDL 输入输出端口 10.4 Verilog HDL 变量. 10.1 Verilog HDL 简介. 1 、 VHDL 介绍 2 、 Verilog HDL 介绍 3 、 SystemC 介绍 4 、 Verilog HDL 的特点. 1 、 VHDL 介绍.

zizi
Télécharger la présentation

EDA 技术

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. EDA技术 廖义奎

  2. 第10章 FPGAVerilog HDL编程基础

  3. 本章内容 • 详细讲解Verilog HDL硬件语言

  4. 本次课内容 • 10.1 Verilog HDL简介 • 10.2 Verilog HDL模块 • 10.3 Verilog HDL输入输出端口 • 10.4 Verilog HDL变量

  5. 10.1 Verilog HDL简介 • 1、VHDL介绍 • 2、Verilog HDL介绍 • 3、SystemC介绍 • 4、Verilog HDL的特点

  6. 1、VHDL介绍 • VHDL年代纪1980 VHSIC项目(Very High Speed IC)1983 IBM、TI和Intermetrics发展语言和仿真工具VHDL主要考虑自顶向下的设计和工艺进步引起的系统升级1987 DOD(美国国防部)要求所有数字电路用VHDL描述F-22战斗机项目采用VHDL       IEEE1076-19871993 IEEE1076-19931996基于IEEE1076-1993的仿真和综合工具问世IEEE1076.4(VITAL):ASIC和FPGA建模库IEEE1076.3使用综合工具的package

  7. F-22:包括甚高速集成电路、主动变弯机翼、高压液压系统、不易燃液压技术、液压传动武器挂架、隐身能力、声控指挥控制、保形传感器、共享天线、一体化飞行控制与推进控制、短距起落、矢量推力、人工智能、先进复合材料、先进数据融合和座舱显示、集成电子战系统(主要包括AN/ALR-94电子战系统和AN/ALE-52箔条投放器等)、通信/导航/识别一体化、变速常频发电机、氧气发生系统以及光纤总线等等。F-22:包括甚高速集成电路、主动变弯机翼、高压液压系统、不易燃液压技术、液压传动武器挂架、隐身能力、声控指挥控制、保形传感器、共享天线、一体化飞行控制与推进控制、短距起落、矢量推力、人工智能、先进复合材料、先进数据融合和座舱显示、集成电子战系统(主要包括AN/ALR-94电子战系统和AN/ALE-52箔条投放器等)、通信/导航/识别一体化、变速常频发电机、氧气发生系统以及光纤总线等等。

  8. 通常认为美国F-15和F-16是典型的高低搭配的第三代战斗机,而F-22和F-35则分别是它们的后继机,因此从辈分上讲F-22和F-35 当属第四代战斗机。但从开发时间和进入服役时间看,F-35要远远晚于F-22。 • 1.更为先进的机载AESA多功能雷达 • 2.高度综合的传感器系统 • 3.功能强大的综合核心处理机(ICP) • 4.综合高效的电子战(EW)系统 • 5.友好的人机界面―― 下视显示器和头盔显示器 • 6.综合完善的通信、导航、识别(CNI)系统 • 7.高度可靠的飞机管理系统

  9. 2、Verilog HDL历史 • 1981年Prabhu Goel创立了Gateway设计自动化公司1983年Gateway公司提出Verilog语言,并提供相应的Verilog仿真器1985年Gateway推出仿真器增强版,即著名的Verilog-XL1983-1987年Verilog-XL由于以下的原因在高级的、面向高端产品的电子设计工程师中得到越来越多的重视和应用:       (1)Verilog语言的行为结构可以很好地描述硬件和测试仿真       (2)Verilog-XL速度非常快,尤其是处理门级电路,在这期间它已经可以处理超过10万门的设计       (3)Verilog-XL是一个解释性仿真器,这样它可以给设计者提供交互式的调试环境,因此设计者可以在仿真环境中解决很多原本需要在真正的硬件电路板上才能解决的问题

  10. 1987年       这时由于半导体工业的高速发展,单个芯片的设计门数已经超过了很多其他仿真器处理的能力;Gateway公司开始在IC制造厂家中大力推动Verilog-XL,并得到了广泛的认可;这时另外一个快速发展的EDA公司Synopsys开始采用Verilog语言作为其逻辑综合产品的设计输入接口之一;同年,VHDL语言被IEEE采纳为国际标准;采用行为级硬件描述语言来描述和综合“自顶而下”的设计越来越受到IEEE的重视。所有这一切使得Verilog-XL越来越流行。 • 1988年Cadence公司成立1989年Cadence公司收购了Gateway公司

  11. 1990年早期Cadence公司将Verilog语言和仿真器产品分开,推动Verilog与VHDL的竞争。同时,为了Verilog用户可以共享设计模型和经验,OVI(Open Verilog International)成立,OVI是由Verilog用户和IC制造厂家共同成立的工业协会,主要负责Verilog语言的发展和标准说明1990年       几乎所有的IC制造厂家都指定Verilog-XL为标准的“黄金”仿真器,以保证设计仿真验证和制造有一致的时序结果1993年       这个时期超过85%的ASIC产品是以Verilog设计和提交的1995年10月Verilog语言被IEEE采纳为IEEE 1364标准1996年-至今Verilog在ASIC、FPGA和PLD设计中应用得越来越广泛,在ASIC制造的支持上,Verilog对VHDL仍占有一定的优势。据Dataquest的统计,在未来几年,Verilog的市场增长率为15.6%

  12. 2001年,发布新标准IEEE1364-2001,即Verilog-2001, HDL部分有较大增强,PLI部分变化不大。在这个标准中,加入了Verilog HDL-A标准,使Verilog有了模拟设计描述的能力。 • Verilog-2001就是一种增强型的Verilog,能够更容易地进行大型设计建模,使综合建模更简单明了,并提高了时序精确性。Verilog-2001的书写风格更简洁,扩充了数据类型、算术运算算子、系统函数和任务。增加了新的语言结构,如attribute,generate,configuration。

  13. SystemVerilog • 2005年,IEEE发布SystemVerilog和Verilog的标准,替代IEEE 1364-2001。其中,Verilog标准IEEE 1364-2005是对现有标准的修订。IEEE表示对Verilog语言标准的修订解决了几大难题,并对错误进行了更正。 • IEEE SystemVerilog 1800标准提高了硬件设计、规范、仿真和验证的生产率,尤其是对高门数、基于知识产权(IP)总线密集的芯片。SystemVerilog由Accellera开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。

  14. 3、SystemC介绍 • 深亚微米半导体技术的进展与成熟使复杂的片上系统(SoC)设计变得越来越普遍,同时对传统的ASIC设计方法和流程提出了挑战。一些新的设计语言被开发出来以支持这些设计技术,例如SystemC、SystemVerilog等。 • Open SystemC Initive(OSCI)提出的基于C++的SystemC语言,已经逐渐被许多设计者用来对SoC体系结构进行建模以进行体系性能的分析及软硬件联合设计。

  15. SystemC的特性 • SystemC的一个重要特性是它支持系统设计各个层次的模型抽象,包括算法层次的模型、无时间信息的功能模型、含时间信息的功能模型、业务级模型、行为级模型、寄存器传输级模型等。 • 这样在系统开发的各个阶段,不同的设计开发团队可以运用同一个设计语言,使用基于同一种设计语言描述的设计平台。

  16. SystemC在1999年正式推出,并由Open SystemC Initiative (OSCI) 负责支持、维护和发展。 • 这个组织包含了范围广泛的公司、研究机构、大学和个人成员。被选举出OSCI理事会成员(Board Member Coreporations)包括:ARM Ltd.,Cadence Design Systems, Inc.,CoWare,Fujitsu,Mentor Graphics,Motorola,NEC,Synopsys,Inc.,涵盖了系统厂商、半导体厂商、EDA工具厂商、IP供应商等。

  17. SystemC是建立C++基础上的开放的系统级设计语言。实际上SystemC由一系列用来进行系统描述的C++类构成,并包含了一个用来对系统行为进行模拟的仿真核。SystemC是建立C++基础上的开放的系统级设计语言。实际上SystemC由一系列用来进行系统描述的C++类构成,并包含了一个用来对系统行为进行模拟的仿真核。 SystemC语言的发展大致经历了两个大的阶段:SystemC1.0和SystemC2.0。 SystemC1.0可以用来进行硬件描述。 SystemC2.0的推出使SystemC成为真正的系统级设计语言,能够用来对SoC体系结构进行更加自然和有效的描述。这样就使SystemC语言涵盖了从系统概念直到实现的针对系统软、硬件建模的能力。

  18. SC_MODULE(myadd) • { sc_in clk; sc_in<SC_INT > in1, in2; sc_out<SC_INT > out1; void myadd_method() {out1 = in1.read() + in2.read(); }; SC_CTOR(myadd) • { SC_METHOD(myadd_method); sensitive_pos << clk; } }; // end module myadd

  19. 应用实例 • SystemC是一种开放的系统设计语言,用户可以在各种常见的平台中使用SystemC,例如windows平台下C++开发环境Visual C++,Linux平台下的GNU C++。 •   例如由一个IP路由器内的AMBA总线、ARM处理器、中断控制器、DMA控制器、程序存储器、数据存储器等模块构成,这些模块采用SystemC建立TL模型,其中的ARM处理器TL模型包含完整的ARM ADU调试环境。

  20. 多个部门、团队同时工作 当这样一个SoC的结构模型建立并分析完成之后,软件设计人员可以在这样一个环境下比较充分的对软件代码在ARM的ADU环境下进行分析、调试。 由于TL模型能够提供较RTL模型快得多的仿真速度,允许对较多数量的软件代码进行分析以发现可能的设计纰漏。 同时硬件设计人员也可在此结构平台上进行硬件的开发。

  21. Coware、Carbon、MIPS、ARM等等公司都在提倡SystemC。SystemC与SystemVerilog的比较: SystemC是一个很好的工具,SystemVerilog不论怎么模仿c++都不可能与c/c++有这么好的天然接口。它们的竞争目前主要在验证上,系统级的设计和建摸还很难看到SystemVerilog的身影。

  22. 发表于 2005-6-22 03:04  • [原创]是否值得自己开发一个SystemC的综合工具?    现在quartus II等待开发工具还不支持SystemC的综合。    英国两家EDA初创公司Orange Tree Technologies与SystemCrafter已经展开合作,共同促使SystemC综合工具的价格更能为大众市场所承受。两家公司日前联合推出了一款基于SystemC语言的FPGA编程工具包。该工具包包含SystemCrafter公司名为SystemCrafter SC的新型SystemC-to-VHDL编译器,以及Orange Tree Technologies公司名为ZestSC1的FPGA开发板。据两家公司称,SystemCrafter SC能自动把用SystemC写的硬件设计综合为VHDL,从而使工程师和编程人员可以采用现有的C++开发环境设计、调试和仿真硬件及系统。     双方称其它SystemC和专用C到硬件的转换工具成本为数万美元,通常仅为一年的使用费。而SystemCrafter SC价格仅995美元,编译器可永久性单独使用。与ZestSC1开发板捆绑时费用为也才1,490美元。995美元还是贵了。所以想自己开发一个SystemC to VHDL 或Verilog的软件,大家认为是否值得开发,如果值,是采用开源的方式好还是不开源的好?

  23. 发表于 2005-6-22 03:22  • [原创]是否值得自己开发一个SystemC的综合工具? • 尽管看起来是一件比较困难的事情还是赞一个有了梦想,才会有结果 • _________________________ • 发表于 2005-6-22 03:44  • [原创]是否值得自己开发一个SystemC的综合工具? • [这个贴子最后由deltarzero在 2005/06/21 07:46pm 第 1 次编辑]995刀价格对一种IC设计的EDA工具来说是已经便宜的不能在便宜了!如果时间和精力容许的话,做做也无妨,无论做到什么程度,都会受益的。

  24. 发表于 2005-6-22 06:59  • [原创]是否值得自己开发一个SystemC的综合工具? • 开源。怀疑是否有人愿意做? • _________ • [原创]是否值得自己开发一个SystemC的综合工具? • 问题是:做得出来吗? 这不是说说那么简单,且不说需要在Verilog/VHDL,软件编程方面的基本要求了,先看看能不能做出个从Verilog/VHDL代码到RTL Schematic的小模块,然后再想想从SystremC->HDL->netlist要多少牛人多少时间吧。

  25. [原创]是否值得自己开发一个SystemC的综合工具?[原创]是否值得自己开发一个SystemC的综合工具? • 开放吧。这样可以使大家都能受益。 • ________- • 原创]是否值得自己开发一个SystemC的综合工具? • 小结:    (1)本贴从6月21发布,到6月29日止,仅有79个读者(其中不少为作者本人读者),5个回复。这说明中国HDL用户到systemC并不关心,或对开发systemC综合工具并不关心;    (2)没有人对systemC的发展前景作出评价,或对systemC了解的不多;    (3)部分人认为开发困难大,甚至是不可能实现;    (4)部分人认为应采用开源的开发方式。希望大家继续展开讨论,大胆发表个人的看法。

  26. 发表于 2005-6-30 06:20  • [原创]是否值得自己开发一个SystemC的综合工具? • 我选小结里的(3),你准备自己做吗?太牛了吧,为你的勇气顶一下。 • _________ • [原创]是否值得自己开发一个SystemC的综合工具? • 对下一代开发语言比较关心,可是相关资料太少了,还是感觉比较闭塞不像在学校,天天没空凿摸这个啊不过自己写综合工具?还是难度大了点吧 • ________ • [原创]是否值得自己开发一个SystemC的综合工具? • 没必要,这些工作绝对是高难度的,不然为啥大公司不做,人家要财有财要人有人,如果谁认为自己是怀才不遇的高手高手高高手,带上一万块人民币去啃吧,现在好像systemverilog的支持已经做的很好了哦。

  27. 发表于 2006-6-26 08:16  经过一段时间的努力,SystemC Studio(学习版)已开发完成 经过一段时间的努力,SystemC Studio(学习版)已开发完成,主要实现如下功能:(1)SystemC到Verilog HDL的程序转换;(2)SystemC的项目管理及源程序编辑环境;(3)SystemC的gcc编译环境;(4)VCD格式的波形文件查看;(5)SystemC开发项目模板;(6)支持SystemC与QT相结合的开发环境;(7)支持QT、MinGW GCC、OpenCV、SmartWin、Java等开发SystemC Studio(学习版)下载地址:http://www.systemcstudio.com/download.htm详情见:http://www.systemcstudio.com/

  28. 4、Verilog HDL的特点 • (1)自由的格式,代码精简,实现相同的功能,代码大小比VHDL小得多,有人认为接近50%。 • (2)非常类似于C语言。对于开发人员,以一种类似于C语言灵活自由的格式编写程序,不仅可以大大提高编程效率,而且容易维护与扩展。 • (3)易于学习。对于初学者,特别是熟悉C语言的初学者,非常容易入门。

  29. (4)方便仿真,方便门级、RTL级和行为级开发,实质上,在底层的VHDL设计环境是由Verilog HDL描述的器件库支持的。 • (5)目前,在开发过程中应用Verilog HDL的人员远比使用VHDL的高得多。

  30. 10.2 Verilog HDL模块 • 10.2.1 模块 • 10.2.2 区块 • 10.2.3 空白与注解

  31. 设计层次(Design Hierarchy) 设计层次可区分为系统级(System Level)、芯片级(Chip Level)、寄存器级(RTL Level)、逻辑门级(Gate Level)及晶体管级(Transistor Level)。

  32. 系统级:定义系统规格和系统功能,可能同时描述多个芯片。系统级:定义系统规格和系统功能,可能同时描述多个芯片。 芯片级:要实现的芯片的描述。 寄存器级:由寄存器及组合逻辑等描述的功能模块。 逻辑门级:使用逻辑门来描述的较基本功能模块,例如一个寄存器可以用几个门逻辑来进行描述。 晶体管级:描述晶体管开关切换的器件特性。

  33. 10.2.1 模块 模块是Verilog HDL程序的基本单元,对于可综合的模块,对应的是一个硬件模块。 在一个模块之中,还可以调用其它子模块,实现模块化的设计。 所有的Verilog HDL设计都包含在模块内,模块是最基本的单位,每个模块可以包含好几个子模块。 每个Quartus II项目都应该包含一个Top Level模块,该模块的名称应该与项目名称同名。

  34. Verilog HDL模块的定义方法如下: module ModuleName ( //输入输出端口,例如: /* input in1 ,input in2 ,output reg out */ ); //实现代码 endmodule

  35. 例如,定义一个带复位端的触发器mydff,代码如下: 例如,定义一个带复位端的触发器mydff,代码如下: 示例10.1: module mydff (d,clk,nrst,q); input d,clk,nrst; output reg q; always @(posedge clk or negedge nrst) begin if(~nrst) q=0; else q=d; end endmodule

  36. 示例10.1在Quartus II中的综合结果的RTL图10.1所示,本书Verilog HDL代码的综合都是在Quartus II中完成,后面将不再说明。

  37. 与C程序比较 #include <stdio.h> int main(){ int d,clk,nrst; int q; ////加入测试数据//// d=1;clk=1;nrst=1; q=0; if(clk) { if(!nrst) q=0; else q=d; } printf("q=%d",q); return q; } module mydff(d,clk,nrst,q); input d,clk,nrst; output reg q; always @(posedge clk or negedge nrst) begin if(~nrst) q=0; else q=d; end endmodule

  38. 最简单的C程序 • int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\ • o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}

  39. 第二个C程序 • #include <stdio.h> • a[900]; b;c;d=1 ;e=1;f; g;h;O; main(k, • l)char* *l;{g= atoi(* ++l); for(k= • 0;k*k< g;b=k ++>>1) ;for(h= 0;h*h<= • g;++h); --h;c=( (h+=g>h *(h+1)) -1)>>1; • while(d <=g){ ++O;for (f=0;f< O&&d<=g • ;++f)a[ b<<5|c] =d++,b+= e;for( f=0;f<O • &&d<=g; ++f)a[b <<5|c]= d++,c+= e;e= -e • ;}for(c =0;c<h; ++c){ for(b=0 ;b<k;++ • b){if(b <k/2)a[ b<<5|c] ^=a[(k -(b+1)) • <<5|c]^= a[b<<5 |c]^=a[ (k-(b+1 ))<<5|c] • ;printf( a[b<<5|c ]?"%-4d" :" " ,a[b<<5 • |c]);} putchar( '\n');}} /*Mike Laman*/

  40. 第三个C程序 #include <stdio.h> main(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_, main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13? main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\ ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \ q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \ ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \ iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \ }'+}##(!!/") :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1) :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

  41. 第四个C程序 • #include <stdio.h> • #define xyxx char • #define xyyxx putchar • #define xyyyxx while • #define xxyyyx int • #define xxxyyx main • #define xyxyxy if • #define xyyxyy '\n' • xyxx *xyx [] = { • "]I^x[I]k\\I^o[IZ~\\IZ~[I^|[I^l[I^j[I^}[I^n[I]m\\I]h", • "]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~[IZ|_IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm_IZh", • "]IZx\\IZx[I^k[I\\o]IZ~\\IZ~\\I]|[IZl_I^j]IZ}]I^n[IZm\\IZm_IZh", • "]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~_IZ|[IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm]IZh", • "]I^x[I]k\\IZo_I^~[I^|[I^l[IZj\\IZj]IZ}]I^n[I]m^IZh",'\0'};/*xyyxyxyxxxyxxxyy*/ • xyxx *xyyx; xxyyyx xyyyx,xyyyyx,xyyyyyx=0x59,xyyyyyyx=0x29,/*yxxyxyyyxxyyyxyy*/ • xxyx=0x68;xxxyyx(){xyyyyx=0;xyyyxx(xyx[xyyyyx]){xyyx=xyx[xyyyyx++];/*xyyyxxyx*/ • xyyyxx(*xyyx){xyyyx= *xyyx++-xyyyyyx;xyyyxx(xyyyx--)xyyxx(*xyyx-xyyyyyyx);/*x*/ • xyxyxy(*xyyx==xxyx)xyyxx(xyyxyy);*xyyx++;}}}/*xyxyxyyyyxxyxxxyyyxyyyxyxxyyy*/

  42. #ifdef a • #undef a • #ifdef b • #undef b • #ifdef c • #undef c • #ifdef e • #undef e • #ifdef f • #undef f • #ifdef g • #undef g • #ifdef h • #undef h • #ifdef i • #undef i • #ifdef j • #undef j • #ifdef k • #undef k • #else • #define k • #endif • #else • #define j • #endif • #else • #define i • #endif • #else • #define h • #endif • #else • #define g • #endif • #else • #define f • #endif • #else • #define e • #endif • #else • #define c • #endif • #else • #define b • #endif • #else • #define a • #endif • #ifdef k • #define p (1<<7) • #else • #define p 0 • #endif • #ifdef j • #define q (1<<6) • #else • #define q 0 • #endif • #ifdef i • #define r (1<<5) • #else • #define r 0 • #endif • #ifdef h • #define s (1<<4) • #else • #define s 0 • #endif • #ifdef g • #define t (1<<3) • #else • #define t 0 • #endif • #ifdef f • #define u (1<<2) • #else • #define u 0 • #endif • #ifdef e • #define v (1<<1) • #else • #define v 0 • #endif • #define vv (p+q+r+s+t+u+v+1) • #define ff \ • (defined(c)*8+defined(b)*4+defined(a)*2+1) • #if vv==1 • #undef vv • #define vv 2 • #endif • #if ff<vv • #if ff!=1 • #if (vv/ff)*ff==vv • #ifndef dd • #define dd • #endif • #endif • #endif • #endif • #if ff==15 • #ifdef dd • #undef dd • #else • printf("%d\n", vv); • #endif • #endif • #undef ff • #undef vv • #undef p • #undef q • #undef r • #undef s • #undef t • #undef u • #undef v • #ifdef w • #ifdef x • #ifdef y • #ifndef z • #define z • #endif • #else • #define y • #endif • #else • #define x • #endif • #else • #define w • #include <stdio.h> • main(){ • #endif • #ifndef z • #include "hello.c" • #include "hello.c" • #include "hello.c" • #include "hello.c" • #include "hello.c" • #include "hello.c" • #include "hello.c" • #include "hello.c" • #endif • #ifdef z • #undef z • #else • #ifdef y • #undef y • #else • #ifdef x • #undef x • #else • #ifdef w • #undef w • } • #endif • #endif • #endif • #endif

  43. #include <stdio.h> • #define _ -F<00||--F-OO--; • int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() • { • _-_-_-_ • _-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_-_-_-_-_ • _-_-_-_-_-_-_-_ • _-_-_-_ • }

  44. #include\ • <stdio.h> • #include <stdlib.h> • #include <string.h> • #define w "Hk~HdA=Jk|Jk~LSyL[{M[wMcxNksNss:" • #define r"Ht@H|@=HdJHtJHdYHtY:HtFHtF=JDBIl"\ • "DJTEJDFIlMIlM:HdMHdM=I|KIlMJTOJDOIlWITY:8Y" • #define S"IT@I\\@=HdHHtGH|KILJJDIJDH:H|KID"\ • "K=HdQHtPH|TIDRJDRJDQ:JC?JK?=JDRJLRI|UItU:8T" • #define _(i,j)L[i=2*T[j,O[i=O[j-R[j,T[i=2*\ • R[j-5*T[j+4*O[j-L[j,R[i=3*T[j-R[j-3*O[j+L[j, • #define t"IS?I\\@=HdGHtGIDJILIJDIItHJTFJDF:8J" • #define y yy(4),yy(5), yy(6),yy(7) • #define yy( i)R[i]=T[i],T[i ] =O[i],O[i]=L [i] • #define Y _(0 ], 4] )_ (1 ], 5] )_ (2 ], 6] )_ (3 ], 7] )_=1 • #define v(i)( (( R[ i ] * _ + T [ i ]) * _ + O [ i ]) * _ + L [ i ]) *2 • double b = 32 ,l ,k ,o ,B ,_ ; int Q , s , V , R [8 ], T[ 8] ,O [8 ], L[ 8] ; • #define q( Q,R ) R= *X ++ % 64 *8 ,R |= *X /8 &7 ,Q=*X++%8,Q=Q*64+*X++%64-256, • # define p "G\\QG\\P=GLPGTPGdMGdNGtOGlOG" "dSGdRGDPGLPG\\LG\\LHtGHtH:" • # define W "Hs?H{?=HdGH|FI\\II\\GJlHJ" "lFL\\DLTCMlAM\\@Ns}Nk|:8G" • # define U "EDGEDH=EtCElDH{~H|AJk}" "Jk?LSzL[|M[wMcxNksNst:" • # define u "Hs?H|@=HdFHtEI" "\\HI\\FJLHJTD:8H" • char * x ,*X , ( * i )[ 640],z[3]="4_", • *Z = "4,8O4.8O4G" r U "4M"u S"4R"u t"4S8CHdDH|E=HtAIDAIt@IlAJTCJDCIlKI\\K:8K"U • "4TDdWDdW=D\\UD\\VF\\FFdHGtCGtEIDBIDDIlBIdDJT@JLC:8D"t"4UGDNG\\L=GDJGLKHL\ • FHLGHtEHtE:"p"4ZFDTFLT=G|EGlHITBH|DIlDIdE:HtMH|M=JDBJLDKLAKDALDFKtFKdMK\ • \\LJTOJ\\NJTMJTM:8M4aGtFGlG=G|HG|H:G\\IG\\J=G|IG|I:GdKGlL=G|JG|J:4b"W • S"4d"W t t"4g"r w"4iGlIGlK=G|JG|J:4kHl@Ht@=HdDHtCHdPH|P:HdDHdD=It\ • BIlDJTEJDFIdNI\\N:8N"w"4lID@IL@=HlIH|FHlPH|NHt^H|^:H|MH|N=J\\D\ • J\\GK\\OKTOKDXJtXItZI|YIlWI|V:8^4mHLGH\\G=HLVH\\V:4n" u t t • "4p"W"IT@I\\@=HdHHtGIDKILIJLGJLG:JK?JK?=JDGJLGI|MJDL:8M4\ • rHt@H|@=HtDH|BJdLJTH:ITEI\\E=ILPILNNtCNlB:8N4t"W t"4u" • p"4zI[?Il@=HlHH|HIDLILIJDII|HKDAJ|A:JtCJtC=JdLJtJL\ • THLdFNk|Nc|\ • :8K"; main ( • int C,char** A) {for(x=A[1],i=calloc(strlen(x)+2,163840); • C-1;C<3?Q=_= 0,(z[1]=*x++)?((*x++==104?z[1]^=32:--x), X = • strstr(Z,z)) &&(X+=C++):(printf("P2 %d 320 4 ",V=b/2+32), • V*=2,s=Q=0,C =4):C<4?Q-->0?i[(int)((l+=o)+b)][(int)(k+=B) • ]=1:_?_-=.5/ 256,o=(v(2)-(l=v(0)))/(Q=16),B=(v(3)-(k=v(1) • ))/Q:*X>60?y ,q(L[4],L[5])q(L[6],L[7])*X-61||(++X,y,y,y), • Y:*X>57?++X, y,Y:*X >54?++X,b+=*X++%64*4:--C:printf("%d " • ,i[Q][s]+i[Q ][s+1]+i[Q+1][s]+i[Q+1][s+1])&&(Q+=2)<V||(Q= • 0,s+=2)<640 • ||(C=1));}

  45. IOCCC 上的C语言程序 • 国际C代码混乱大赛http://www2.us.ioccc.org/years.html#2000_anderson

  46. 在Verilog HDL程序中,允许在一个调用其它模块实例,需要注意的是,不能在always块中用模块实例。调用模式如下: 模块名 实例名 (端口连接关系表); 其中,模块名就是定义模块时紧跟module关键字的名称;实例名是程序员为本次调用的模块所命名的模块实例的名称,它对本次调用的模块进行唯一的标识;端口连接关系表是由与调用模块实例端口相连接的外部信号组成的,它指明了模块实例和外界的连接关系。

  47. 如果由上述简单的D触发器(mydff)组合成一个四分频器,代码如下: 示例10.2: module myVerilog1(din,clk,nrst,dout); input din,clk,nrst; output dout; wire dff_0,dff_1,dff_2,dff_3; mydff dff0(din,clk,nrst,dff_0); mydff dff1(dff_0,clk,nrst,dff_1); mydff dff2(dff_1,clk,nrst,dff_2); mydff dff3(dff_2,clk,nrst,dout); endmodule

  48. 示例10.2的综合结果如图10.2所示。

  49. 在模块声明中: 一个顶层模块相当于一个芯片; 模块名称相当于芯片的名称; 端口连接关系表相当于芯片的输入输出引脚; 模块内引用的实例相当于芯片内的子功能模块。 它们之间的对应关系如图10.3所示。

  50. myVerilog1 • module myVerilog1( • input din,clk,nrst, • output dout ); • wire dff_0,dff_1,dff_2,dff_3; • mydff dff0(din,clk,nrst,dff_0); • mydff dff1(dff_0,clk,nrst,dff_1); • mydff dff2(dff_1,clk,nrst,dff_2); • mydff dff3(dff_2,clk,nrst,dout); • endmodule dout dinclk nrst

More Related