Adld Assignment
Adld Assignment
module fsm(clock,reset,coin,vend,state,change);
input clock;
input reset;
input [2:0]coin;
output vend;
output [2:0]state;
output [2:0]change;
reg vend;
reg [2:0]change;
wire [2:0]coin;
parameter [2:0]NICKEL=3’b001;
parameter [2:0]DIME=3’b010;
parameter [2:0]NICKEL_DIME=3’b011;
parameter [2:0]DIME_DIME=3’b100;
parameter [2:0]QUARTER=3’b101;
parameter [2:0]IDLE=3’b000;
parameter [2:0]FIVE=3’b001;
parameter [2:0]TEN=3’b010;
parameter [2:0]FIFTEEN=3’b011;
parameter [2:0]TWENTY=3’b100;
parameter [2:0]TWENTYFIVE=3’b101;
reg [2:0]state,next_state;
begin
next_state=0;
case(state)
IDLE: case(coin)
NICKEL: next_state=FIVE;
DIME: next_state=TEN;
QUARTER: next_state=TWENTYFIVE;
default: next_state=IDLE;
endcase
FIVE: case(coin)
NICKEL: next_state=TEN;
DIME: next_state=FIFTEEN;
QUARTER: next_state=TWENTYFIVE;
default: next_state=FIVE;
endcase
TEN: case(coin)
NICKEL: next_state=FIFTEEN;
DIME: next_state=TWENTY;
QUARTER: next_state=TWENTYFIVE;
default: next_state=TEN;
endcase
FIFTEEN: case(coin)
NICKEL: next_state=TWENTY;
DIME: next_state=TWENTYFIVE;
QUARTER: next_state=TWENTYFIVE;
default: next_state=FIFTEEN;
endcase
TWENTY: case(coin)
NICKEL: next_state=TWENTYFIVE;
DIME: next_state=TWENTYFIVE;
QUATER: next_state=TWENTYFIVE;
default: next_state=TWENTY;
endcase
TWENTYFIVE: next_state=IDLE;
default : next_state=IDLE;
endcase
end
always @(clock)
begin
if(reset) begin
end
case (state)
endcase
end
endmodule
test bench
module test;
reg clock,reset;
reg [2:0]coin;
wire vend;
wire [2:0]state;
wire [2:0]change;
parameter [2:0]IDLE=3’b000;
parameter [2:0]FIVE=3’b001;
parameter [2:0]TEN=3’b010;
parameter [2:0]FIFTEEN=3’b011;
parameter [2:0]TWENTY=3’b100;
parameter [2:0]TWENTYFIVE=3’b101;
parameter [2:0]NICKEL=3’b001;
parameter [2:0]DIME=3’b010;
parameter [2:0]NICKEL_DIME=3’b011;
parameter [2:0]DIME_DIME=3’b100;
parameter [2:0]QUARTER=3’b101;
initial begin
$display("Time\tcoin\tdrink\treset\tclock\tstate\tchange"); $monitor("%g\t%b\t%b\t%b\t%b\t%d\t
%d",$time,coin,vend,reset,clock,state,change);
$dumpvars;
$dumpfile("file.vcd");
clock=0;
reset=1
#2 reset=0;
coin=NICKEL;
#2 reset=1;
coin=2’b00;
#2 reset=0;
coin=DIME;
#2 reset=1; coin=2’b00;
#2 reset=0;
coin=QUARTER;
#2 reset=1; coin=2’b00;
#2 reset=0;
coin=NICKEL;
#2 coin=NICKEL;
#2 coin=NICKEL;
#2 coin=NICKEL;
#2 coin=NICKEL;
#2 reset=1; coin=2’b00;
#2 reset=0;
#2coin=NICKEL;
#2 coin=DIME;
#2 coin=DIME;
#2 reset=1;
coin=2’b00;
#2 reset=0;
coin=NICKEL;
#2 coin=DIME;
#2 coin=QUARTER;
#2 reset=1; coin=2’b00;
#2 reset=0;
coin=NICKEL;
#2 coin=NICKEL;
#2 coin=NICKEL;
#2 coin=DIME;
#2 reset=1; coin=2’b00;
#2 reset=0;
coin=NICKEL;
#2 coin=NICKEL;
#2 coin=NICKEL;
#2 coin=NICKEL;
#2 coin=DIME;
#2coin=NICKEL;
#2 coin=NICKEL;
#2 coin=QUARTER;
#2 reset=1; coin=2’b00;
#2 reset=0;
coin=NICKEL;
#2 coin=QUARTER;
#2 reset=1; coin=2’b00;
#2 $finish;
end
always
#1 clock=~clock;
initial begin
if (reset)
coin=2’b00;
end
fsm inst1(clock,reset,coin,vend,state,change);
endmodule
Main code
module FCFS_Arbiter (
input wire clk,
);
if (reset) begin
end
end
case (state)
IDLE:
state_next = SERVING;
serving_next = requests_reg;
state_next = IDLE;
serving_next = 4'b0000;
end
SERVING:
state_next = DONE;
serving_next = 4'b0000;
end else begin
state_next = SERVING;
serving_next = serving;
end
DONE:
state_next = SERVING;
serving_next = requests_done;
state_next = SERVING;
serving_next = requests_reg;
state_next = IDLE;
serving_next = 4'b0000;
end
endcase
end
if (reset) begin
end
if (state == IDLE) begin
end
end
end
end
endmodule
testbench
module fcfs_arbiter_tb;
// Parameters
parameter NUM_REQUESTS = 4;
// Inputs
reg clk;
// Outputs
// Clock generation
always begin
#5 clk = ~clk;
end
// Test case
initial begin
// Initialize inputs
clk = 0;
request = 0;
#10;
// Set request for the first two inputs
request[0] = 1;
request[1] = 1;
#10;
request[2] = 1;
request[3] = 1;
#10;
request[0] = 0;
#10;
request[1] = 0;
#10;
#10;
request[3] = 0;
end
endmodule