一.1模块结构
模块(block)常见的写法
module block(a,b,c,d); //module 模块名(端口1,端口2,端口3,....);
input a,b; //a,b为输入端口
output c,d; //c,d为输入端口
assign c=a|b; //赋值语句 assign
assign d=a&b;
endmodule
一个完整的Verilog结构包含四个方面:端口定义,I/O说明,内部信号说明,功能定义。
下面分别就以上四个进行说明。
(1)端口定义
引用模块式端口的连接方式:
方式一
module led(clk,rst,out);//原模块
引用上述模块时的语句
module led(clk0,rst0,out0);//严格按照原模块顺序连接
方式二在引用时使用“.”这个符号,标明原模块是定义时规定端口名。以上面led模块为例:
module led(.clk(clk0),.out(out0),.rst(rst0));
//顺序可以变,但是端口连线一目了然,可读性和可移植性提高了
(2)I/O说明
1.I/O说明的格式
输入口: input[信号位宽-1:0] 端口名 //ex. input [7:0]a表示位宽为8的输入端口a
输入口:output[信号位宽-1:0] 端口名 //ex.output [7:0]a表示位宽为8的输出端口a
输入/输出口:inout[信号位宽-1:0] 端口名 //ex.inout [7:0]a表示位宽为8的输入输出端口a
(3)内部信号说明
wire变量的声明 //!!!wire表示物理连线的变量
wire[信号位宽-1:0]W变量1,W变量2,W变量3;
reg变量的声明 //!!!reg表示寄存器
reg[信号位宽-1:0]R变量1,R变量2,R变量3;
(3)功能定义
1.assign 连续赋值语句
用法: assign a=b&c;
2实例元件
and #2 u1(q,a,b)//表示延时2个时间后 a为b&c的结果
3用“always”块
always@(posedge clk or posedge clr)//!!!always块内是顺序执行的的
begin
if(clr)q<=0;
else if(en)q<=d;
end