版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、零基础学FPGA (一) 关于我和FPGA发布时间:2014-01-07 15:29:29技术类别:CPLD/FPGA 个人分类:FPGA/CPLD刚考完试,好开心好开心!终于有时间来完成我的第一篇技术性博客了! 刚开始也不知道写点什么,毕竟我才刚刚认识FPGA不久,也写不出什么东西,就写点关于我的经历吧,反正又不是写书就随便扯点,就当是我的博客的开篇吧! 我现在是一名大二的学生,读的是一所普通重点本科,也就是非211啦!专业呢,是通信工程。在大学待了也差不多一年半了,给我的整体感觉是,大学丰富的生活是有了,丰富的课余活动甚至冲散了当时我念高中
2、时对理想的追求。一年前,我抱着对大学的无比崇敬迈进了大学校门,刚来嘛,当然要做个乖孩子,每天早上起很早去早读,每次上课都坐第一排,下了课去自习室写个作业,晚上回去还会预习明天要讲的知识,这样充实的过去了半年,年终考试成绩也不错.当然,除了学习,我还参加了各种娱乐活动,我本身会魔术嘛(炫耀一下,哈哈),所以就在学习魔术协会做了个部长,接一点校级演出,在大场面漏过几次面,在院里还算小有名气除此之外,还加入了学生会,党支部之类的那些在上大学之前听高中老师说起的一些组织,说是可以锻炼人的社交能力,就这样,忙忙碌碌,我的大一生活就这样看上去很精彩的过去了。 总结大一这一年,我心里一直有一个问
3、题老是在不停的问我,将来,我到底要干什么!?我读了十几年的书,到了大学我还在看那些高数!大学物理!马克思!虽然这些课程我的成绩还不错,但是将来我想做的,是电子类的,我真是不明白学校为什么还要给我们开那些无聊的课程,高数先不说,大学物理竟然还让我们学光学,相对论,量子!还要学马克思,毛概!想想我就生气,还有那上课没点用的大学英语!老师上课,完全不如自学,我不知道其他啊学校是不是这样,至少我觉得,听课,就是浪费时间! 后来,我加入了学校的电子创新实验室,开始接触单片机,PCB制版,DSP,Labview虚拟仪器,物联网之类的(目前只接触过这些)东西,开始和同学组队参加比赛,现在正在做的
4、是14年要在北京理工大学举办的“毕昇杯”全国大学生电子设计竞赛。自从进了创新实验室,我才觉得我是为了我以后的生活在学习,我知道我以后要干什么,而不是整天像个高中生那样,天天背书,为了考试而学习,为了几千块钱的奖学金勾心斗角(虽然我也拿过.)为了几个入党名额忙的不可开交.(可能是我高中就入了党,所以体会不到.),现在就业压力这么大,如果我不掌握好几门真本事,就靠学习成绩出去混,虽然饿不死,但是我觉得那绝对不是我要的生活。 大二上学期,我们实验室的人经常在一起交流,交流我们要搞哪方面的技术,有人要搞ARM嵌入式,有人要搞DSP的,有要搞安卓的,还有什么MSP430单片机的,
5、飞思卡尔,网站设计之类的,我们当时就开玩笑的的说,我们各搞一行,将来再找几个学经济的同学,我们自己创业算了,省的给别人打一辈子工.我当时也是从网找了找,看什么技术适合我,最后选了FPGA,我知道他要以verilog HDL语言和数字电子技术为基础,所以在课余自学了数字电子技术,和一点基本的verilog HDL语法,打算这个寒假就开始学习FPGA。虽然我还不是太清楚这个东西到底是干嘛的,但是据我了解,这东西挺强大的,又和数电有关,比较符合我的胃口吧,然后就选它了,与其在课堂上听老师将那些与我将来无关的东西,我宁可选择待在实验室学我自己喜欢的,与其去上课听英语老师上那无聊的英语(其实不无聊,偶尔
6、还放个英文电影.)我宁愿去看一些data sheet,毕竟我知道,这才是我将来的生活,也许英语听力很重要,口语很重要,但是重要的知识很多,如果我们都拿过来死学,到头来什么也不行,毕竟,我们大学只有四年!(大四应该不算吧.) 那几天刚买了块开发板,420块,算个入门用的吧。我想,既然选好了目标,那就努力为之奋斗吧,大一我已经玩够了,到了该学点养家糊口的本事了。这个寒假,我打算先把毕昇杯做完,我的火活还不算很多,就是用Labview做个上位机,labview也是最近才学的,是为了做比赛要用到,但是我感觉它真的好强大,可以说是无所不能啦!虽然爱它,但我估计我不会深入的研究它,就让它给我做
7、个辅助工具吧,将来可能还能用到它。 接下来的两年里,希望我能坚持下去,把FPGA学好,再涉猎一点有关的知识,我不打算考研了,如果考研,我出来就26啦!再*朋友,买房买车,结婚,我就老猴啦!争取28之前结婚吧,我想我未来的女朋友,你一定很幸福的!哈哈,自恋一下 下面附一张刚买的板子的照片,加油! 零基础学FPGA(二)关于触发器 发布时间:2014-02-12 17:14:06技术类别:CPLD/FPGA 个人分类:FPGA/CPLD 哎呀!好久没有管理博客了,虽然才一篇文章.呵呵。刚过完年,首先祝大家新年快乐!马年大吉!各种马上有!小弟在这给各位大
8、神拜年了! 从放假到年三十吧,大约有20天左右,一直在忙比赛,就是之前博客里提到的比赛,毕昇杯。我和小伙伴们忙了20多天,终于忙出了点结果,搞得我26号才回家,差点被我妈骂死.骂归骂,我们还是有点成果的。队长方面实现了用手机对系统的控制,队友方面把触摸屏搞好了,我是第一次做PCB板,在学校用机器做的,一口气做了6块,光这一块就废了好大劲,对于我这种新手来说.除了PCB板,我负责上的上位机也有很大进展,为了达到创新的目的,我把上位机做成了一个虚拟ipad,可以实现一些小功能,有划屏、计算器、播放器、相册、计算器、小游戏之类的功能,使我们的上位机不仅可以实现对下位机的操控
9、,更重要的是实现了人性化的界面,使人们用起来舒服。总体来说项目完成了85%了,过年回去完成剩下的就好了,也希望团队可以取得好成绩。这几天过年老玩了,整天到处乱跑,好在年也拜的差不多了,该静下心来看看书了。有几个同学已经回学校了,我回来这么晚,也不想惹老妈生气了,打算晚点回去,今天刚开始看书,就看了看触发器这部分,随便写写,当做笔记好了,也希望各位大神给小弟纠纠错,第一次学数电,还蛮好玩 太书面化的话我就不说了啊,有些东西就像书上写的,真的看着看着就想睡觉了,还是大白话直白哈。 1、关于触发器的分类
10、60; 触发器呢大体可以按这几个部分分类:1、按晶体管性质分,可以分为BJT集成电路触发器和MOS型集成电路触发器。2、按工作方式分,可分为异步工作方式和同步工作方式,异步工作方式也就是不受时钟控制,像基本RS触发器,同步方式就是受时钟控制,称为时钟触发器。3、按结构方式分,可分为维持阻塞触发器,延边触发器,主从触发器等。4、按逻辑功能分,可分为RS触发器,JK触发器,D触发器,T触发器,T'触发器等。 2、关于触发器的逻辑功能 触发器总体来说有四种功能:分别是置“0”、置“1”、保持、翻转。前两
11、个不说了,就是高低电平,保持就是维持原状态不变,翻转就是从原状态变为他的反状态。 3、基本RS触发器 这是基本RS触发器原理图,具体工作原理就不写了吧,个人觉得比较好理解,就说几个我刚开始看的时候有些看不懂的地方吧。 1、关于负脉冲和低电平 所谓负脉冲呢,就是一个信号从
12、高电平置为低电平,然后延迟一段时间后再置为高电平的过程,就像上图所示的脉冲。而低电平就没有返回高电平的过程。 2、关于Q端 我们知道不管是置“1”端还是置“0”端,操作的都是Q端,间接操作Q非端,刚开始我就错误的以为Sd非端控制相应上面的端口,其实不是,Rd非端和Sd非端都是控制Q端,即Sd非端一个负脉冲,Q端置“1”,Q端如果原状态就是“1”,则加一个负脉冲后原状态不改变。Rd非端一个负脉冲,Q端置“0”,Q端如果原状态就是“1”,则加一个负脉
13、冲后原状态不改变。 3、两个端口都加负脉冲的情况下 按理说两个端口是不允许同时加负脉冲的,因为一旦两端同时加负脉冲,则两个输出端就都为“1”,这样与我们认为的两个输出端的值互为反变量的原则就相违背了,但是在画时序图的时候,可以将两个输出端同画为高电平。重点是,当两个输入端都为低电平的时候,再把它们扳回高电平时,这时候输出端就会有两种结果,具体是哪种结果,这要取决于两个门电路的运转速度问题了。下面是时序图下面是基本RS触发器的真值表4、同
14、步RS触发器同步RS触发器是在基本RS触发器的基础上加了两个与非门,CP是时钟。当CP为“0”时,下面两个门电路相当于被封死,这时第一级门电路的输出端就都为"1",即保持状态。当CP为“1”时,门电路被打开,第一级门电路的输出端分别为Rd非和Sd非,这就和刚才的基本RS触发器一样了。5、JK触发器 JK触发器的内部原理比较复杂,对于初学者来说,我觉得直接记住他的功能就可以了,这样不至于越学越迷糊,当然有条件的朋友也可以自己去弄明白其中的原理这是JK触发器的逻辑符号,其中C1代表时钟,左边那个箭头代表负脉冲有效,也就是说只有在时钟负脉冲来临的时候Q端
15、才会发生变化(同步工作的情况,异步除外),R,S端为强制置“0”、“1”端,这两个端口不受时钟控制,可以强迫置位,R端负脉冲置“0”,S端负脉冲置“1”,J、K端为信号端。这张是JK触发器真值表,可以看出当R、S端都为“1”的情况下,信号端的J、K才会发挥作用,从上到下依次是“保持”、置“0”、置“1”、翻转。这样就可以得到JK触发器的特性表,有了这个表,我们就可以写出他的特性方程即 这是时序图,注意Q端只在时钟下降沿出变化 6、D触发器这是D触发器的逻辑符号,注意时钟是高电平有效,R
16、、S端是强迫置位端,D为信号端D触发器比较简单,真值表见下图7、T触发器真值表8、T触发器特性方程T触发器的重要应用,可以用作分频 9、最后展示一下我之前的作品,呵呵. 零基础学FPGA(三)Verilog语法基基础基础(上) 发布时间:2014-02-25 21:28:00技术类别:CPLD/FPGA 个人分类:FPGA/CPLD开学了.刚开学.小伙伴们的心情十分沉重.都在说,这上课的心情啊,堪比上坟.课表一发,这学期的课还真不少,一天到晚全是课,表示这学期又是一个具有挑战性的学期啊,新赛季新气象,让我们开始今天的学习吧!哈哈
17、; 这几天复习了一下Verilog的语法知识,就借此写写我对这些东西的想法吧。感觉呢,是和C语言差不多,具有C语言基础的朋友学起来应该没什么问题,和C语言相同的地方就不说了吧,重点说一下不同点吧。1、模块的结构 模块呢,是Verilog的基本设计单元,它主要是由两部分组成,一个是接口,另一个是逻辑。下面举一个小例子说明一下:module xiaomo (a,b,c,d); input a,b; output c,d; assign c=a|b; &
18、#160;assign d=a&b;endmodule所谓接口就是第二,三行,说明了一个模块的信号流向,很明显,a,b是输入,c,d是输出;第四第五行是逻辑,即输入和输出之间的关系即c的值是a或b的结果。assign 是连续赋值语句,这个以后再说。第一行是模块的端口声明,即说明一个模块具体有那几个接口,有多少接口写多少,直接套模板就可以module(接口1,接口2);endmodule代表此模块结束;2、模块的内容模块的内容包括3个部分,I/O说明,内部信号说明和功能定义。关于I/O说明有三种格式,即输入、输出、输入输出,第三种格式代表信号可以双向传送。在写I/O说明的时候要注明信号位
19、宽,即由几位组成,例如 input 7:0 xiaomo;代表输入一个8位的信号“小墨”,注意这里要用中括号,第一位是位宽减1,接一个冒号,再接数字0,再接端口名;关于内部信号说明要用到和端口有关的wire和reg类型变量的声明。模板和上面类似,关于reg和wire变量后面再说。关于功能定义是模块中最重要的部分,有三种方法可在模块中产生逻辑(1)用assign声明语句,assign 语句主要用于组合逻辑电路(2)用实例元件,例如 and #2 u1(q,a,b);(这个我自己概念也有点模糊,不知道怎么解释)(3)用always块,例如 always (clk or cl
20、r) begin
21、 end;always语句既可以用于描述组合逻辑,也可以描述时序逻辑,但主要以描述时序逻辑电路为主。 小结 在verilog语法中,所有的过程块(包括initial块,always块),连续赋值语句,实例引用都是并行的,也就是说在一个模块中遇到这
22、些语句就是同时执行的,而且没有先后次序。只有连续赋值语句assign和实例引用语句可以独立于过程块存在于模块的功能定义部分,即这两种语句可以不用在那两个过程块里执行,也可以在模块的功能定义部分执行,例如第一个例子。 这些和C语言有点不同,对于初学者来说应该都要弄明白。3、数据类型、变量、常量 对于初学者来说,数据类型只要掌握好reg,wire,integer和parameter型就够了,其他类型可以暂时不用去理会。 (1)常量就不说了,比较基础。 (2)参数型(parameter型)
23、 parameter是用来定义一个常量的,个人理解和C语言里面的int,float 语句一样,不一样的是parameter既可以定义整型,也可以定义浮点型或者是表达式。例如 (3)变量wire型数据常用来表示用以assign关键字指定的组合逻辑信号。Verilog程序模块中输入、输出信号类型默认时自动定义成wire型。例子reg型数据是寄存器变量,常用来表示always块中的指定信号,常代表触发器。注意,在always块中被赋值 的每一个信号都必须定义为reg型。上面这句话表示不理解,求大神解释.先放这儿吧.memory型由于Verilog中没有多维数组的存
24、在,memory数据就是通过扩展reg型数据的地址范围来生成的,他的格式为 regn-1:0 存储器名m-1:0;我举个例子,比如我定义 reg7:0 xiaomo255:0;这句话的意思是说,我定义了一个名叫“小墨”的存储器,这个存储器中有256个8位reg型寄存器,只要理解了这句话,就差不多了。注意,当没有中括号时代表的是一位,例如reg xiaomom-1:0;代表一个名为“小墨”的存储器,里面有m个1位的reg型寄存器。 还有个地方我感觉不太明白,见下图,谁知道
25、这句话上面意思.求大神解释.下面这几句话需要注意4、运算符及表达式 这里和C语言几乎一样,就不做过多解释了吧。就说一下位拼接运算符和位减运算符,这里C语言里面没有。直接看个例子就可以5、赋值语句 赋值语句共有两种,即非阻塞赋值,和阻塞赋值。(1)非阻塞赋值 非阻塞赋值方式所赋值的变量不能立即就为下面语句所用,只有当块结束后才能得到上一次所附的值,这种赋值方式是编写可综合的时序逻辑时常用的赋值方式。例如 这个例子的意思是,当时钟上升沿到来时,a的值给b,b的值给c,但是只有当块结束时才完成赋值,这么说
26、吧,假如原来a=1,b=2那么当时钟上升沿到来时a=1,b=2,c=2;当块结束时,a=b=c=1;这么理解对吗?求大神指点. (2)阻塞赋值与非阻塞赋值不同,赋值语句执行完后块才结束,b 的值在赋值语句结束后立刻改变,但是在时序逻辑电路中可能会出问题。 always (clk or clr);begin b=a; c=b;end假如开始a=1;当当时钟上升沿到来时,a=b=c=1;然后块结束 零基础学FPGA(四)Verilog语法基基础基础(中) 发布时间:2014-03-08 21:11:53技
27、术类别:CPLD/FPGA 个人分类:FPGA/CPLD 我们接着上篇文章继续学习,上次提到了两种赋值语句,让我们接着往下学。1、块语句 块语句包括两种,一个是顺序块,一个是并行块。(1)顺序快 顺序快就好比C语言里的大括号“ ”,在Verilog语法中,用beginend代替。这里只需要知道,在beginend中间的语句是顺序执行的就行了。(2)并行块 并行块可以算是一个新的知识点,与顺序块最大的不同就是并行块中的语句是同时开始执行的,要想控制语句的先后顺序,可以加
28、延时语句控制。这种并行块是用forkjoin语句描述。2、条件语句 条件语句这里不说,和C语言一样。就说一点主意事项。 在使用条件语句时,要注意语句的严整与封闭性。和C语言不同,举个例子always (al or d) begin if(al=1) q=d; end这个例子是说,当al上升沿到来时,d的值赋给q,那么当al=0时又是什么情况呢,事实上,在always块中,如果没
29、有给变量赋值,这个变量就会保持原值,也就是生成了一个锁存器。为了避免这种情况的发生,我们一般这样写 always (al or d) begin if(al=1) q=d; else q=0; end同样在case语句中也要加上default语句避免锁存器的生成,这样可以使设计者更加明确的设计目标,也提高了程序的可读性。 3、case语句 case语句要注意几点,只挑几点
30、重要的,其他的不说了(1)case语句分项后的表达式的值必须相同,否则就会出现问题,例如上面图片上的result。(2)与C语言不同,与某一项case语句匹配后,就会跳出case语句,这里没有break语句。(3)case语句的所有表达式位宽必须相等,例如上图都是16位整型,如果不加以说明,系统会以默认值32位控制表达式位宽。下面是case,casez,case语句的真值表 这个表其实还是很好记的case语句,只有匹配才出“1”casez语句除了匹配出“1”之外,另外只要遇到“z”就出“1”case语句除了匹配出“1”之外,另外只要遇到“z”或“x”就出“1”上图就用到了casez语
31、句来处理不必要考虑的值,这样就可以灵活的设置对信号的默写位进行比较。 下面写了一个小例子来练习一下 使用case语句实现一个四选一多路选择器 module xiaomo(a1,a2,a3,a4,out,s1,s2); input a1,a2,a3,a4; input s1,s2; reg out; /把输出变量声明为寄存器类型 always (s1 or s2 or a1 or a2 or a3 or a4 or out) &
32、#160;/任何信号的变化都会引起输出变量的重新计算 begin case (s1,s2) /位拼接运算 2'b00: out=a1; 2'b01: out=a2; 2'b10: out=a3;
33、; 2'b11: out=a4; default: out=1'bx; /保持语句的严整性 endcase end endmodule 4、循环语句 Verilog语法*有4中循环语句,这里只简单说一下C语言里没有的两种 (1) forever语句 连续执行语句,这种语句主要用在产生周期性的波形,用来做仿真信号。个人理解和alwa
34、ys语句差不多的功能,但是,forever语句只能用在initial块中。 (2)repeat 语句后面接常量表达式,可以指定循环次数,例如; repeat (8) begin end表示循环8次相应语句。 5、顺序块和并行块 所谓顺序块就是前面说的beginend,他的作用就是把多条语句组合到一起执行,在顺序块里面,语句是一条一条顺序执行的,如果遇到#10延迟语句,延迟也是相对于上一条语句的延迟,这一点比较重要。 相对于顺序块的就是并行
35、块,用forkend语句表示,并行块里的语句是同时执行的。 顺序块和并行块可以嵌套使用。 如果在begin或者fork语句后面加上名字,这个块语句就成了命名块,例如 begin :xiaomo end命名块有什么好处呢?有了命名块,我们就可以用verilog提供的disable语句来随时终止命名块,例如disable xiaomo;这样,当程序运行到此时,就会禁用命名块,就会直接跳出块语句,相当于C语言里面的b
36、reak语句一样,看下面这个例子: 6、生成块 生成块语句可以动态的生成Verilog代码,这一声明语句方面了参数化模块的生成。党对矢量中的多个位进行重复操作时,或者进行多个模块的实力引用时,或者在根据参数的定义来确定程序中是否应该包括末端Verilog代码的时候,使用生成语句能够大大简化程序的编写过程。 生成语句可以控制变量的声明、任务或函数的调用,还能对实力引用进行全面的控制。编写代码时必须在模块中说明生成块的实例范围,关键字 generateendgenerate用来指定该范
37、围。 Verilog中有三种生成语句的方法,分别是循环生成,条件生成和case生成。(1)循环生成 注:genvar 是关键词,用于生成生成变量,生成变量只存在于生成块中,在确立后的方针代码中,生成变量是不存在的。 xor_loop是赋予生成语句的名字,目的在于沟通它对循环生成语句之中的变量进行层次化引用。因此循环生成语句中的各个异或门的相对层次为:xor_loop0.gl,xor_loop1.gl,xor_loop31 这句话
38、什么意思啊 这个例子中的 xor gl (out j , i0 j , i1 j );什么意思?求大神指点 当然这个异或门还可用always块实现 生成块程序 generate for (j=0;j< div="" style="margin: 0px; "> begin :xiaomo
39、; always (i0 j or i1 j ) out j =i0 j i1 j ; end endgenerate <>(2)条件生成 下面是一段生成语句 (3)case生成下面是一个例子使用case语句生成N位的加法器 说实话上面这些东西我自己也是看的模模糊糊,好多地方不懂,只能先截个图放这儿了。唉.基础还是不行啊. 7、结构语句 (1)initial语句比较简单,这里就不多说了。(2)always语句 &
40、#160; always语句在仿真过程中是不断活动的,always语句后面的语句是否执行,这要看always语句是否满足触发条件。因此,always语句只有和时序控制语句结合才能使用,否则就会被死锁。例如:always areg=areg;这个always语句生成一个0延迟的无限跳变过程这时会发生死锁。但是一旦加上时序控制,这条语句就不一样了,例如: always #10 areg=areg;这样的语句就描述的一个周期为20毫秒的跳变信号。所以我们常用这种方法来描述时钟信号,并作为激励信号来测试硬件电路。看下面这个例子 &
41、#160; reg 7:0 counter; reg tick; always (posedge areg) begin tick=tick; counter=counter+1; end这个例子就是说每当信号areg上升沿到来时,信号tick取反,计数器counte
42、r加一,这种时间控制是always语句最常用的。always语句的时间控制模板如果组合逻辑块语句的输入变量过多容易漏掉,例如:always (a or b or c or d or e)这样的情况下可以用always (*)语句来代替,*号自动将所有输入变量默认为敏感信号。 上面所讨论的都是等待信号的值发生变化或者触发时才执行相应语句,我们也可以用wait语句来用电平敏感来控制。例如 always wait (count_enable) #20 count=count+1;意思就是说,当
43、count-enable的值为1时,程序延迟20毫秒后计数。 8、任务与函数 书上写了关于任务与函数的区别,写了好多,我觉得区别这两个概念主要看一点就够了,就是看有没有返回值,函数有,任务没有。举个例子 switch_bytes (old_bytes,new_bytes);这是个任务,没有返回值,功能是把新旧两个字节互换位置。new_bytes=switch_bytes(old_bytes);这是个函数,功能是把旧字节转换后赋值给新字节。有返回值。 下面写一个交通信号灯的程序来学习一下任务这个概念 moudle
44、60;xiaomo_traffic; reg clock,red,green,amber;/定义时钟,红灯,黄灯,绿灯parameter on=1,off=0,red_tics=350.amber_tics=30,green_ics=200; /定义红灯等待350个时钟,黄灯等待30个时钟,绿灯等待200个时钟initial red=0;initial green=0;initial amber=0;/初始化,这里用initial语句保证三条语句同时执行always begin red=on;
45、160; /红灯亮 light (red,red_tics); /这里用到任务,功能是等待350个时钟的时间,声明看下面程序 amber=on; /黄灯亮 light (amber,amber_tics); /等待30个时钟 green=on;
46、160; /绿灯亮 light (green,green_tics); /等待200个时钟 end task:light; /命名任务 output color; input 31:0 tics;
47、; /注意这里的两个变量要与上面的一一对应,也就是说上面的light(red,red_tics);中的red对应color,red_tics对应ticsbegin repeat(tics); /重复执行tics次下面的语句 (posedge clock); /等待上升沿,因为这里的tics对应上面的red_tics几个,所以这里要等待相应个上升沿 color=off; /等到相应个上升沿结束时,相应颜
48、色的灯关闭endendtask/下面就是写时钟函数了,用always块 always begin #100 clock=0; #100 clock=1; /每100毫秒产生一次跳变 endendmoudle 注意:这个程序要找对一一对应关系,例如脉冲模块里的clock对应posedge clock中的clock,程序行与行之间是有联系的,不能随便声明零基础学
49、FPGA(五)Verilog语法基基础基础(下)发布时间:2014-04-17 14:59:00 技术类别:CPLD/FPGA 个人分类:FPGA/CPLD9、关于任务和函数的小结,挑几点重要的说一下吧(1)任务具有多个输入、输入/输出和输出变量,在任务重可以使用延迟、事件和时序控制结构,在任务重可以调用其它任务和函数。与任务不同,函数具有返回值,而且至少要有一个输入变量,而且在函数中不能使用延迟、事件和时序控制结构,函数可以条用函数,但是不能调用任务。(2)在声明函数时,系统会自动的生成一个寄存器变量,函数的返回值通过这个寄存器返回到调用处。(
50、3)函数和任务都包含在设计层次中,可以通过层次名对他们实行调用。这句话什么意思啊?10、系统任务(1)$diplay和$write任务$display任务相当于C语言里的printf,用于输出信息,他的基本格式$display (p0,p1,p2);意思就是把p1、p2以p1的格式输出,至于具体格式,C语言里面讲的很清楚,下面用一张图帮大家回忆一下 此外,在display中,输出列表中的数据的现实宽度总是按照自动输出格式进行调整的。因此,我们通常在%和表示进制的符号之间加一个0来确保总是用最少的位数来表示表达式的当前值。例如begin r1=10;
51、; $display("size=%d=%h",r1,r1); $display("size=%0d=%0h",r1,r1);输出结果分别为 10,00a和10,a所以在以后写程序时,为了养成良好习惯,应该注意加上0来保证代码的可读性。 如果输出的列表中含有不定值或者高阻态时,要遵循下列情况(1)如果按10进制输出 如果输出列表全部为不定值,则输出为小写x; 如果输出列表部分为不定值,则输出为大写X;
52、; 如果输出列表全部为高阻态,则输出为小写的z; 如果输出列表部分为高阻态,则输出为大写的Z;(2)如果按十六进制或者8进制输出 那么十六进制对应的四位或者8进制对应的3位中,如果部分是高阻态或者是不定值,那么输出结果为大写的Z或者X否则就输出小写的z或者x;例如 (2)$monitor 系统任务$monitor提供了监控和输出参数列表中的表达式或变量值的功能,其参数列表中输出控制格式字符串和输出列表的规则和$display一样,当启动一个带有一个或者多个的$monitor任务时
53、,仿真器则创立一个仿真机制,使得每当参数列表中的表达式或值发生变化时,整个参数列表中的变量或者表达式的值都将输出显示,如果在同一时刻,两个或者多个参数的值发生变化,则在这时刻只输出显示一次,但在$monitor任务中,参数可以是$time系统函数,这样参数列表中变量或者表达式的值同时发生变化的时刻可以通过标明同一时刻的多行输出来显示。例如$monitoron和$monitoroff的功能就是通过打开或者关闭监控标志来控制监控任务$monitor的启动和停止。这样可以使得程序员很容易的控制$monitor什么时候执行了。 (3)时间度量系统函数$time 在ve
54、rilog hdl语法中有两种时间度量系统函数,分别是$time和$realtime,用这两个系统函数可以得到当前的仿真时刻。$time可以返回一个64位的值来记录当前的仿真时刻。(4)$finish系统任务$finish的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。格式是$finish或者$finish(1);如果不带参数,则默认参数为1,下面是具体参数下系统输出的特征信息。 0 不输出任何信息 1 输出当前仿真时刻和位置 2 输出当前仿真时刻、位置和在仿真过程中所用me
55、mory及CPU时间的统计。 表示看不懂. (4)系统任务$stop $stop任务作用是把EDA工具置成暂停模式,在仿真环境下给出一个交互式的命令操作符,将控制权交给用户。这个任务可以带有参数表达式,根据参数值(0、1、2)的不同,输出不同的信息,参数值越大,输出信息越多。 (5)系统任务$random 这个系统函数提供了一个产生随机数的手段,当函数被占用时返回一个32位的随机数,它是一个带符号的整形数。 下面是一个产生随机数的例子
56、0; reg23:0 rand; rand=$random %60; 上面的例子产生一个-59到59之间的随机数,所以$random的用法是产生一个(-b+1)到(b-1)之间的随机数。 下面的例子通过并位产生一个值在059之间的随机数 reg23:0 rand; rand = $random %60
57、; 利用这个系统函数可以产生随机脉冲序列或宽度随机的脉冲序列,用于电路的测试。 下面是个产生随机脉冲序列的例子 (6)关于编译预处理 编译预处理这部分和C语言差不多,主要用到的是define、include、和时间尺度timescale define 就是宏定义,在C语言了用的也比较多,在verilog中灵活的使用宏定义可以增加程序的可读性,又方便修改。例如在声明一个8位寄存器时用宏定义 define WINDOWS 8 module reg 1:WINDOWS date; 习惯上一般宏定义的内容用大写字母表示,这里的WINDOWS就代表数字8,在下面的程序中调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年江苏省南京市玄武区双校联考中考数学一模试卷
- 联合国日主题阅读课件
- 世界艾滋病日:消除歧视关爱患者课件
- 国际宽容日:学会宽容与理解课件
- 2025年贵州专升本历史考试试题及答案
- 侯马花艺设计提升试卷
- 2026济南历城二中高一英语分班考试真题含答案
- 2025年贵州省理科专升本考试真题及参考答案
- 2026年“十八项医疗核心制度”培训考试真题卷附答案
- 2026成都八中高一入学英语分班考试真题含答案
- 3.2.1 分数除以整数 教学课件2026-2027学年人教版数学六年级上册
- 译林版七年级英语上册知识清单
- 2026秋冀少版新教材七年级上册生物学每课知识点清单
- 中国重症患者液体管理专家共识(2026版)
- 2026年福建省中考历史试卷(含答案及解析)
- 2026年6月英语四级真题(第一套)附答案
- 燃料电池发动机YHT30版用户使用手册
- 2026年全国翻译专业资格考试(CATTI)三级口译英语口译综合能力真题
- 农业政策学(第二版) 课件 第5章 农业科技政策
- GB/T 17428-2026建筑管道耐火试验方法
- 中国麻醉科糖尿病患者围术期管理指南(2026版)
评论
0/150
提交评论