Verilog 入门 笔记2

Always 语句

1
2
always @ (posedge CLK)
Q=D;

它不总在激活状态。

不满足条件就在挂起

Q一定要使reg类型。

敏感条件:

  1. 边沿敏感

    (posedge 信号名) 新号上升沿到来

    (negedge name)

  2. 电平敏感

    (a,b,c) 任意一个信号发生变化

例:

1
2
always @ (posedge CLK)
Q=D;

在CLK上升时才把D给Q

image-20260726202421323
1
2
always @ (D)
Q=D;

这个相当于始终Q和D的值一样

image-20260726202441860

对比:

  • assign:总是激活,一旦操作数变化,立刻计算赋值(赋值目标总是wire类型)
  • always:满足条件才会(必须是reg型)

还可以和if case,

1
2
3
4
5
6
7
8
9
10
11
12
module DFF@(CLK,D,Q,RST,EN)
input CLK,D,RST,EN;
output Q;
reg Q;
always @(posedge CLK or negedge RST)
begin
if (!RST) Q<=;
else if (EN) Q<=D
end
endmodule


image-20260726202829052

注意,verilog所有语句都是并行执行

<= 这个是赋值操作,不是小于等于


always中如果有多余赋值语句,必须用begin、end包起来

例:

image-20260726202924176

不妨让A,B同时从0变成1

非阻塞赋值:

image-20260726203129087

组合电路:阻塞赋值

时序电路:非阻塞赋值

image-20260726203253817

例子:4位二进制加法计数器

1
2
3
4
5
6
7
8
9
10
11
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

内部信号声明格式:

1
数据类型 位宽 信号名称 元素个数

底层模块

image-20260726203704270

先涉及底层D触发器,再涉及顶层电路,在顶层电路里可以调用底层模块

顶层模块描述:要增加内部变量

顶层模块:

1
2
3
4
5
6
7
8
9
10
module examp (clk, d, a, 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
image-20260726204015215

门原语

端口连接采用顺序法,输出在前,输入在后

image-20260726204135327