组合电路可以用assign连续赋值语句和过程性语句建模。而时序电路只可以用过程性语句建模。
Verilog 语法需要一个包含全部是沿敏感的事件,或者全部是电平敏感的事件,但不能是两者混合的敏感列表
//书本315页图8-3 。。。。。。。 摩尔型的。。。。。。。。
module (clk,reset,z,w);
input clk,reset,w;
output z;
reg [1:0] y,Y;
parameter [1:0] A=2b'00,B=2b'01,C=2b'10;
always @(y,w)
begin
case(y) :
A: if(w)
Y=B;
else
Y=A;
B: if(w)
Y=C;
else
Y=B;
C: if(w)
Y=C;
else
Y=A;
endcase
end
always @(negedge reset,posedge clk)
if(!reset)
y=A;
else
y=Y;
assign z=(y=C);
endmodule
令一种描述方法:
module (clk,resetn,w,z);//resetn为习惯用法,n表示reset为低电平有效。。
input clk,resetn,w;
output z;
reg [1:0] y,Y;
parameter [1:0] A=2'b00,B=2'b01,C=2'b10;
always @(negedge resetn,posclk)
if(!reset) y<=A;
else
case(y)
A: if(w) y<=B;
else y<=A;
B: if(w) y<=C;
else y<=A;
C: if(w) y<=C;
else y<=A;
default: y<=2'bxx;
endcase
assign z=(y==C);
endmodule
只有线网才能成为连续赋值语句的赋值对象。在always块内部被赋值的变量必须是reg型
或者integer型的。不可能对一个既在always块中又转接连续赋值语句的信号赋值、、
如果always块有多条语句,必须用begin-end定界符把它们括起来。编译器并不考虑程序
行的缩进排列!
某个给定的变量绝对不能在一个以上的always块内赋值。如果在多个
always块中对某个变量进行赋值,就意味着在电路中存在对该变量进行同时赋值的现象,这
样做是没有意义的。
用always结构块描述组合逻辑电路时,最好只使用阻塞赋值 。而对于时序
电路,则应该使用非阻塞赋值 。在一个always块中不能同时有阻塞和非阻塞两
种赋值语句。
在一个always块中,不可能既为组合电路又为时序电路建立模型。时序输出必须要有沿
触发事件,例如@(posedge Clock),这是指所有在always块中被赋值的变量都是用触发器的
输出实现的。