题解 | 自动贩售机2

同样考虑连续投币问题:

`timescale 1ns/1ns

module seller2(
	input wire clk  ,
	input wire rst  ,
	input wire d1 ,
	input wire d2 ,
	input wire sel ,
	
	output reg out1,
	output reg out2,
	output reg out3
);
//*************code***********//
parameter S0=0,S05=1,S10=2,S15=3,S20=4,S25=5,S30=6;
reg [2:0]state,next;
reg d1r,d2r;
always@(posedge clk or negedge rst)
    if (~rst)
		state <= S0;
	else
		state <= next;

always@(posedge clk or negedge rst)
    if (~rst) begin
		d1r <= 0;
        d2r <= 0;
    end
	else begin
		d1r <= d1;
        d2r <= d2; 
    end


always@(*)
    if (~rst)
		next = S0;
	else begin
        case(state)
            S0 : next = {d1r,d2r}==2'b10 ? S05:      //0
                        {d1r,d2r}==2'b01 ? S10: state;
            S05: next = {d1r,d2r}==2'b10 ? S10:      //0.5
                        {d1r,d2r}==2'b01 ? S15: state;
            S10: next = {d1r,d2r}==2'b10 ? S15:      //1.0
                        {d1r,d2r}==2'b01 ? S20: state;

            S15: next = ~sel? ({d1r,d2r}==2'b10 ? S05:
                               {d1r,d2r}==2'b01 ? S10:
                               {d1r,d2r}==2'b00 ? S0 :next):
                              ({d1r,d2r}==2'b10 ? S20:
                               {d1r,d2r}==2'b01 ? S25:next);

            S20: next = ~sel? ({d1r,d2r}==2'b10 ? S05:
                               {d1r,d2r}==2'b01 ? S10:
                               {d1r,d2r}==2'b00 ? S0 :next):
                              ({d1r,d2r}==2'b10 ? S25:      //2.0
                               {d1r,d2r}==2'b01 ? S30:next);

            S25: next = {d1r,d2r}==2'b10 ? S05:      //2.5
                        {d1r,d2r}==2'b01 ? S10:
                        {d1r,d2r}==2'b00 ? S0 :next;
            S30: next = {d1r,d2r}==2'b10 ? S05:      //3.0
                        {d1r,d2r}==2'b01 ? S10:
                        {d1r,d2r}==2'b00 ? S0 :next;
            default: next = S0;
        endcase

    end
always@(posedge clk or negedge rst)
    if (~rst) begin
		out1 <= 1'b0;
		out2 <= 1'b0;
        out3 <= 1'b0;
	end
	else begin
		case (next)
		S15:
            begin
                if (~sel) begin
                    out1 <= 1'b1;                     
                    out3 <= 1'b0;
                end
            end
		S20:            
            begin
                if (~sel) begin
                    out1 <= 1'b1;                     
                    out3 <= 1'b1;
                end
            end
		S25:            
            begin

                    out2 <= 1'b1;                     
                    out3 <= 1'b0;
                
            end
		S30:            
            begin

                    out2 <= 1'b1;                     
                    out3 <= 1'b1;
                
            end
		default: begin out1 <= 1'b0; out2 <= 1'b0; out3 <= 1'b0;end
		endcase
	end

//*************code***********//
endmodule

`timescale 1ns/1ns

module seller2_tb();

reg clk      ;
reg rst       ;
reg d1        ;
reg d2        ;
reg sel        ;
wire out1      ;
wire out2 ;
wire out3 ;

seller2 sss(
	.clk  		(clk)	,
	.rst  		(rst)	,
	.d1 		(d1)	,
	.d2 		(d2)	,
	.sel 		(sel)	,

	.out1		(out1)	,
	.out2		(out2)  ,
	.out3		(out3)
);

initial begin
clk=0;
end
always#10 clk=~clk;
// 测试主程序
initial begin
#10;
rst = 1'b1;
{d1,d2}=2'b00;
#20;
sel =1'b0;
#20;
@ (posedge clk) ; {d1,d2}=2'b10;
@ (negedge clk) ; {d1,d2}=2'b00;
#20;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#5;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#20;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#5;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#20;
sel = 1'b1;
#20;
@ (posedge clk) ; {d1,d2}=2'b10;
@ (negedge clk) ; {d1,d2}=2'b00;
#20;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#5;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#20;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#20;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#20;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#20;
@ (posedge clk) ; {d1,d2}=2'b01;
@ (negedge clk) ; {d1,d2}=2'b00;
#20;
#200 $finish;
end
endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务