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

2015-3-23 21:21 1338 14 14 分类: FPGA/CPLD

时间过得好快,转眼间就到大三了,暑假要去实习,下学期便开始求职之路。大学期间在实验室待了两年,玩过单片机画过板子学习了嵌入式编程,收获还是蛮多的。以前觉得计算机二级对我们电子通信专业来说没必要考,结果C基础不牢固便玩起了单片机,当我开始接触ARM是才看到自己的C还差的远远地。还好这次报了,昨天考的还不错,希望能拿个优秀。这学期开始学习FPGA,本科也没多少时间,希望自己能够尽快入门吧,毕竟这不是任何人都能够坚持下来的。我的FPGA道路从今天开始,希望在论坛里与大家一起学习,共同进步。以后会尽量每天更新一篇博客,大家叫我小白就好。

/*********************************************************************************************************************/
/*   内容:Verilog语法基础篇(一)
/*   作者:李白
/*   时间:2015-3-23
/*********************************************************************************************************************/
一、模块的结构、数据类型、变量和基本运算符号
1.1、模块的结构
(1)在Verilog中所有的过程块例如:initial块、aways块、连续赋值语句、实力引用语句都是并行的。(这几个关键字好想都不了解,先记下吧 )
(2)只有连续赋值语句assign和实力引用语句可以独立于过程块而存在于模块的功能定义部分。
(3)出现不分先后。(体现了并行的思想)
1.2数据类型及其常量和变量
Verilog**有19种数据类型,最基本的四种:reg、wire、integer、parameter其他类型的:large、medium、scalared、time、small、tri、trio、tril、triand、trior、trireg、vectored、wand、wor
1.2、常量:
Parametert用来定义常量
在一个模块中改变另一个模块的参数时,需要使用defparam命令。
eg:parameter   msb=7;  //定义参数msb为常量7
1.3、变量
网络数据类型表示结构实体之间的物理连接。网络类型的变量不能存储值,而且他必须受到驱动器(例如assign)的驱动。如果没有驱动器连接到网络类型的变量上,则该变量就是高组态,值为Z,常用的网络类型的变量有:wire、tri。这两个变量都是连接器件单元。Wire型变量通常用来表示单个门驱动或连续赋值语句驱动的网络型数据。tri型变量则用来表示多驱动器驱动的网络型数据。如果没有定义逻辑强度,再多驱动源的情况下就会出冲突,产生不确定的值。
(1)wire型
Wire型数据用来表示用以assign关键字指定的组合逻辑信号。可以做任何方程式的输入,也可以做assign语句或实例元件的输出。
eg:
wire            a;    //定义了一个一位的wire型数据
wire  [7:0]  b;    //定义了一个8位的wire型数据
wire  [4:1]  c,d; //定义了两个4位的wire型数据
(2)reg型
reg型数据初始值为不定值x,常用来表示always模块内的指定信号,常代表触发器。通常在设计中要由always模块通过行为描述语句来表达逻辑关系。在always模块内被赋值的没一个信号都必须定义成reg型。初始值为不定值,但当用作表达式的操作数时,它为正值。
eg:
reg                 rega;            //定义了一个一位的名为regal的reg型数据
reg   [3:0]      regb;            //定义了一个四位的名为regb的reg型数据
reg   [4:1]      regc,regd;    //定义了两个四位的名为regc,regd的reg型数据
(3)Memory型
通过扩展reg型数据地址范围来生成的。Egg:reg[7:0] mema [255:0]表示该存储器有256个8位的存储器。
注意一个由n个移位寄存器构成的寄存器组是不同于一个n位寄存器的
eg:
reg   [3:0]     rega:                //一个4位的寄存器 
reg   mema   [3:0];          //一个由n个一位寄存器构成的存储器组
一个n位寄存器可以在一条赋值语句中进行赋值,而一个完整的存储器则不行
rega=0;                           //合法赋值语句
mema=0;                        //非法赋值语句
如果想对memory中的存储单元进行读写操作,必须指定该单元在存储其中的地质
eg:
mema[3]=0;                    //给memory中的第三个存储单元赋值0   
/*****************************************************************************************************************
二、运算符及表达式
1、Verilog中的运算符范围很广,其运算符按其功能可分为以下几类:
(1)算术运算符(+,-,*,/,%)
(2)赋值运算符(=,<=)
(3)关系运算符(>,<,<=,>=)
(4)逻辑运算符(&&,||,!)
(5)条件运算符(?:);
(6)位运算符(~,|,^,&,^~)
(7)移位运算符(<<,>>)
(8)拼接运算符({ })
(9)其他
这里注意:基本上和C语言中的运算符相似。注意记忆几个运算符就好了(~取反、~按位异或、^~按位同或(异或非))
2、逻辑运算符
(1)逻辑运算符中"&&"和"||"的优先级低于关系运算符,"!"高于算术运算符
eg:
(a>b) && (x>y)   等价于:a>b && x>y;
(a==b) || (x++y)等价于:a==b || x==y;
(!a) || (a>b) 等价于!a || a>b
3、关系运算符
基本上与C语言一致
关系运算符优先级都形同,并且低于算术运算符的优先级
eg:
a < size-1 等价于 a< (size-1)
4、等式运算符
Verilog中有四种等式运算符
(1)==(等于)
(2)!= (不等于)
(3)===(等于)
(4)!==(不等于)
这四个运算符都是双目运算符,他要求有两个操作数。“==”和“!=”不能考虑不定值和高组态,而“===”和“!==”运算符则不同,他在对操作数进行比较的同时也对不定态和高组态也要进行比较。
5、移位运算符
<<左移
>>右移
6、位拼接运算符
{信号1的某几位,信号2的某几位......信号n的某几位}
eg:{a,b[3:0],w,3'b110}
{4{w}}允许拼接等同于{w,w,w,w}
{b,{3{a,b}}}嵌套等同于{b,a,b,a,b,a,b}
7、缩减运算符
缩减运算符是单目运算符,也有与或非运算,其运算结果为一位二进制,具体操作过程:操作数第一位与第二位进行与或非运算第二步将运算结果与第三位进行与或非运算
eg:
reg        [3:0]        B;
re        c        ;
        c=&B ;
相当于:c=((B[0]&B[1])&B[2])&B[3];

文章评论0条评论)

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