Verilog基础知识2
Verilog注释
同C语言相同 // /* */
Verilog关键字
常用关键字
全部关键字
Verilog程序框架
模块的结构
Verilog的基本设计单元是模块block(类似C语言的的函数)
模块由两个部分组成,一部分描述接口,另一部分描述逻辑功能
模块分为可综合模块和不可综合模块
- 可综合模块:能对应的实际电路
- 不可综合模块:做测试,仿真文件,由仿真软件识别
每个Verilog程序包括四个主要的部分:
端口定义、IO说明、内部信号说明、功能定义
功能定义部分有三种方法:
1、assign语句
描述组合逻辑
2、always语句
描述组合/时序逻辑
3、例化实例元件
如:and #2 u1(q,a,b); //and表示与门
上述三种逻辑功能是并行的
例:
module block(a,b,c,d); //module表示模块的开始
//block表示模块名(自定义) (a,b,c,d)为端口定义,表示有abcd四个端口
input a,b; //表示a,b为输入信号
output c,d; //表示c,d为输出信号
//4,5行为IO说明
assign c = a | b ; //assign为给线网类型数据赋值的一种方法
assign d = a & b ;
//功能定义
endmodule //endmodule表示模块的结束
程序对应电路
在always块中,逻辑是顺序执行的,而多个always块之间是并行的,例如:
module example(
input sys_clk , //系统时钟
input sys_rst_n, //系统复位,低电平有效
output reg [3:0] led //4个LED灯,reg表示输出端口为寄存器类型
); //将端口定义与IO说明放在一起
//reg define
reg [23:0] counter; //内部信号说明
//*****************************************************
//** main code
//*****************************************************
//计数器对系统时钟计数,计时0.2秒
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
counter <= 24'd0;
else if (counter < 24'd1000_0000)
counter <= counter + 1'b1;
else
counter <= 24'd0;
end
//通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
led <= 4'b0001;
else if(counter == 24'd1000_0000)
led[3:0] <= {led[2:0],led[3]};
else
led <= led;
end
endmodule
两个always是并行执行的,但always内部是串行执行的
模块的调用
在模块调用时,信号通过模块端口在模块之间传递
可以用例化
的方式连接端口与端口,例如:
图中箭头方向为信号传递方向
比如
.clk (sys_clk)
是把sys_clk赋给clk,则在右侧模块中clk就是(sys_clk)。
.MAX_NUM (TIME_SHOW)
是将TIME_SHOW的值赋给MAX_NUM
同时模块输出必须为线网(wire)类型数据
例化模块时一定要给模块起一个名称,例如: