组合逻辑和时序逻辑
组合逻辑:不受系统时钟的控制,电路由与或非等等纯逻辑门电路组成,不包含触发器,寄存器等等;
一般在verilog中组合逻辑产生的信号由assign赋值,当然always@(*)也是组合逻辑,它表示所有信号的变化都能触发电路,使输出发生变化
时序逻辑:电路要受到系统时钟的控制,由时钟沿触发电路产生变化,一般always@(posedge clk)所表示的电路我们认为是时序逻辑,括号中的信号是电路的敏感信号列表,这里的posedge clk是指的时钟上升沿,也就是说检测到时钟上升沿变化,就能触发电路,使输出产生相应的变化。
模块定义
module name(port1,port2,port3......);
endmodule
每一个module都必须配套一个endmodule;
括号里面需要声明该模块的所有端口
模块端口
input:输入 input [3:0] key 表示有一个4位的输入端口,端口名为key;
output:输出 output[7:0]led 表示有一个8位的输出端口,端口名为led;
inout:输入/输出端口 inout[5:0]K 表示有一个6位的输入输出端口,端口名为K;
端口的位宽是从0开始数,4位定义[3:0],8位定义[7:0]。如果在程序中只需要使用单独的某一位或部分位的时候,例如led[7:5]是表示led端口的6-8位;led[7]是表示led端口的第8位。
另外端口的I/O特性也可以在模块定义声明端口时一起定义,例如:
module led(
input clk,
input rst_n,
output [7:0]led
);
endmodule
信号类型
信号类型用的最多的是reg(寄存器类型)和wire(线型);
reg型的信号具有保持存储信号的功能,一般在时序逻辑中产生的信号,我们将它定义为reg型
wire型的信号只具备传递信号的功能,不具备保持信号的功能,一般在组合逻辑中产生的信号,我们将它定义为wire型。