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

2015-3-24 23:26 941 16 16 分类: FPGA/CPLD
用两天时间把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语句
函数不能启动任务
定义一个函数至少要有一个输入参数
/**********************************************************************************************************
今天就写这么多吧,晚安,加油!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

文章评论0条评论)

登录后参与讨论
我要评论
0
16
关闭 站长推荐上一条 /2 下一条