Я новичок в verilog и пытаюсь написать простую тестовую среду для FSM.Но я не могу изменить входы в начальном блоке.
Сброс должен быть сначала 0, затем 1 после 30 нс.Но сброс всегда равен 1. Для левого и правого значения одинаковы, значения зависят только от последнего оператора, который применяет к ним значения, а не изменяется со временем.Я не знаю, в чем проблема, кто-нибудь может мне помочь?
module FSM_TB;
reg clk,left, right, reset;
wire LA,LB,LC,RA,RB,RC;
FSM dut(clk, reset, left, right, LA, LB, LC, RA, RB, RC);
//apply inputs
initial begin
reset = 0; left = 1; right = 0; #30;
reset = 1;#30;
end
//generate clock
always begin
clk = 0; #5;
clk = 1; #5;
end
endmodule
module FSM(
input clk,
input reset,
input left,
input right,
output LA,
output LB,
output LC,
output RA,
output RB,
output RC
);
reg[2:0] state = 3'b000;
reg [2:0] nextstate;
reg r ;
parameter S0 = 3'b000;
parameter S1 = 3'b100;
parameter S2 = 3'b110;
parameter S3 = 3'b111;
//state register
always @ (posedge clk, posedge reset)
if(reset)
begin
state <= S0;
r = 0;
end else begin // if !reset
if(left) r = 0;
if(right) r = 1;
state <= nextstate;
end
//next state logic
always @ (*)
case(state)
S0: if(left^right) //if left xor right is 1, state is going to change
nextstate = S1;
else nextstate = S0;
S1: nextstate = S2;
S2: nextstate = S3;
S3: nextstate = S0;
default: nextstate = S0;
endcase
//output logic
assign LC = (r== 0) & (state==S3);
assign LB = (r== 0) & ((state==S3)|(state == S2));
assign LA = (r== 0) & ((state==S3)|(state == S2)|(state == S1));
assign RC = (r == 1) &(state==S3);
assign RB = (r == 1) &((state==S3)|(state == S2));
assign RA = (r == 1) &((state==S3)|(state == S2)|(state == S1));
endmodule