Presentation is loading. Please wait.

Presentation is loading. Please wait.

EDA技术 廖义奎.

Similar presentations


Presentation on theme: "EDA技术 廖义奎."— Presentation transcript:

1 EDA技术 廖义奎

2 第10章 FPGA Verilog HDL编程基础

3 本次课内容 10.7 always过程 10.8 赋值 10.9 行为描述

4 10.7 always过程 Verilog HDL中并没有进程的概念,但却有与进程相同功能的三种过程,分别是 assign、always和模块实例,这三种在执行的方式上与进程一样,在过程之间是并行执行的。 模块实例已在前面介绍过,assign将在赋值一节中介绍。这一节将介绍always过程。

5 10.7.1 always过程 always过程相当于一个进程,即always块与always块之间是并行工作的,而块内就顺利执行的。

6 always过程的格式如下: (敏感信号列表) begin 赋值语句 分支语句 循环语句 任务、函数调用 end

7 对于always过程,具有如下特点: (1)重复多次执行的语句,是编写触发器、同步设计中最常用的语句,也是仿真中产生时钟常用的语句。
(3)always块内的程序是顺利执行的。always块内的顺序执行与阻塞式赋值语句在功能上基本相同,但在用法上有点差别。

8 对于always过程,需要注意如下几点:
(2)“begin-end”之间的语句称为块语句,其中的语句是按照串行方式顺序执行的。

9 (敏感信号列表)是可选的,敏感信号列表列出了触发条件,只有当触发条件满足的时候,后面的“begin-end”语句块才会执行,当有多个触发条件的时候,触发条件之间用“or”或者逗号“,”分开,具体的格式如下: @(触发条件1,触发条件2,……,触发条件N)

10 10.7.2 触发方式 Verilog触发方式分为电平触发、边沿触发两种: (1)电平触发如图10.7所示。
(2)边沿触发如图10.8所示。

11 例如: 上升沿与下降沿都触发,从功能上看,与电平触发效果一样,所以也有人把这种方式叫做电平触发,但如果从严格意义上看,还是不太一样。
(CLK) a<=b

12 边沿触发在Verilog中又分为两种: (1)上升沿触发如图10.9所示,用关键字posedge描述; 例如:
(posedge CLK) cntr<=cntr+1 以上语句指当CLK的上升沿时,将cntr的值加1。

13 (2)下降沿触发如图10.10所示,用negedge描述。
例如: (negedge CLK) cntr<=cntr+1 以上语句指当CLK的下降沿时,将cntr的值加1。 在每一个always过程中只能有一种触发条件存在于敏感信号列表中,最好不要混合使用。在时序电路中always块通常是用时钟边沿触发。

14 事件及敏感信号列表 在Verilog HDL的always模块中,有四种事件,即上面介绍的四种触发方式产生的事件,分别是电平触发事件、上升沿触发事件(posedge)、下降沿触发事件(negedge)和用户自定义事件。 电平触发事件一般用于逻辑电路建模之中,只要信号的电平发生改变,都将触发电平事件,使用方法如下: always @ (a,b); 或者写成:always @ (a or b);

15 上升沿触发事件和下降沿触发事件一般用于同步电路(例如触发器、寄存器及锁存器等)建模,使用方法如下:
always @ (posedge clk); //上升沿触发事件 always @ (negedge clk);//下降沿触发事件 也可以对多个事件起作用,例如: always @ (posedge clk,posedge a);

16 2001版本支持的always敏感信号列表方式 always @(a or b or c)中的or可用”,”代替,例如:
    always @(a ,b, c) always     always @* Verilog HDL允许使用者自行声明一个事件,事件的声明以event作为标识符。Quartus II中支持自定义事件的综合。

17 例如: event transfer; always@ (posedge clk) if (condition_a)
(transfer) dout <=data_from_fuifo  

18 10.8 赋值 Verilog HDL的赋值分为两类: 一是持续赋值, 二是过程赋值。

19 10.8.1 持续赋值 持续赋值是给wire类型的变量赋值。
可以用持续赋值语句描述组合逻辑,代替用门电路的描述方式。持续赋值在过程块外部使用。 持续赋值只能在等式左边有一个简单延时说明。 持续赋值一般多用于组合逻辑电路的设计。

