赞
踩
过程块
基本格式
always@(敏感信号条件表)
各类顺序语句;
例子
- always @(posedge CLK)
- Q=D;
过程赋值语句,本身没有任何含义,与下面的语句构成语句块
不总是处于激活状态,满足激活条件时才会执行,平时被挂起
挂起时即使操作数有变化也不执行赋值,赋值目标值保持不变
赋值的目标必须是reg型的
激活条件:
敏感信号条件表决定
敏感条件满足时,过程块被激活
敏感条件:边沿敏感 电平敏感
边沿敏感:
(posedge 信号名) 信号上升沿到来
(negedge 信号名) 信号下降沿到来
电平敏感:
(信号名列表)
信号列表中任意一个信号有变化即可
(a,b,c)或者(a or b or c)
always可以描述边沿变化,在设计时序电路中得到了广泛的应用
always 语句可以附加 if case for等循环语句
- always @(posedge CLK)
- begin
- if() 语句
- else if() 语句
- end
- endmodule
具有多条赋值语句,就需要用 begin end 将其包括起来
阻塞赋值:
右边的表达式和对左边寄存器变量的赋值是一个统一的原子操作中的两个动作
这两个动作之间不能再插入其他任何动作
(算一条,赋值一条)
赋值目标1 = 表达式1;
赋值目标2 = 表达式2;
非阻塞赋值:
首先按顺序计算右边表达式的值,但并不马上赋值,而是要等到过程结束再按照顺序赋值
(挨个算,算完之后挨个赋值)
赋值目标1 <= 表达式1;
赋值目标2 <= 表达式2;
设计组合电路常常用阻塞赋值
设计时序电路常常用非阻塞赋值
不建议在一个always块内都使用
例子
- #加法计数器
- #4位二进制
-
- module CNT4(CLK,Q);
- input CLK;
- output [3:0] Q;
-
- reg [3:0] Q1;
-
- always @ (posedge CLK)
- begin
- Q1 <= Q1 + 1;
- end
-
- assign Q = Q1;
-
- endmodule
一旦有时钟上升沿CLK,则Q1自加1,并且赋值给Q
以D触发器为例子
#边沿D触发器
module DFF(CLK,D,Q);
output Q;
input CLK,D;
reg Q;
always @(posedge CLK)
Q<=D;
endmodule
作为底层模块描述
顶层模块描述
调用底层模块,需要加内部变量,例如我们这次要调用的内部变量设置为d1和q1
给两次调用的模块进行命名
调用时,例化名不能省略
底层模块调用格式
底层模块名 例化名 (端口映射);
- module examp (clk,a,d,q)
- output q;
- input clk,d,a;
-
- wire d1;
- wire q1;
-
- DFF dff1(.CLK(clk),.D(d1),.Q(q1));
- DFF dff2(q1,d,q);
-
- or (d1,a,q);
-
- endmodule
以上展示了两种端口映射的方法
端口名关联法(命名法)
(.底层端口名1(外接信号名1),.底层端口名2(外接信号名2),.底层端口名3(外接信号名3)...)
DFF dff1(.CLK(clk),.D(d1),.Q(q1));
因为有名字对应,不必按底层模块的端口信号列表顺序
位置关联法(顺序法)
(外接信号名1,外接信号名2,外接信号名3...)
DFF dff2(q1,d,q);
必须严格按照底层模块端口信号列表顺序进行书写
Verilog 语言提供了很多已经设计好的门,称为门原语
primitive 共12个
调用格式: 门原语名 实例名 (端口连接)
实例名可以省略,端口连接只能采用顺序法,输出在前,输入在后
端口连接 的第一个是输出,其余的是输入,输入个数不变
and 与
or 或
xor 异或
nand 与非
nor 或非
xnor 同或
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。