原创声明:
本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处。
简介
本文主要介绍verilog基础模块,夯实基础,对深入学习FPGA会有很大帮助。
数据类型
常量
整数:整数可以用二进制b或B,八进制o或O,十进制d或D,十六进制h或H表示,例如, 8’b00001111表示8位位宽的二进制整数,4’ha表示4位位宽的十六进制整数。
X和Z:X代表不定值,z代表高阻值,例如,5’b00x11,第三位不定值,3’b00z表示最低位为高阻值。
下划线:在位数过长时可以用来分割位数,提高程序可读性,如8’b0000_1111
参数parameter: parameter可以用标识符定义常量,运用时只使用标识符即可,提高可读性及维护性,如定义parameter width = 8 ; 定义寄存器reg [width-1:0] a; 即定义了8位宽度的寄存器。
参数的传递:在一个模块中如果有定义参数,在其他模块调用此模块时可以传递参数,并可以修改参数,如下所示,在module后用#()表示。
例如定义模块如下调用模块
module rom
#(
parameter depth =15,
parameter width =8
)
(
input[depth-1:0] addr ,
input[width-1:0] data ,
output result
);
endmodule
module top();
wire[31:0] addr ;
wire[15:0] data ;
wire result ;
rom
#(
.depth(32),
.width(16)
)
r1
(
.addr(addr),
.data(data),
.result(result)
);
endmodule
Parameter可以用于模块间的参数传递,而localparam仅用于本模块内使用,不能用于参数传递。Localparam多用于状态机状态的定义。
变量
变量是指程序运行时可以改变其值的量,下面主要介绍几个常用了变量类型
1.Wire 型
Wire 类型变量,也叫网络类型变量,用于结构实体之间的物理连接,如门与门之间,不能储存值,用连续赋值语句assign赋值,定义为wire [n-1:0] a ; 其中n代表位宽,如定义wire a ; assign a = b ; 是将b的结点连接到连线a上。如下图所示,两个实体之间的连线即是wire类型变量。
2.Reg 型
Reg 类型变量,也称为寄存器变量,可用来储存值,必须在always语句里使用。其定义为
reg [n-1:0] a ; 表示n位位宽的寄存器,如reg [7:0] a; 表示定义8位位宽的寄存器a。如下所示定义了寄存器q,生成的电路为时序逻辑,右图为其结构,为D触发器。
module top(d, clk, q);
input d ;
input clk ;
outputreg q ;
always@(posedge clk)
begin
q <= d ;
end
endmodule
![61b9fa1f35acf717e8475861c323755f.png](https://i-blog.csdnimg.cn/blog_migrate/8725db82bcec261db9de656bf85afeb1.png)
也可以生成组合逻辑,如数据选择器,敏感信号没有时钟,定义了reg Mux,最终生成电路为组合逻辑。
module top(a, b, c, d, sel, Mux);
input a ;
input b ;
input c ;
input d ;
input[1:0] sel ;
outputreg Mux ;
always@(sel or a or b or c or d)
begin
case(sel)
2'b00: Mux = a ;
2'b01: Mux = b ;
2'b10: Mux = c ;
2'b11: Mux = d ;
endcase
end
endmodule
![4c90ac0be0e05361a76a2e0aa22bc36f.png](https://i-blog.csdnimg.cn/blog_migrate/a8829b9d93f3bfff4d82f384b4b26e98.png)
3.Memory型
可以用memory类型来定义RAM,ROM等存储器,其结构为reg [n-1:0] 存储器名[m-1:0],意义为m个n位宽度的寄存器。例如,reg [7:0] ram [255:0]表示定义了256个8位寄存器,256也即是存储器的深度,8为数据宽度。
运算符
运算符可分为以下几类:
算术运算符(+,-,*,/,%)
赋值运算符(=,<=)
关系运算符(>,=,<=,==,!=)
逻辑运算符(&&,||,!)
条件运算符(?:)
位运算符(~,|,^,&,^~)
移位运算符(<>)
拼接运算符({ })
算术运算符
“+”(加法运算符),”-“(减法运算符),”*”(乘法运算符),”/”(除法运算符,如7/3 =2),“%”(取模运算符,也即求余数,如7%3=1,余数为1)
赋值运算符
“=”阻塞赋值,”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行;非阻塞赋值可理解为并行执行,不考虑顺序,在always块语句执行完成后,才进行赋值。如下面的阻塞赋值:
代码如下:激励文件如下
module top(din,a,b,c,clk);
input din;