Verilog HDL
概述
Verilog vs VHDL
Verilog :快速入门
VHDL:入门时间长
数字逻辑
0 1 x z
数据类型
寄存器 线网 参数
- reg
- 使用:always,initial
- 综合: 时序-寄存器 组合-硬件连线 混合-锁存器
- wire
- 默认为 z
- parameter
运算符
±*/%
> < =
! && ||
== !=
-
a ? b: c
- & | ^ ~^ ^~
<< >>
{ 拼接} {2’d2{b}}
基础语法
可综合语句:可以生成电路
不可综合语句:用来仿真
可综合关键字:
module end module
input output inout
wire reg parameter
always assign
if else begin end case end case default
posedge negedge or 上升 下降
基本框架
例实现与门
module yumen(a,b,c)
input a;
input b;
output c;
assign c=a&b;
endmodule
描述方式
分类:系统级、算法级、RTL级、门级、开关级
- 结构化描述
module example
(A,B,C,L);
input A;
input B;
input C;
output L;
wire AB,BC,AC;
and U1(AB,A,B);
and U2(BC,B,C);
and U3(AC,A,C);
or U4(L,AB,BC,AC);
endmodule
- 数据流描述
assign L=((!A)&B&C)|((!B)&A&C)|((!C)&B&A);
endmodule
- 行为描述
always@(A,C,B)
begin
case({A,B,C})
3'b000: L=1'b0;
3'b001: L=1'b0;
3'b010: L=1'b0;
3'b011: L=1'b1;
3'b100: L=1'b0;
3'b101: L=1'b1;
3'b110: L=1'b1;
3'b111: L=1'b1;
default:L=1'bx;
endcase
end
- 模块化设计
module Example_Module
(
input a,
input b,
output c,
output s
);
Example_yumen yumen_module
(
.yumen_a(a),
.yumen_b(b),
.yumen_c(c)
);
Example_yihuo yihuo_module
(
.yihuo_a(a),
.yihuo_b(b),
.yihuo_c(s)
);
endmodule
问题
- 数据类型选择
- reg
- wire
- latch的产生(保持不变)
- 产生情况:
if else
缺省 - 时序和组合区别
- 组合逻辑反馈环,导致不稳定,时序实现反馈
- 表达式左右具有相同元素
- 阻塞赋值=、非阻塞<=
- 阻塞:顺序执行 非阻塞:并行执行
- 阻塞:同时改变 非阻塞:有时间延迟
状态机
- 可以实现顺序时间,第一步、第二部、、、
- 分类
- Mealy
- Moore
- 组成
- 时序逻辑:记忆当前状态
- 组合逻辑:次态逻辑(确定下一个状态),输出逻辑(确定状态机输出)
- 设计步骤
- 确定状态机类型
- 列出状态机所有状态,编码
- 列举状态图、状态表
- 描述状态
- 状态编码
- 二进制码:编码效率高,译码
- 格雷码:高可靠性
- one-hot:位数资源多,每一位表示一种状态
- 描述方式
- 一段:可读性差
- (二段):有毛刺
- (三段)
案例:自动售货机
module Example_State
(
X,Z,CLK_50M,RST_N
);
input X;
input RST_N;
input CLK_50M;
output Z;
//X表示是否投入一元
//Z是否售出饮料
reg Z;
reg Z_N;
parameter S0=2'b00;
parameter S1=2'b01;
parameter S2=2'b10;
reg[1:0] FSM_CS; //current
reg[1:0] FSM_NS;//Next state
//时序逻辑
always @(posedge CLK_50M or negedge RST_N)
begin
if(!RST_N)//low
FSM_CS<=S0;
else
FSM_CS<=FSM_NS;
end
//组合逻辑(次态逻辑)
always @(*)
begin
case(FSM_CS)
S0:
begin
if(X==1'b1)
FSM_NS=S1;
else
FSM_NS=S0;
end
S1:
begin
if(X==1'b1)
FSM_NS=S2;
else
FSM_NS=S1;
end
S2:
begin
if(X==1'b1)
FSM_NS=S0;
else
FSM_NS=S2;
end
endcase
end
//组合逻辑(输出逻辑)
always @(posedge CLK_50M or negedge RST_N)
begin
if(!RST_N)//low
Z<=1'b0;
else
Z<=Z_N;
end
always@ (*)
begin
if((FSM_CS==S2)&&(X==1'b1))
Z_N=1'b1;
else
Z_N=1'b0;
end
endmodule