第三章行为级建模-语句篇
- 格式:pdf
- 大小:443.47 KB
- 文档页数:55
连载《fpga线下培训-第6天》【FPGA数据流建模、⾏为级建模、结构化建模区别】及【Ve。
这篇⽂件记录,FPGA的3种建模⽅式及基本的Verilog HDL语法,内容会根据学习进度,不断更新⼀、FPGA的3种建模⽅式 A、数据流建模(assign)在数字电路中,信号经过组合逻辑时会类似于数据流动,即信号从输⼊流向输出, 并不会在其中存储。
当输⼊变化时,总会在⼀定时间以后体现在输出端 同样,我们可以模拟数字电路的这⼀特性,对其进⾏建模,这种建模⽅式通常被称为数据流建模 1.1、是使⽤连续赋值语句(assign)对电路的逻辑功能进⾏描述,该⽅式特别便于对组合逻辑电路建模 1.2、连续驱动,连续赋值语句是连续驱动的,也就是说只要输⼊发⽣变化,都会导致该语句的重新计算。
1.3、只有线⽹型的变量才能在assign语句中被赋值 1.4、因为assign语句中被赋值的变量,在仿真器中不会存储其值,所以该变量必须是线⽹(Nets)类型,不能是寄存器(reg)类型 1.5、线⽹类型的变量,可以被多重驱动,也就是说可以在多个assign语句中驱动同⼀个net 1.6、reg型变量,不能被不同的⾏为进程(eg:always块)驱动 1.7、建议使⽤assign对组合逻辑建模,这是因为assign语句的连续驱动特点与组合逻辑的⾏为⾮常相似, ⽽且在assign语句中加延时可以⾮常精确地模拟组合逻辑的惯性延时。
1.8、assign语句与⾏为语句块(always和initial)、其它连续赋值语句、门级模型之间是并⾏的。
⼀个连续赋值语句是⼀个独⽴的进程,进程之间是并发的,同时也是交织的 B、⾏为级建模(initial、always) ⾏为⽅式的建模是指采⽤对信号⾏为级的描述(不是结构级的描述)的⽅法来建模。
在表⽰⽅⾯,类似数据流的建模⽅式,但⼀般是把⽤initial 块语句或always 块语句描述的归为⾏为建模⽅式。
行为级建模和结构化建模解读一、行为级建模行为级建模是一种系统建模方法,它主要关注系统的动态行为和交互。
这种建模方法特别适合于模拟和分析实时、嵌入式系统。
行为级建模具有以下几个主要特点:1. **重点在动态行为**:行为级模型的主要目标是捕获系统的动态行为,例如系统的响应时间和性能等。
这使得它成为对实时和嵌入式系统进行模拟和性能分析的理想选择。
2. **关注交互**:行为级建模强调系统各部分之间的交互,以及这些交互如何影响系统的整体行为。
这种交互可以包括硬件与硬件、硬件与软件、软件与软件之间的交互。
3. **抽象层次高**:虽然行为级模型详细描述了系统的动态行为,但它通常在一个相对高的抽象层次上工作,以便更有效地理解和分析系统。
这意味着模型可能会忽略一些细节,以简化模型并突出主要的行为特性。
4. **支持多种分析**:由于行为级模型关注动态行为,它可以支持多种分析,如性能分析、可靠性分析、控制系统分析和能源消耗分析等。
二、结构化建模结构化建模是一种更传统的系统建模方法,其重点是系统结构和组成部分之间的关系。
结构化建模主要基于自上而下的设计原则,将系统分解为更小的、更易于管理的部分。
以下是结构化建模的一些关键特点:1. **关注系统结构**:结构化模型强调系统的组成和各部分之间的关系。
这有助于更好地理解系统的整体结构和功能。
2. **分解和模块化**:结构化建模通常将系统分解为多个模块或组件,每个模块执行特定的功能。
这有助于简化设计和分析过程。
3. **顺序和流程**:在这种方法中,通常强调模块之间的顺序和流程关系,而不是并行或并发关系。
4. **强调因果关系**:结构化模型强调事件之间的因果关系,而不是实时交互或并发行为。
5. **易于理解和分析**:由于结构化模型通常更简单、更直观,因此更容易理解和分析。
这对于初步的系统设计阶段尤其有用。
总结:行为级建模和结构化建模是两种不同的系统建模方法,各有其优点和适用场景。
电磁特征行为级建模1.引言1.1 概述概述电磁特征行为级建模是一种通过分析和描述物体或系统在电磁环境中的行为来为其建立模型的方法。
在不同的电磁场环境中,物体或系统的电磁行为会产生不同的特征,这些特征可以被捕捉和分析,以进一步理解和预测其性能和行为。
传统的建模方法主要依赖于物理模型和经验模型,这些模型通常需要复杂的数学推导和实验数据验证。
然而,随着电磁感应技术的进步和计算能力的提高,电磁特征行为级建模成为一种更加高效和准确的建模方法。
电磁特征行为级建模的核心思想是通过采集和分析物体或系统在电磁环境中的电磁信号,利用机器学习、数据挖掘和模式识别等技术,提取出关键的特征信息,并将其作为建模的基础。
这种方法能够更好地描述物体或系统的电磁行为,同时减少了对物理模型的依赖。
通过建立准确的电磁特征行为级模型,我们可以更好地理解和优化物体或系统在复杂电磁环境下的性能和行为。
本文将首先介绍电磁特征行为的概念和特点,包括电磁信号的产生、传播和感应机制等。
接着,将详细介绍电磁特征行为级建模的方法和技术,包括特征提取、模型训练和评估等方面。
最后,对电磁特征行为级建模的应用前景进行展望,并提出未来的研究方向和挑战。
通过对电磁特征行为级建模的研究和应用,我们可以更好地理解和掌握物体或系统在电磁环境中的行为规律,为电磁感应和应用提供更准确和可靠的模型基础。
这将有助于推动电磁技术在各个领域的应用和发展,提高系统的性能和可靠性。
1.2文章结构文章结构部分的内容应该包括以下内容:在该部分,我们将对本篇文章的结构进行介绍。
本文共分为三个主要部分:引言、正文和结论。
引言部分将首先对电磁特征行为级建模的概念进行概述,说明其在相关领域中的重要性和应用。
接着我们将介绍文章的结构,包括各个章节的内容和顺序。
最后,我们将明确阐述本文的目的,指明我们所探讨的问题和研究的目标。
正文部分将详细介绍电磁特征行为的概念和相关知识。
我们将探讨电磁特征行为的定义、特点和发展趋势,并提供一些实际的案例和应用。
verilog中的initial语句首先说说结构化过程语句,在verilog中有两种结构化的过程语句:initial语句和always语句,他们是行为级建模的两种基本语句。
其他所有的行为语句只能出现在这两种语句里与C语言不通,verilog在本质上是并发而非顺序的。
verilog中的各个执行流程(进程)并发执行,而不是顺序执行的。
每个initial语句和always语句代表一个独立的执行过程,每个执行过程从仿真时间0开始执行并且两种语句不能嵌套使用。
下面举例解释之:initial语句所有的initial语句内的语句构成了一个initial块。
initial块从仿真0时刻开始执行,在整个仿真过程中只执行一次。
如果一个模块中包括了若干个initial块,则这些initial块从仿真0时刻开始并发执行,且每个块的执行是各自独立的。
如果在块内包含了多条行为语句,那么需要将这些语句组成一组,一般式使用关键字begin和end将他们组合在一个块语句;如果块内只有一条语句,则不必使用begin和end.下面给出了initial语句的例子:[cpp]view plain copyprint?1. module stimulus2.3. reg x,y, a,b, m4.5. initial6. m = 1'b0;7.8. initial9. begin10. #5 a = 1'b1;11. #25 b = 1'b0;12. end13.14. initial15. begin16. #10 x = 1'b0;17. #25 y = 1'b1;18. end19.20. initial21. #50 $finish;22.23. endmodule在上面例子中,三条initial语句在仿真0时刻开始并行执行。
如果在某一条语句前面存在延迟#<delay>,那么这条initial语句的仿真将会停顿下来,在经过指定的延迟时间之后再继续执行。
电路行为级建模1.引言1.1 概述电路行为级建模是电子电路设计领域中的一个重要概念。
它是通过对电路中各个元件的行为进行描述和建模,从而实现对电路整体性能和行为表现的预测和分析。
与传统的物理级建模相比,电路行为级建模更侧重于描述和分析电路的功能和行为,而不涉及具体元件的物理特性和结构。
在电子电路设计过程中,电路行为级建模具有很大的优势和应用价值。
首先,它可以帮助设计人员在早期阶段对电路进行性能评估和功能验证,从而减少设计周期和成本。
其次,通过建立准确的电路行为模型,可以更好地理解和分析电路的工作原理,帮助设计人员进行优化和改进。
电路行为级建模在不同领域有着广泛的应用。
在通信领域,它可以用于建模和分析调制解调器、射频前端电路等复杂的通信系统。
在数字电路设计中,电路行为级建模可以用于建模和验证处理器、存储器等数字系统的功能和性能。
此外,在模拟电路设计和集成电路设计中,电路行为级建模也是不可或缺的工具。
总之,电路行为级建模在电子电路设计中具有重要的意义和价值。
它通过描述和分析电路的功能和行为,帮助设计人员进行性能评估和功能验证,优化和改进电路设计。
随着电子技术的不断发展,电路行为级建模将继续发挥重要作用,并有望在未来取得更大的突破和应用。
1.2 文章结构本文主要围绕电路行为级建模展开,文章结构如下:第一部分:引言在引言部分,我们将对电路行为级建模进行概述,阐述本文的目的,并说明文章的结构安排。
第二部分:正文2.1 电路行为级建模的定义和背景本节将对电路行为级建模的概念进行详细阐述,并介绍背景知识。
我们将讨论电路行为级建模是如何对电路进行抽象和描述的,以及它在电路设计中的作用和意义。
2.2 电路行为级建模的优势和应用在本节中,我们将探讨电路行为级建模相对于其他建模方法的优势和特点。
我们将分析其在不同领域中的应用案例,包括电路仿真、系统级设计以及嵌入式系统等方面。
第三部分:结论3.1 总结电路行为级建模的重要性和价值在本节中,我们将总结电路行为级建模对于电路设计的重要性和价值。
对于数据流建模和⾏为级建模的梳理(重点)数据流建模,输⼊输出的类型⼀般为wire⾏为级建模,输⼊的类型⼀般为reg,输出的类型为wire,因为always其中的等号左边的式⼦的值必须是reg类型的//数据流建模module and2(x1, x2, z1);input x1, x2;output z1;wire x1, x2;wire z1;assign z1 = x1 & x2;endmodule//⾏为级建模module or3(x1,x2,x3,z1);input x1, x2, x3;output z1;wire x1, x2 , x3;reg z1;always @ (x1 or x2 or x3) // always的变量z1必须为reg类型的beginz1 = x1 | x2 | x3;endendmodule从上⾯也能看出:数据流建模,⼀般⽤assign声明描述电路⾏为(连续赋值语句。
因此这⾥的输出必须设置成wire类型)⾏为级建模,⼀般⽤initial 或者always (过程连续赋值语句,因为这⾥有always,输出必须设置成reg类型的)在testbench中,输⼊是reg类型,输出是wire类型://这⾥有for循环类型的module or3_tb;reg x1, x2, x3;wire z1;initialbegin : apply_stimulusreg [3:0] invec;for(invec = 0; invec < 8; invec = invec + 1)begin{x1, x2 ,x3} = invec [3:0];#10 $display ("x1x2x3 = %b , z1 = %b ",{x1, x2, x3}, z1);endendor3 inst(.x1(x1),.x2(x2),.x3(x3),.z1(z1));endmodule//类似于枚举类型的module add_tb;reg x1, x2;wire z1;//diaplay variablesinitial$monitor ("x1 = %b, x2 = %b, z1 = %b", x1, x2, z1);//applayinitialbegin#0 x1 = 1'b0;x2 = 1'b0;#10 x1 = 1'b0;x2 = 1'b1;#10 x1 = 1'b1;x2 = 1'b0;#10 x1 = 1'b1;x2 = 1'b1;#10 $stop;endadd ins(.x1(x1),.x2(x2),.z1(z1)); endmodule当然还有其它类型。
第三章基于Verilog HDL语言的设计(四)基于Verilog HDL语言的设计(四)本节课将讲解Verilog HDL行为建模方法,同学们需掌握并行块和顺序块、条件语句、循环语句、赋值语句等常见Verilog HDL语句的结构,这是行为建模的基础。
3.4.1 顺序块和并行块语句Verilog HDL中使用块语句将多条语句组合成一条复合语句。
复合语句块语句分为顺序块语句和并行块语句。
块语句分为顺序块语句和并行块语句顺序块格式:beginbegin 块名块内变量参数定义;执行语句1;执行语句2;块内变量、参数定义;执行语句1;……..end 执行语句2;……..end并行块 格式:fork执行语句1;fork块名块内变量、参数定义语句;执行语句2;…执行语句1;执行语句2;join…join例顺序块和并行块程序执行过程的区别例:顺序块:并行块:fork s=0;begin s=0;s 0;#2 s=1;#4s=0;#2 s=1;#2 s=0;#4 s 0;#7 s=1;#8s=0;#3 s=1;#1 s=0;#8 s 0;joinend3.4.2 条件语句if语句格式:(3)if(表达式1) <语句1>;(1)if(表达式) <>;else if(表达式2) <语句2>;语句;(2)if(表达式)……else if(表达式n)<语句1>;<语句n>; elseelse <语句2>;<语句n+1>;if后面的表达式,可以是逻辑表达式、关系表达式还可以是操作数。
若为0,x,z按“假”若为按“假”处理,若为1,按“真”处理,执行指定的语句()等价于()如if(a) 等价于if(a = =1)如果if和else后有多个执行语句,可以用begin… end块将其整合在一起b d块将其整合在起例:if(a > b)begin data_out1 <= a; data_out2 <= b; end elsedata out1<=b;data out2<=a;begin data_out1 b; data_out2 a;endif语句嵌套使用时,else与最近的if语句配对例:if(a >b)if(a>b)if ( c ) data_out <= c + 1;else data_out <= a + 1;l d t t1else data_out <= b;If-else数目不一致,最好使用begin-end块if(…)f()if(…) beginfor(…..) if(..)gfor(…..) if()begin if(..) begin语句组;endl语句组;endelse …….endelseelse …….如果不正确使用else,可能会生成不需要的锁存器。
module test (a,b,data_out);input a,b;p_output data_out;reg data_out;always @ (a or b)always@(a or b)beginif(a) data_out <= a;if(a)data out<=a;endendmoduleWarning (10240): Verilog HDL Always Construct warningat test11.v(7): inferring latch(es) for variable "data_out", which holds its previous value in one or more paths through the always constructthe always constructalways @ (a or b) beginif(a) data_out < a; if(a)data out<=a; else data_out <= b; enddif-else表达了一个条件选择的设计意图,它与条件运算符有重要的区别条件运算符可以出现在个表达式中9条件运算符可以出现在一个表达式中。
9if-else只能出现在always, initial块语句,或函数任务中,一般只能在行为建模中使用函数、任务中,般只能在行为建模中使用。
case语句如果选项数目很多,用if-else-if会不方便,可使用case语句。
语句格式:case(控制表达式)分支表达式1:语句1;…分支表达式n: 语句n;default: 默认语句;endcase各分支表达式值不能相同,如果多个不同的状态值有相同的执行语句,可以用逗号将各个状态隔开。
相同的执行语句可以用逗号将各个状态隔开例: case(select)2b00 : data_out <= data_in1;2'b00:data out<=data in1;2'b01 : data_out <= data_in2;2b10 : data_out < data_in3;2'b10:data out<=data in3;2'b11 : data_out <= data_in4;,,,,_;2'b0x,2'bx0,2'b1x,2'bx1,2'bxx: data out <= 4'bxxxx;2'b0z,2'bz0,2'b1z,2'bz1,2'bzz: data_out <= 4'bzzzz;default :$display("the control signal is invalid");endcased建议在case语句中最好加入default分支3.4.3 循环语句循环语句只能在initial,always块中使用。
下面介绍常用的循环句:for、forever、repeat 和while语句格式循环终止条件for语句语句格式:for(表达式1;表达式2;表达式3) 语句;改变循环控制变初始条件表达式量的赋值语句语句执行过程例:用for语句对存储器组进行初始化。
reg[7:0] my_memory[511:0];integer i;initialbeginfor(i=0; i<512; i=i+1)my_memory[i]<= 8’b0;end3.4 行为级建模例:用for语句对存储器组进行初始化。
reg[7:0] my_memory[511:0];integer i;initialbeginfor(i=0; i<512; i=i+1)my_memory[i]<= 8’b0;end设计练习:用for 语句描述的七人投票表决器module voter7(pass,vote);output pass;input[6:0] vote;i[60]reg[2:0] sum;integer i;integer i;reg pass;y@()always @(vote)beginsum=0;for(i=0;i<=6;i=i+1) //for 语句f(i0i6i i1)//fif(vote[i]) sum=sum+1;if(sum[2]) pass=1; //若超过4 人赞成,则pass=1 if(sum[2])pass=1;//4人赞成则else pass=0;endendmodulef循环般用于具有固定开始和结束条件的循环 for 循环一般用于具有固定开始和结束条件的循环,如果只有一个执行循环的条件,最好还是用while循环hil语句格式while 语句语句格式:while(条件表达式) 语句语句执行过程9先求解条件表达式的值,如果值为真(等于1)执行内嵌的执行语句(组)否则结束循环,执行内嵌的执行语句(组),否则结束循环。
9如果一开始就不满足条件表达式,则循环不执行module count(clk, data_out);input clk;input clk;output[12:0] data_out;reg[12:0]data out;reg [12:0] data_out;integer j;initial //data_out和j赋初值为0initial//data outbegin data_out = 0; j = 0;while(j<=100)begindata_out = data_out + j;data out=data out+j;j= j+1;end$display ("the sum is %d,j= %d",data_out,j); endforever语句语句格式:foreverforever语句;表示永久循环无条件地无限次执行其后的语句 表示永久循环,无条件地无限次执行其后的语句,相当于while(1),直到遇到系统任务$finish或$stop不能独立写在程序中,必须写在initial 结构中。
例:使用forever语句生成一个周期为20个时间单位的时钟信号。
g;reg clock;initialbeginbeginclock = 0;forever #10 clock = ~ clock;endrepeat语句语句格式:repeat(表达式))语句9repeat语句执行其表达式所确定的固定次数的循环操作。
9其表达式通常是常数,也可以是一个变量,或者一个信号,如果是变量或者信号,循环次数是循环开始时刻变量或信号的值,而不是循环执行期间的值。
3.4 行为级建模3.4.1 赋值语句Verilog HDL常用赋值方式有过程赋值和连续赋值两种过程赋值语句的更新对象是寄存器,整数,实数等,这些类型变量在被赋值后,可以保持不变,直到类变量在被赋值后可以保持不变到赋值进程又被触发,变量才被赋予新值。
连续赋值语句中,任何一个操作数的变化都会重新 连续赋值语句中,任何个操作数的变化都会重新计算赋值表达式,重新进行赋值。
module pipe(q3,d,clk); output [7:0] q3;p[]q;input [7:0] d;input clk;reg [7:0] q3,q2,q1;always @ (posedge clk) gbeginq1 = d;q2 = q1;q3 = q2;32endendmodulemodule pipe(q3,d,clk); output [7:0] q3;p[]q;input [7:0] d;input clk;reg [7:0] q3,q2,q1;always @ (posedge clk) gbeginq3 = q2;q2 = q1;q1 = d;1dendendmodule连续赋值常用于数据流行为建模。