assign赋值语句代表的是一种硬件之间的连接关系,会不断的驱动下去。
assign语句后面要加;
或非门是一个输出反相的或门。用 Verilog 编写的 NOR 函数需要两个运算符。
module括号内的信号都被默认声明为wire类型
与&,或|,非~
切片索引的顺序必须和定义时的顺序相同;eg:定义input [31:0] in;索引时要用in[7:0], 不能0:7
mod my_mod( .实例化的my_mod的端口信号(外部接入它的对应的信号), ;
过程块中不能包含assign
赋值语句的左侧必须是网络类型(例如,wire),而过程赋值的左侧(在always块中)必须是变量类型(例如reg)。这些类型(wire与reg)与合成的硬件无关,只是Verilog用作硬件模拟语言时留下的语法。
组合逻辑电路,下面两句产生的电路效果是相同的
assign out1 = a & b | c ^ d;
always @(*) out2 = a & b | c ^ d;
(1)在Verilog module中的所有过程块(如initial块和always块)、连续赋值语句(如assign语句)和实例引用都是并行的。在同一module中这三者出现的先后顺序没有关系。
(2)只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于module的功能定义部分。
(3)连续赋值assign语句独立于过程块,所以不能在always过程块中使用assign语句。
每个case项只能执行一条语句。如果要多个语句,则必须使用begin…end包起来。\
定义input [3:0] in,在case[in]语句中,列举in的可能取值位宽一定要和声明的位宽相同,不管使用几进制表达方式。eg:4'h9 4'd10
连接运算符eg:{a[2:1],b[2:0]};中间要用,隔开
always语句块里面,是不能出现assign的
always语句中的敏感信号用or或者,连接,在敏感驱动信号中,不能既有单边沿的驱动又有双边沿的驱动,如always@(posedge Clk50Mhz or negedge RstN or StartFlag),即只能统一用一种,不能混合。
以0x开始的数据表示16进制
赋值是q <= 8'h34,而不是8h'34,注意分号的位置
位运算符:~a,a & b,a | b,a ^ b:对每个位进行取反,相与,相或,异或。
启用时,D锁存器的作用类似于导线(或非反相缓冲器),禁用时保留电流值。一般写一个if语句不用else会产生锁存器。