20 语法: <assign> [#delay] [strength] <net_name> = <expressions> 例如: wire out; assign out =in_data_a|in_data_b; //也可以不经assign而用wire直接指定,这种方式较为简捷 wire out =in_data_a|in_data_b;

21 过程赋值是给寄存器类型的变量赋值。寄存器类型包括reg、integer、real、time等。
这些值在被赋值之后将保持不变,直到被其它的过程语句赋予新值为止,而assign语句的赋值对象只能是线网类型(wire),而且它的值连续不断地变化。

22 过程赋值多用于时序逻辑电路的设计。 过程赋值分为阻塞式赋值与非阻塞式赋值。非阻塞式语句主要用于时序器件,阻塞式语句主要用于组合逻辑。

23 10.8.2 阻塞式赋值 在顺序模块内,某条语句未执行完之前,不会执行下一条语句。阻塞式赋值语句符号是“=”。
下面通过两个例子来加深对阻塞式赋值的理解。

24 示例10.7: module verilog_1(input in1,in2,clk, output reg out); reg temp;
clk) begin temp=in1|in2; out=temp; end endmodule

25 示例10.8: module verilog_1(input in1,in2,clk, output reg out); reg temp;
clk) begin out=in1|in2; end endmodule 示例10.8综合结果和示例1的综合结果完全一样。

26 非阻塞式语句 在顺序模块内,某条语句的执行并不阻塞下一条语句的执行,即在这条语句执行时,下一条语句也同时执行。阻塞式赋值语句符号是“<=”。 下面是采用非阻塞式语句的示例,该示例代码形式与前面刚介绍的两个例子相似,但综合出来的结果却不相同。

27 示例10.9: module verilog_1(input in1,in2,clk, output reg out); reg temp;
clk) begin temp<=in1|in2; out<=temp; end endmodule

