|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
题目是设计一个卖报机,报纸价钱八角,纸币有1角,2角,5角,一元。该卖报机不考虑投币为大额面值等特殊情况
状态图我也画出来了,
代码是data_out=1表示给出报纸,data_out_return1=1表示找回1角硬币,data_out_return2=1表示找回2角硬币。
- module auto_sellor (current_state,data_out,data_out_return1,data_out_return2,
- clk,rst_n,data_in);
- parameter state_width=3,data_in_width=3;
- output [state_width-1:0] current_state;
- output data_out, data_out_return1, data_out_return2;
- input [data_in_width-1:0] data_in;
- input clk, rst_n;
- reg [state_width-1:0] current_state, next_state;
- reg data_out, data_out_return1, data_out_return2;
- always @(current_state or rst_n)
- if (!rst_n)
- next_state<=0;
- else
- case (current_state)
- 3'b000: case (data_in)
- 3'b000: begin
- next_state<=3'b000;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b001: begin
- next_state<=3'b001;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b010: begin
- next_state<=3'b010;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b011: begin
- next_state<=3'b101;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b100: begin
- next_state<=3'b000;
- data_out<=1'b1;
- data_out_return1<=1'b0;
- data_out_return2<=1'b1;
- end
- endcase
- 3'b001: case (data_in)
- 3'b000: begin
- next_state<=3'b001;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b001: begin
- next_state<=3'b010;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b010: begin
- next_state<=3'b011;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b011: begin
- next_state<=3'b110;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- endcase
- 3'b010: case (data_in)
- 3'b000: begin
- next_state<=3'b010;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b001: begin
- next_state<=3'b011;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b010: begin
- next_state<=3'b100;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b011: begin
- next_state<=3'b111;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- endcase
- 3'b011: case (data_in)
- 3'b000: begin
- next_state<=3'b011;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b001: begin
- next_state<=3'b100;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b010: begin
- next_state<=3'b101;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b011: begin
- next_state<=3'b000;
- data_out<=1'b1;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- endcase
- 3'b100: case (data_in)
- 3'b000: begin
- next_state<=3'b000;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b001: begin
- next_state<=3'b101;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b010: begin
- next_state<=3'b110;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b011: begin
- next_state<=3'b000;
- data_out<=1'b1;
- data_out_return1<=1'b1;
- data_out_return2<=1'b0;
- end
- endcase
- 3'b101: case (data_in)
- 3'b000: begin
- next_state<=3'b101;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b001: begin
- next_state<=3'b110;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b010: begin
- next_state<=3'b111;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b011: begin
- next_state<=3'b000;
- data_out<=1'b1;
- data_out_return1<=1'b0;
- data_out_return2<=1'b1;
- end
- endcase
- 3'b110: case (data_in)
- 3'b000: begin
- next_state<=3'b110;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b001: begin
- next_state<=3'b111;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b010: begin
- next_state<=3'b000;
- data_out<=1'b1;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- endcase
- 3'b111: case (data_in)
- 3'b000: begin
- next_state<=3'b111;
- data_out<=1'b0;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- 3'b001: begin
- next_state<=3'b000;
- data_out<=1'b1;
- data_out_return1<=1'b0;
- data_out_return2<=1'b0;
- end
- endcase
- endcase
- always @(posedge clk or rst_n)
- if (!rst_n)
- current_state<=3'b000;
- else
- current_state<=next_state;
- endmodule
复制代码 |
-
状态图
|