赞
踩
2) always 内部用for循环,需要定义interger类型变量,同时在always内部不能使用assign连续赋值。 generate...endgenerate可有可无
3) for语句在always 外部,或者使用for循环例化模块,需要定义genvar变量,同时for()begin:名字(必须要有名字),genvar i;可以放在generate........endgenerate里面
拼接运算符 {num{vector} }
模块的层次结构是通过在另一个模块中实例化一个模块来创建的
模块实例化的方法有两种:1)、按位置连接,2)、按名称连接
1)、按位置将电线连接到端口,实例化模块时,端口根据模块的声明从左到右连接,
mod_a instance1 ( wa, wb, wc );
此实例化类型的模块mod_a
,并赋予它一个实例名“INSTANCE1”的,然后连接信号wa
(新模块外部)的第一端口(新模块的in1),wb
到第二端口(in2
),以及wc
所述第三端口(out
)。这种语法的一个缺点是,如果模块的端口列表发生更改,则还需要找到并更改模块的所有实例以匹配新模块。mod_a 中的in1,in2,out分别连接top_mudule中的a,b,out
2)、按名字将电线连接到端口,即使端口列表发生变化,电线也能保持正确连接。
mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );
上述行实例化类型的模块mod_a
名为“INSTANCE2”,然后连接信号wa
(模块外部)的端口命名 in1
,wb
到端口命名 in2
,和wc
到端口命名 out。
q1、q2就相当于两根线,用q1将第一个D触发器的q端和第二个触发器的d端相连。q2同理。
多路复用器能将 N 个输入通道的数据复用到一个输出通道上。使用多路复用器可使多路数据信息共享一路信道,能充分地利用通信信道的容量,大大降低系统的成本。通过改变A与B的值,就能输出端F到底输出D1,D2,D3,D4中的哪个值
加-减器可以由加法器通过选择性地对其中一个输入取反来构建,这相当于对输入取反然后加1。最终的结果是一个可以做两种操作的电路:(a + b + 0)和(a + ~b + 1)。
程序块内部代码的语法与外部代码不同。过程块具有更丰富的语句集(例如,if-then、case),不能包含连续赋值。过程连续赋值确实存在,但与连续赋值有些不同,并且不可综合。
assign 和combinational always 块描述了相同的电路。两者都创建了相同的组合逻辑块。每当任何输入(右侧)更改值时,两者都会重新计算输出。 assign out1 = a & b | c ^ d; always @(*) out2 = a & b | c ^ d;
关于 wire 与 reg 的说明:assign 语句的左侧必须是net类型(例如,wire),而过程赋值(在 always 块中)的左侧必须是变量类型(例如,reg)。这些类型(wire 与 reg)与合成的硬件无关,只是 Verilog 用作硬件模拟语言时遗留下来的语法。
对于硬件综合,有两种相关的always块:
时序always块创建组合逻辑块,就像组合always块一样,但时序always块是在组合逻辑块的输出处创建一组触发器(或“寄存器”)。逻辑块的输出不是立即可见,而是仅在下一个 (posedge clk) 之后立即可见。
阻塞与非阻塞分配
Verilog 中有三种类型的赋值:
在一个组合always块,使用阻塞分配。在时序always块中,使用非阻塞分配。
always@(posedge clk) 会先将输出结果放在寄存器中,在下一个时钟上升沿到来时在输出
always@(*)在赋值时和assign连续赋值语句一样,直接输出结果
先给这几个输出赋一个初值,这个样子就算没有default其他情况也不会出现错误
不能像c语言那样直接写成下图这样,因为 c中是串行运行,而verilog中是并行运行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。