28 module verilog_1(input in1,in2,clk, output reg out); reg temp;
clk) begin temp=in1|in2; out=temp; end endmodule module verilog_2(input in1,in2,clk, temp<=in1|in2; out<=temp; end endmodule module verilog_3(input in1,in2,clk, out=temp; temp=in1|in2; end endmodule module verilog_4(input in1,in2,clk, out<=temp; temp<=in1|in2; end endmodule module verilog_5(input in1,in2,clk, clk) begin module verilog_6(input in1,in2,clk, in1, in2) begin

29

30 10.9 行为描述

31 10.9.1 if条件语句 条件语句由“if else”实现,它具有如下特点: (1)if语句只能在initial或always区块内使用;
(2)可以嵌套使用; (3)在多个平行条件时,例如3-8译码器、七段译码器等程序中,用case比if好;

32 (4)一般情况下应写完if语句,即写成if else的形式,以避免综合出锁存器;
(6)如果在连续的if语句中没有begin end,else句子将与离它最近的if句子匹配。

33 10.9.2 case多路选择语句 实现多径选择。另外还有两种增强的case语句casex、casez,支持1、0、x和z四种信号类型。
在casez语句中,出现在条件表达式和任意分支项表达式中的值z被认为是无关值,出现z的那个位在比较时被忽略。 在casex语句中,值x和z都被认为是无关位。实际使用中,字符“?”可用来代替字符“z”。 casez和casex都用endcase结束。

34 if语句与case语句的比较 时序上,如果是多重if语句,一般情况下一个if语句会综合出一个逻辑比较电路,层次多了,延迟时间就长。 电路大小上,对于较少选择项情况,用的if和case语句差别不是很大,有时是if语句电路大一些,有时是case大一些。但是,在选择项非常多时,用case综合出的电路要小一些。

35 10.9.4 循环语句 循环语句分为while、for、repeat、forever四种,必须在initial和always块中才能使用。
  大多情况下,循环将由并行的硬件电路来实现,因此要注意循环的范围。

36 示例10.10: module verilog_1(input[7:0] a, output reg[7:0] y );
integer i; begin for(i=0;i<7;i=i+1) y[i]=~a[i]&a[i+1]; end endmodule

37 下面是while语句应用例子(示例10.11) module verilog_1(input[7:0] a, output reg[7:0] y ); integer i; begin i=0; while(i<7) y[i]=~a[i]&a[i+1]; i=i+1; end endmodule

38 下面是repeat语句应用例子(示例10.12 ) module verilog_1(input[7:0] a, output reg[7:0] y ); integer i; begin i=0; repeat(8) y[i]=y[i]&a[i]; i=i+1; end endmodule

39 无限循环语句,一般在仿真中用。如果要在电路综合中实现一个无限循环的功能,该如何做?
那当然是用事件触发方式,不用无限循环。 无限循环可综合出无限多个电路模块,无限多的电路模块如何做出来?

40 下面是forever语句应用例子(示例10.13)
module verilog_1(input[7:0] a, output reg[7:0] y ); initial begin forever y[1]=a[2]&a[4]; end Endmodule 上述程序在quartus中综合没有报错,但没有电路输出。

41 Verilog HDL任务及函数定义

42 函数 Verilog HDL中的函数与C语言等其它高级语言的功能与用法相似。函数要返回一个向量值,在函数定义时在函数名前说明范围。函数中需要多条语句时用begin和end。 函数只能返回一个值,函数一经调用就必须立即执行,其内部不能包含任何时序控制,函数可以调用函数,但不能调用任务,函数至少有一个输入。 语句:function fname; //其它语句 Endfunction

43 下面是函数的一些特点: (1)函数定义中不能包含任何时序控制语句。 (2)函数至少有一个输入,不能包含任何输出或双向端口。
(3)函数只返回一个数据,其缺省为reg类型。 (4)传送到函数的参数顺序和函数输入参数的说明顺序相同。

44 (5)函数在模块(module)内部定义。
(6)函数不能调用任务,但任务可以调用函数。 (7)函数在Verilog中定义了一个新的范围(scope)。 (8)虽然函数只返回单个值,但返回的值可以直接给信号连接赋值。这在需要有多个输出时非常有效。

45 10.10.2 任务 任务是一个与函数功能相似的子程序,一般在能用函数的地方,都可用任务代替。但是,任务的功能比函数强,用法更加灵活。
语句:  task tname; //其它语句 endtask

46 下面是任务的一些特点: (1)任务与函数只能用于模块内,可以在块内定义和调用; (2)任务可以定义input和output;
(3)任务内可直接用if、for等语句,但不能用always语句; (4)任务一般需要在always块内调用; (5)任务可在调用前定义,也可在调用后定义; (6)每个任务调用的综合一般都由一个电路实现,所以多个任务调用就需要多个电路块。

47 下面是一个使用任务的例子,在任务中定义输入输出端口,在模块中调用该任务的方法与调用函数一样,在括号中列出要代入的参数。代码如下(示例10
下面是一个使用任务的例子,在任务中定义输入输出端口,在模块中调用该任务的方法与调用函数一样,在括号中列出要代入的参数。代码如下(示例10.14) module verilog_1(input din,clk,nrst,output dout); wire dff_0,dff_1,dff_2,dff_3; clk or negedge nrst) begin aaa(din,clk,nrst,dff_0); end

48 task aaa; input d1,clk1,nrs1t; output reg q1; begin if(~nrs1t) q1<=0; else q1<=d1; end endtask endmodule

49 下面的例子也是使用了任务,但该任务没有定义输入输出端口,而是直接使用了模块中的输入输出端口以及全部变量,完成了与上一个例子完全相同的功能,代码如下:示例10.15:
module verilog_1(input din,clk,nrst,output reg dout); clk or negedge nrst) begin aaa; end task aaa; begin if(~nrst) dout<=0; else dout<=din; end endtask endmodule

50 10.10.3 函数与任务间的比较 (1)函数与任务间的共同点很多,但也存在一些差别,例如:
(2)函数只能返回一个值,而任务可以有多个返回值; (3)函数一经调用就必须立即执行,其内部不能包含任何时序控制,而任务内部可以有时序控制; (4)函数可以调用函数,但不能调用任务,而任务即可调用函数,又可以调用任务; (5)函数至少有一个输入,而任务可以没有输入端。

51 小 结


Download ppt "EDA技术 廖义奎."

Similar presentations


Ads by Google