Verilog语法基础

Verilog编程基础:模块、信号、赋值与逻辑结构,

程序模块

1、Verilog程序如同其他编程语言的积序二后有快宁的源文件格式。Veriloc的源代码扩展名为.v,每一个Verilog文件都是一个Vorilo档地诗老可以理解为编程语言中的的数。其基本格式如下:

 module模块名(模块输入/输出信号);
 模块内容
 endmodule

其中模块名通常和文件名相同,同一个文件只定义一个模块,比如adder.v里就应该只定义一个叫adder的模块。这个要求和Java对类的要求很相似。

2、输人、输出信号则类似函数的返回值和参数,只不过在Verilog里并不把参数和返回值放到不同的地方定义,而是都写在一起。所有的参数或者返回值,最终都只是导线而已。而导线根据驱动信号的方向,可以有输人和输出区别。至于需要多少个输人、多少个输出,那就取决于具体的程序了。

3、模块内容则是模块内部的逻辑,也许有代码块( always),也许只是一些简单的接线( assign )。不过别忘了,一切最后都会回归到硬件。

4、最后说说模块的实例化,或者说调用。如前面所说,模块类似于软件编程语言里而的函数,它也确实有对应的函数名、参数、返回值等类似的概念。那么要使用这个“函数”,自然也就需要一种调用的方法。只不过, Verilog里的调用,并不是像编程语言一样在特定位置执行特定代码(毕竟本身就没有“执行代码”这种操作),而是新复制一份这个模块所表示的硬件,然后连接对应的导线。这一点在参数的定义时其实也就有所体现,定义的输人、输出并非是变量,而是导线,也就是说,传递的内容并不是数值,而是连接。一旦连接被确定,传输就是时时进行的(因为被连接上了)。这和编程语言里的调用非常不一样,所以务必进行区分。具体的例子我们之后将提到。

模块参数

1、模块参数的格式其实很固定,就是方向、类型、宽度、名称。

2、方向可以是输入(Input)或者输出(Oulpul ),注意方向是对于模块而言的,从外界进入模块是Input,而从模块输出到外部则是Oulpul。

3、在Verilog里,基础类型只有两种:一种是wire,另一种是reg。需要说明的是,不要望文义,Verilog里的wire是指导线没错,但是reg并不说明这是一个寄存器。具体的区别会在后面单独解释。如果没有标明类型,通常会默认为wire,但是这个默认值是可以修改的。

4、宽度表示这个信号的位宽。在其他各种编程语言中,数据类型通常都会指定这个变量的位比如说C语言中char是8位,int通常是32位,double通常是64位,等等。而Verilog里类型并不能顺便指定这个变量的位宽,位宽需要单独指定。如果没有指定,通常就默认为1位。这其实是个十分常见的错误,多位的信号忘了指定宽度,默认成了1位。

5、名称和其他语言中的变量名称,概念是一样的。接下来举儿个例子中,具体的用途当然还是需要结合整个模块来理解。

 input wire a,//定义一个1位的wire型输入信号,名为a
 output wire b,/定义一个1位的wire型输出信号,名为b
 output reg c,1/定义一个			1位的reg型输出信号,名为c
 input wire[3:0] d,//定义一个4位(3~0)的wire型输入信号,名为 d
 output wire[9:0] e,1/定义一个10位(9~0)的wire型输出信号,名为e
 output reg[0:8] f,1/定义一个9位(0~8)的reg型输出信号,名为f

内部信号定义

内部信号定义类似于软件编程语言中的变量。只不过这里的变量,不一定具有存储数值的能力,有可能只是作为导线起到连接的作用。内部信号定义的语法格式几乎和模块的参数一样,只是去掉了方向、定义,毕竞不需要和外界通信.自然也就没有输入、输出的说法。以下是几个例子。

wire a;    //定义一个1位的wire型信号,名为a
reg[31:0] b;     //定义一个32位的reg型信号,名为b

表达式和运

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值