来自正点原子的学习笔记 我在学习的过程中会尽量把它和C语言进行比较,毕竟有较大的相似之处
正文开始
1 Verilog注释
同C语言,有两种注释方式 方式一:以//开头,注释到本行结束
code balabala // 这里写注释!
方式二:以/* 开头,以*/ 结尾,中间都是注释语句
code balabala
/*
这里面都是注释!
这也是!
*/
2 Verilog关键字
关键字是软件/程序 会自动识别的一些词 因此命名应该不与这一类重合,应避开 常用的关键字 
3 Verilog程序框架
3.1 基本内容介绍
Verilog的基本设计单元是“模块”(block) 类似于C语言的函数 一个模块由两部分组成,一部分描述接口,一部分描述逻辑功能 类似于C语言函数的参数和函数主体部分
每个Verilog程序包括四个主要部分: 端口定义、IO说明、内部信号声明 (见程序)、功能定义
3.2 模块讲解
下面以一个模块来讲解  module 和endmodule分别表示模块的开始和模块的结束 (注意module一句结尾有分号!endmodule没有!)
模块名为block(建议命名直接一些) 接口是a,b,c,d(端口定义) 每一句完整的语句都和C语言需要一个 ;分号
input表示输入,output表示输出(IO说明)
assign 是给线网类型的变量赋值的一种形式,abcd是wire类型的变量 c是a和b的或运算,d是a和b的与运算(这部分描述了整个模块的功能)
不懂的可以回去看看哦,这是链接. 
3.3 主要部分的表达
这是模块的形象的图形(端口定义和IO说明)  这是模块的可综合电路(功能定理部分) 可以这样理解:可综合的电路最终是能够生成一个物理的电路的 而不可综合的电路多用于仿真语句,此处就不赘述了。 
3.4 完整的Verilog程序讲解
流水灯程序结构
module flow_led(//模块名称
input sys_clk,//系统时钟
input sys_rst_n,//系统复位,低电平有效
output reg [3:0] led //4个LED灯
//定义输出端口是一个寄存器reg类型的端口,如果不指定,都是默认为wire线网类型的
);
//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 fi (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'd0001;
else fi (counter < 24'd1000_0000)
led[3:0] <={led[2:0],;ed[3]};
else
led <= led;
end
endmodule//module和endmodule之间是程序的开头和结尾
功能定义部分有三种方法: 1.assign语句 描述组合逻辑(见3.2) 2.always语句 描述组合/时序逻辑(本程序) (具体两者的差异,之后会讲解) 3.例化实例元件 如:and#2 u1 (q,a,b); and是关键字,与门。 上述三种逻辑功能是并行的,,,,,,,不同于C语言的串行! 注意: 在always块中,逻辑是顺序执行的。(内部) 而多个always块之间是并行的。(外部)
3.5 模块的调用(类似C语言的函数调用)
在模块调用时,信号通过模块端口在模块之间传递。 eg:静态数码管,这个模块是一个Top上层模块 例化的模块是time_count部分,类似于C语言里正在“调用函数” 其中还新起了一个名字,为u_time_count  
这部分是端口的连接方式 左边是这个模块的端口,右边是要连接的端口 从而实现底层模块和上层模块的信号交互 PS:flag是一个输出信号,传递到顶层模块的add_flag变量里
下图是这个模块的定义,类似于C语言里正在“定义函数” 红色圈部分就是刚才提到的自身模块的端口  另一种端口连接方式  与前一种端口连接方式不同(见红色圈:左边是输出端口,右边是传入端口), 这种端口连接方式更加简单 不过,需要更加严格的排列和一一对应 简而言之,默认和省略了传入信号的端口 (不推荐这种写法)
还有一些细节
time _count #(
.MAX_NUM (TIME_SHOW)
这中.+参数名,是参数传递方法,后面是传递进的变量
3.6 生成的原理图
 注意之间的连接,之间的关系
|