可综合的语法是指硬件能够实现的语法,这些语法可以通过综合工具编译最终生成用于烧录到FPGA的配置数据流。
所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,not,if,inout,input,module,negedge,posedge,output,parameter…
模块的端口声明了模块的输入输出口。例:
module adder(count,sum,a,b,cin);
input [2:0] a,b;
input cin;
output count;
output [2:0] sum;
assign {count,sum} = a + b + cin;
endmodule
每一个module都会有输入和输出信号用于和外部器件或者其它模块通信。这些输入输出端口可以分为三类:input,output,inout(双向)。
parameter来定义常量。在每一个赋值语句的右边必须是一个常数表达式。也就是说,该表达式只能包含数字或先前已定义过的参数:
parameter msb=7; //定义参数msb为常量7
parameter e=25, f=29; //定义二个常数参数
parameter r=5.7; //声明r为一个实型参数
parameter byte_size=8, byte_msb=byte_size-1; //用常数表达式赋值
parameter average_delay = (r+f)/2; //用常数表达式赋值
参数型常数经常用于定义延迟时间和变量宽度。在模块或实例引用时可通过参数传递改变在被引用模块或实例中已定义的参数,例:
在引用Decode实例时,D1,D2的Width将采用不同的值4和5,且D1的Polarity将为0。可用例子中所用的方法来改变参数,即用 #(4,0)向D1中传递 Width=4,Polarity=0; 用#(5)向D2中传递Width=5,Polarity仍为1。
module Decode(A,F);
parameter Width=1, Polarity=1;
...
endmodule
module Top;
wire [3:0]A4;
wire [4:0]A5;
wire [15:0]F16;
wire [31:0]F32;
Decode #(4,0) D1(A4,F16);
Decode #(5) D2(A5,F32);
endmodule
reg(寄存器):当时钟上升沿到来时,可以锁存最新的输入数据。reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。reg型只表示被定义的信号将用在“always”块内。而wire可以理解为“导线”。
在一个module里面,input和inout只能定义为wire类型,output默认为wire类型,也可定义为reg类型。
用的比较少。其用法和C语言类似,例如对memory进行初始化:
begin: init_mem
reg[7:0] tempi;
for(tempi=0;tempi<memsize;tempi=tempi+1)
memory[tempi]=0;
end
采用“assign”语句是描述组合逻辑最常用的方法之一。用来对wire型变量进行赋值。该语句不能用于always进程块中。
assign a = b & c;
“always”块既可用于描述组合逻辑也可描述时序逻辑。always进程块中,只能对reg型变量赋值。
组合逻辑:
always@(*)
begin
//具体逻辑
end
always后如果有沿信号(上升沿,下降沿),则多为时序逻辑。
always@(沿信号1 or 沿信号2)
begin
//具体逻辑
end
verilog中绝大多数运算操作符都是可综合的:+(加)、-(减)、!(非)、~(取反)、&(与)、|(或)、*(乘)、/(除)、&&(逻辑与)、||(逻辑或)、==(逻辑相等)、!=(逻辑不等)等等。
非阻塞赋值只能用于reg型变量。
always进程块内,多条非阻塞赋值同时执行(并行),阻塞赋值按照顺序执行。
time,defparam,$finish,fork,join,initial,delays,UDP,wait
casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while
"FPGA Zone" 专注 FPGA 知识学习与工程应用,欢迎 FPGA 爱好者关注公众号,领取 200G+ FPGA 相关学习资料!