design source的一部分:
always@(posedge clk or posedge clr)
if(clr)
current_state<=IDLE;
else
current_state<=next_state;
always@(*)
if(clr)
next_state<=IDLE;
else
begin
case(current_state)
IDLE: if(want)
next_state<=S0;
else
next_state=IDLE;
S0: case({Quarter,Dime,Nickel})
3'b000: next_state<=S0;//不投币
3'b001: next_state<=S1;//投币5美分
3'b010: next_state<=S2;//投币10美分
3'b100: next_state<=IDLE;//投币25美分
default: next_state<=S0;
endcase
S1: case({Quarter,Dime,Nickel})
3'b000: next_state<=S1;
3'b001: next_state<=S2;
3'b010: next_state<=S3;
3'b100: next_state<=IDLE;
default: next_state<=S1;
endcase
S2: case({Quarter,Dime,Nickel})
3'b000: next_state<=S2;
3'b001: next_state<=S3;
3'b010: next_state<=S4;
3'b100: next_state<=IDLE;
default: next_state<=S2;
endcase
S3: case({Quarter,Dime,Nickel})
3'b000: next_state<=S3;
3'b001: next_state<=S4;
3'b010: next_state<=IDLE;
3'b100: next_state<=IDLE;
endcase
S4: case({Quarter,Dime,Nickel})
3'b000: next_state<=S4;
3'b001: next_state<=IDLE;
3'b010: next_state<=IDLE;
3'b100: next_state<=IDLE;
endcase
default: next_state<=IDLE;
endcase
end
always@(*)
if(clr)
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
else begin
case(current_state)
IDLE: begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
S0: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10000;
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
S1: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime}<=4'b1000;//第一次找零5美分
ReturnDime<=2'b01;
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
S2: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10010;//第一次找零10美分
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
S3: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10110;//第一次找零10美分,第二次找零5美分
end
3'b010:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10000;
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
S4: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b11010;//第一次找零10美分,第二次找零10美分
end
3'b010:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10001;//第一次找零5美分
end
3'b001:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10000;
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
endcase
end
testbench的一部分:
``` parameter clk_period=10;
initial begin
clr<=1;
clk<=1;
Nickel<=0;
Dime<=0;
Quarter<=0;
want<=0;
#(clk_period/2) clr<=0;
#(clk_period/2) want<=1;
#200 want<=0;
end
always #(clk_period/2) clk<=~clk;
initial begin
#(clk_period) {Quarter,Dime,Nickel}<=3'b000;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b001;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//先投币5美分,再投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b010;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//先投币10美分,再投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b010;
#(clk_period) {Quarter,Dime,Nickel}<=3'b001;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//第一次投币10美分,第二次投币5美分,第三次投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b010;
#(clk_period) {Quarter,Dime,Nickel}<=3'b010;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//前两次投币10美分,最后投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b000;
end
endmodule