天天看点

Verilog语法规则

Verilog语法规则

    • 模块声明类
    • 参数定义
    • 信号类型
    • 多语句定义
    • 比较判断和分支判断
    • 任务定义
    • 连续赋值
    • always模块
    • 赋值符号:=和<=(小等号)

模块声明类

module at7(<端口信号列表>...)
<逻辑代码>
endmodule
           

FPGA中常常定义各种模块,不同模块之间有接口,类似C语言中的不同函数,有不同的输入输出变量。

参数定义

parameter用于申明一些常量,便于模块的移植或升级时的修改。

信号类型

wire:不同寄存器之间的连线

reg:一个寄存器,可以进行赋值等操作

多语句定义

begin…end

可用于包含关系,相当于C语言中的{},若有强耦合关系的一组,则不需要用begin…end

begin	
	//可选申明部分
	//具体逻辑
end
           

比较判断和分支判断

比较判断:if…else

if()
begin
...
end
else
begin
...
end
           
if()
begin
...
end
else if()
begin
...
end
else
begin
...
end
           

分支判断:case…default…endcase

case(变量名)
取值1:具体逻辑1
取值2:具体逻辑2
取值3:具体逻辑3
default:具体逻辑4
endcase
           

任务定义

task…endtask 像是C语言中的子函数,有输入输出参数。

task是可综合的行为级语法,是顺序执行的,不是并行的。

task <task名>
	input 输入变量申明
	begin
	...
	end
endtask
           

连续赋值

  • assign

    assign可直接给wire型变量赋值:

    assign wire变量名 = 变量或常量

  • ?表达式
wire timer_cnt;
assign timer_vnt = (cnt == MAX_CNT_VALUE)?1:0;
           

always模块

//单个沿触发的时序逻辑
always @ (沿变化)
begin
...
end
           
//多个沿触发的时序逻辑
always @ (沿变化1 or 沿变化2)
begin
...
end
           

如:

always @ (posedge clk or negedge rst_n)
//上升沿posedge,下降沿negedge
           

赋值符号:=和<=(小等号)

=:阻塞,在组合逻辑中用,是顺序执行的

<=:非阻塞,在时序逻辑中用,两行语句在同一个时钟周期来到时是并行处理的