문제
아메리카노 커피는 150원이며 150원을 받게 되면 정상적으로 아메리카노 커피(W)를 출력하나 100원 동전 2개를 받으면 50원 저장되고 아메리카노 커피를 출력한다.
A학생은 Mealy Machine을 이용하여 State Table, State Diagram을 그리고 gate 회로를 설계하라. 그리고 Verilog를 이용하여 설계하고 test bench를 이용하여 정상적으로 동작하는지 파형을 확인하라
단 test pattern은 다음과 같다 100(XYW) 100 100 001, 010 010 001, 010 001 100 001
여기서 말하는 test pattern는 X는 50원을의미 Y는 100원 W는 001 스위치를 의미한다.
그래서 1. 100(XYW) 100 100 001 50원을 3번 연속으로 넣고 001의 의미인 w를 누르면
아메리카노 출력 2. 010 010 001 100원 2개를 넣어도 출력
단 010 001 100원을 넣었는데 W를 누르면 출력이 안되야한다.
왜냐면 100원이 들어갔기 때문에... 따라서 코드를 짜면
module fsmm(clk, rst_n, x,p,w, y);
input clk, rst_n,x,p,w ;
output reg y;
parameter S0 = 3'b000; // 국부적인 영향을 미치는 parameter로 변수를 정의한다.
parameter S1 = 3'b001;
parameter S2 = 3'b010;
parameter S3 = 3'b011;
parameter S4 = 3'b100;
parameter S5 = 3'b101;
reg [2:0] state, next;
//State register Logic (상태를 지정하는 블록: 리셋이 1이면 초기 값의 상태를 갖는다.)
always @(posedge clk or posedge rst_n) begin
if(rst_n ==1) state = S0;
else state = next;
end
// Next state and Output Logic ( 다음 상태와 출력 값을 동시에 지정하는 블록이다.)
always @( state or x ) begin
case(state)
S0: if(x==0&p==0&w==0) begin
next = S0;
y = 0;
end
else if(x==1&p==0&w==0) begin
next = S1;
y = 0;end
else if(x==0&p==1&w==0) begin
next = S2;
y = 0;
end
else
next = S0; //미사용 상태에 대해서는 S0(초기) 상태로
S1: if(x==1&p==0&w==0) begin
next = S2;
y = 0;
end
else if(x==0&p==1&w==0) begin
next = S3;
y = 0;end
else
next = S1;
S2: if(x==1&p==0&w==0) begin
next = S3;
y = 0;
end
else if(x==0&p==1&w==0) begin
next = S4;
y = 0;end
else
next = S2;
S3: if(x==0&p==0&w==1)begin next = S0;
y = 0;
end
else
next = S3;
S4: if(x==0&p==0&w==1) begin
next = S1;
y = 1;
end
else
next = S4;
endcase
end
endmodule
output reg y;
parameter S0 = 3'b000; // 국부적인 영향을 미치는 parameter로 변수를 정의한다.
parameter S1 = 3'b001;
parameter S2 = 3'b010;
parameter S3 = 3'b011;
parameter S4 = 3'b100;
parameter S5 = 3'b101;
reg [2:0] state, next;
//State register Logic (상태를 지정하는 블록: 리셋이 1이면 초기 값의 상태를 갖는다.)
always @(posedge clk or posedge rst_n) begin
if(rst_n ==1) state = S0;
else state = next;
end
// Next state and Output Logic ( 다음 상태와 출력 값을 동시에 지정하는 블록이다.)
always @( state or x ) begin
case(state)
S0: if(x==0&p==0&w==0) begin
next = S0;
y = 0;
end
else if(x==1&p==0&w==0) begin
next = S1;
y = 0;end
else if(x==0&p==1&w==0) begin
next = S2;
y = 0;
end
else
next = S0; //미사용 상태에 대해서는 S0(초기) 상태로
S1: if(x==1&p==0&w==0) begin
next = S2;
y = 0;
end
else if(x==0&p==1&w==0) begin
next = S3;
y = 0;end
else
next = S1;
S2: if(x==1&p==0&w==0) begin
next = S3;
y = 0;
end
else if(x==0&p==1&w==0) begin
next = S4;
y = 0;end
else
next = S2;
S3: if(x==0&p==0&w==1)begin next = S0;
y = 0;
end
else
next = S3;
S4: if(x==0&p==0&w==1) begin
next = S1;
y = 1;
end
else
next = S4;
endcase
end
endmodule
벤치는
module fsma_v;
// Inputs
reg clk;
reg rst_n;
reg x;
reg p;
reg w;
reg clk;
reg rst_n;
reg x;
reg p;
reg w;
// Outputs
wire y;
wire y;
// Instantiate the Unit Under Test (UUT)
fsmm uut (
.clk(clk),
.rst_n(rst_n),
.x(x),
.p(p),
.w(w),
.y(y)
);
fsmm uut (
.clk(clk),
.rst_n(rst_n),
.x(x),
.p(p),
.w(w),
.y(y)
);
initial begin
clk = 1'b0;
forever #10 clk = ~clk;
end
always begin
x=0;p=0;w=0; rst_n = 0;
#10 x=1;p=0;w=0 ; rst_n = 1;
#20 x=1;p=0;w=0 ;
#20 x=1;p=0;w=0 ;
#20 x=1;p=0;w=0 ;
#20 x=0;p=0;w=1 ;
end
endmodule
clk = 1'b0;
forever #10 clk = ~clk;
end
always begin
x=0;p=0;w=0; rst_n = 0;
#10 x=1;p=0;w=0 ; rst_n = 1;
#20 x=1;p=0;w=0 ;
#20 x=1;p=0;w=0 ;
#20 x=1;p=0;w=0 ;
#20 x=0;p=0;w=1 ;
end
endmodule
말씀하신대로 고쳤는데ㅜㅜ 시뮬레이션에서 w값과 결과값이 안나옴니다ㅜㅜ
베릴로그로 자판기를 만들어야 하는데 조건이 3개나 되서
경우의 수가 많아져서 잘 되지가 않네요.
2진수 표기법이라 하심은 b'10 뭐 이런식으로 바꿔야 하는건가요?
x=1&p=0&w=0 이렇게 바꿔도 되나요?
그리고 블로킹과 논블로킹을 섞어서 사용하지 마세요!