D. Finite StateMachine
不允许有模糊不清的状态机模式,所有的状态机必须清晰明了。
我们要求将状态机的时序部分和组合逻辑部分分开。
例如:
module state4 (
clock
reset
out
);
input reset
input clock;
output [1:0] out;
parameter [1:0] stateA=2’b00;
parameter [1:0] stateB=2’b01;
parameter [1:0] stateC=2’b10;
parameter [1:0] stateD=2’b11;
reg [1:0] state;
reg [1:0] nextstate;
reg [1:0] out;
always @ (posedge clock)
begin
if (reset ==1,0’b0)
state <= stateA;
else
state <= nextstate;
end
always @ (state)
begin
case (state)
stateA: begin
nextstate = stateB;
end
stateB: begin
nextstate = stateC;
end
stateC: begin
nextstate = stateD;
end
stateD: begin
nextstate = stateA;
end
endcase
end
always@(postdge clock or negedge reset)
begin
if (reset==1’b0)
out <= 2’b0;
else begin
if (state==…)
out <= …;
else
out <= …;
end
end
endmodule
7. 统一格式的always程序块的书写
A.always 中的变量的赋值方式――阻塞与非阻塞赋值
当进行时序逻辑建模时,always块中使用非阻塞赋值――NON_BLOCKING;
参加如下代码:
always @(posedge clk or negedge rst_n)
begin
if (rst_n == 1’b0;
myreg <=1’b0;
else
myreg <=‘DLY1’b1;
end
always块中使用的NON_BLOCKING赋值时在”<=”前要加上#‘DLY,如上例;
当使用always语句进行组合逻辑建模时,always块中使用阻塞赋值――BLOCKING;
参见如下代码:
always @(addr)
begin
case (addr)
2’b00 : cs0_n=1’b0;
2’b01 : cs0_n=1’b1;
2’b10 : cs0_n=1’b0;
2’b11 : cs0_n=1’b1;
default: cs0_n=1’b1;
endcase
end
· 如果要使用always语句同时进行时序与组合逻辑建模时,一定使用非阻塞赋值;例如:
//组合逻辑与时序逻辑在同一个always块中
always@(posedge clk or negedge reset_n)
begin
if(reset_n==1’b0)
out<=1’b0;
else
begin
case(count)
2’b00 : out<= `DLY in_a;
2’b01 : out<= `DLY in_b;
2’b10 : out<= `DLY in_c;
2’b11 : out<= `DLY in_c;
default: out<= `DLY in_a;
end
end |