电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

大学初学FPGA之Verilog基础篇(二)

用两天时间把verilog语法基础篇都学完了,今天总结一下

 

/*************************************************************************************************

/*内容:verilog语法基础篇(二)

/*作者:李白

/*时间:2014-3-24

/*************************************************************************************************

一、赋值语句和块语句

1、verilog中有两种赋值方式:

(1)非阻塞赋值方式(如b<=a;)

注意:在语句块中上面语句所附变量值不能立即为下面的语句所用;

          块语句结束后才能完成这次赋值操作,所赋的变量值是上一次赋值得到的;

          是编写可综合时许逻辑电路模块做常用的赋值方法

(2)阻塞赋值(如b=a)

注意:赋值语句完成后块才结束

          b在赋值语句结束后立马变化

 在时序逻辑电路中可能产生意想不到结果

注意区分非阻塞语句和阻塞语句的作用,一个是等块语句结束后才变化,一个是赋值后立马变化

/*************************************************************************************************/

二、块语句

块语句分为两种:一种为顺序快(begin-end),另一种是并行执行块(fork-join)

1、begin-end语句

相当于C语言中的大括号{ },块内的语句都是顺序执行的,一条语句的延迟时间是相对于他的仿真时间而言的,只有最后一条语句执行完了以后才跳出块语句。

2、fork-join语句

块中的每一条语句中都是并行执行的,即同时执行的,只不过有的语句自己加了延时,所以就相对延时时间往后推移。

/**************************************************************************************************/

三、条件语句(if-else语句)

if - else语句基本上和c语言中的用法差不多,这里只记录要注意的地方

(1)条件语句只在工程块中使用,即在initial(现在简单理解为所有initial语句都是并行执行的,并且只执行一次)和always语句中(语句一直执行知道条件不满足,所有的always块也是并行执行的)。除了这两种语句外的其他模块都不能编写条件语句。

(2)系统对表达式进行判断,若为0,x,z则按假处理,若为1则按真处理。

(3)在always块中要注意正确使用if - else语句

eg:

always @ (a or b)

     begin 

            if(a)   q=d;

     end  

或产生锁存器,因为在给定的条件下没有赋值没这个变量还保持原值。

eg:

always @ (a or b)

     begin 

            if(a)   q=d;

            else   q=0;

     end  

正常,不会产生锁存器;通过这个例子以后一定要注意代码的完整性!

if-else语句其他用法和C都差不多。

/**************************************************************************************************/

四、case语句

1、case语句一般用于微处理器的指令译码,它的一般形式如下

(1)case(表达式) endcase

(2)casez(表达式)          endcase//不考虑高阻态z的比较过程

(3)case**x(表达式)          endcase//不考虑高阻态z和不定态x

2、defiault项可有可无,但最多只有一个

3、case分项必须不相同,否则会出现问题。

4、如果在所有的可能中没有包含全,还没有default。这种情况下就会产生锁存器。

/***********************************************************************************************/

五、循环语句

verilog中有4中循环语句

1、forever语句:连续执行语句

格式如下:

forever      语句;

forever    begin    多条语句;     end

2、repeat语句:连续执行n次

格式

repeat(size)   begin   多条语句;    end

3、while语句:执行语句,知道条件不满足。

格式:

while(表达式)  语句;

或者:

while(表达式)   begin     多条语句;  end

(4)for语句:和C语言用法一样

格式:

for(表达式1;表达式2;表达式3)  语句;

/*************************************************************************************/

六、生成快

Verilog中有3种创建生成语句的方法,它们分别是:

1、循环生成;

循环生成语句允许使用者对下面的模块进行实例引用

(1)变量声明

(2)模块

(3)用户定义原语、门级原语

(4)连续赋值语句

(5)initial块和aways块

Eg:

generate 

for(j=0;j

begin : xor_loop

                xor  g1 (out[j] , i0[j] , i1[j]);

end

endgenerate

2、条件生成语句

在模块设计中可以有条件的调用一下verilog结构

(1)模块

(2)用户定义原语、门级原语

(3)连续赋值语句

(4)initial 块或always 块

generate 

        if(***) ***

        else     ***

endgenerate

3、case生成语句

可以在设计模块中有条件的调用下面这些Verilog结构

(1)模块

(2)用户定义原语、门级原语

(3)连续赋值语句

(4)initial 块或always 块

eg;

generate

case(N)

1: ***

2: ***

        default: ***

endcase

endgenerate

七、结构说明语句

Verilog语句中的任何过程模块都从属以下4种结构说明语句

1、initia语句

(1)用initial块对存储器变量赋初值

(2)产生测试波形l

(3)所有initial语句块同时执行,都只执行一次

2、always

(1)触发条件之间可以用 "or" 关键字或者","

(2)@ *表示将所有输入变量都自动包括进敏感列表

3、task(任务)

(1)、语法:

task<�任务名>

<�端口声明>

<�语句1>

<�语句2>

<�语句3>

endtast

(2)、任务的调用

<�任务名> (端口1,端口2,...,端口n)

eg:

my_task(v,w,x,y,z);

4、function

(1)函数的语法和task差不多

function <�返回值的类型或范围> (函数名)

<�端口说明语句>

<�变量类型说明语句>

begin

<�语句>

......

end

endfuntion

(2)注意:

函数的定义不能包含任何时间控制语句,即#、@、或wait语句

函数不能启动任务

定义一个函数至少要有一个输入参数

/**********************************************************************************************************

今天就写这么多吧,晚安,加油!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

博主
3225777378@qq.com
大学初学FPGA
自己大学期间学习FPGA记录
点击跳转