模块声明类
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
赋值符号:=和<=(小等号)
=:阻塞,在组合逻辑中用,是顺序执行的
<=:非阻塞,在时序逻辑中用,两行语句在同一个时钟周期来到时是并行处理的