Verilog HDL
- Verilog模块的基本结构
- 每个模块以关键词module开始,以endmodule结束
- 端口的定义
- 说明输入(input)和输出(output)
- 除了endmodule语句外,每个语句后必须有分号
- 可以用/* --- */和//…..对程序的任何部分做注释
- 描述方式
- 结构描述方式(门级描述方式)
- 数据流描述方式(逻辑功能描述方式)
- 行为描述方式
- 模块可以以模块名来调用,但不允许嵌套
- example
module example(D0, D1, S, Y );
input D0,D1,S; //输入信号
output Y; //输出信号
wire Snot, A, B ; //内部节点信号数据类型
not U1(Snot, S);
and U2(A, D0, Snot);
and U3(B, D1, S);
or U4(Y, A, B);
endmodule
- 逻辑功能的仿真与测试
- ModelSim
- Verilog的基本语法规则
- 数据类型
- 线网类型(net type)
- 输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接。
- 变量类型(variable type)(寄存器类型)
- 对应的是具有状态保持作用的电路元件(抽象的数据存储单元),如触发器寄存器
- 寄存器型变量只能在initial或always内部被赋值
-
reg
常用的变量类型
integer
32位带符号的整数型变量
real
64位带符号的实数型变量
time
64位无符号的时间变量
- 线网类型(net type)
- 运算符及其优先级
- 优先级:非、与、或
- 算术运算符
- 位运算符
- 逻辑运算符
- 位拼接运算符
- 关系运算符
- 缩位运算符
- 移位运算符
- 条件运算符
- 用VerilogHDL描述组合逻辑电路
- 组合逻辑电路的行为级描述一般使用always结构和过程赋值语句、条件语句(if-else)、多路分支语句(case-endcase)和for循环语句
- initial是初始化语句,仅执行一次,主要面向仿真。always是无限循环语句
always@(事件控制表达式(或敏感事件表))
begin
块内局部变量的定义;
过程赋值语句,被赋值变量必须是reg数据类型;
end
- 敏感事件分为电平敏感事件和边沿触发事件
- 电平敏感事件(如锁存器)
always@(sel or a or b) //sel、a、b中任意一个电平发生变化,后面的过程赋值语句将执行一次。
always@(sel, a, b) //sel、a、b中任意一个电平发生变化,后面的过程赋值语句将执行一次。
always@(*) //对其后语句块中所有输入变量的变化敏感。
-
- 边沿敏感事件(如触发器)
always@(posedge CP or negedge CR)
- 过程赋值语句
- 阻塞型:多条语句顺序执行
- 非阻塞型:语句块内部的语句并行执行
- if语句
if (condition_expr1) true_statement1;
else if (condition_expr2) true_statement2;
else default_statement;
- case语句
- 关键词casex和casez表示含有无关项x和高阻z的情况
case (case_expr)
item_expr1: statement1;
item_expr2: statement2;
default: default_statement; //default语句可以省略
endcase
- for语句
for (initial_assignment; condition; step_assignment) statement;
- 用Verilog HDL描述锁存器和触发器
彩灯设计
- 设计要求
- 控制8只LED灯LED1~LED8,按下述方式显示:
- 全亮→奇数灯依次灭→偶数灯依次灭→由LED1~LED8依次亮,循环进行,且显示时间间隔0.5S和1S可调。
- 输入:clk,key //内部时钟,控制时间间隔
- 输出:【7:0】LEDS,//控制实验板上的8个LED
- 控制8只LED灯LED1~LED8,按下述方式显示:
- 设计思路
- 使用计数器实现计时功能,计数器的值随着时钟信号的上升沿不断累加,当计数器的值达到一定的阈值时,LED的状态会发生变化。
- LED的状态有四种:全亮、奇数灯灭、偶数灯灭和由LED1~LED8依次亮。使用状态机的方式实现状态的切换,状态机的状态用一个3位的寄存器来表示。
- 按键用于控制状态切换的时间间隔,当按键为0时,状态切换间隔为0.5秒,当按键为1时,状态切换间隔为1秒。按键的状态检测使用一个简单的时序电路实现。
NI Multisim 14
逻辑函数的化简与变换 Logic convertre-XLC1