Verilog设计一个博物馆投币售票机控制系统
时间: 2024-01-19 22:57:19 浏览: 70
module ticket_machine(
input clk, //时钟信号
input reset, //复位信号
input coin, //投币信号
input start, //开始售票信号
input [1:0] ticket_price, //售票价格,00-10元,01-20元,10-50元
output reg [1:0] ticket_count, //售票数量,00-9999张
output reg [1:0] coin_count, //投币数量,00-999元
output reg sell_ticket, //售票信号
output reg return_coin //退币信号
);
//参数定义
parameter IDLE = 2'b00; //空闲状态
parameter COIN_INSERTED = 2'b01; //已投币状态
parameter TICKET_SOLD = 2'b10; //售票状态
//状态寄存器
reg [1:0] state_reg, state_next;
//售票价格
parameter TICKET_PRICE_10 = 2'b00;
parameter TICKET_PRICE_20 = 2'b01;
parameter TICKET_PRICE_50 = 2'b10;
//售票数量和投币数量
reg [1:0] ticket_count_reg;
reg [1:0] coin_count_reg;
//组合逻辑部分
assign sell_ticket = (state_reg == TICKET_SOLD); //售票信号
assign return_coin = (state_reg == COIN_INSERTED); //退币信号
//状态转移部分
always @(posedge clk, posedge reset) begin
if (reset) begin
state_reg <= IDLE;
ticket_count_reg <= 2'b00;
coin_count_reg <= 2'b00;
end
else begin
state_reg <= state_next;
ticket_count_reg <= ticket_count_reg + 1'b1; //售票数量自增1
coin_count_reg <= coin_count_reg + coin; //投币数量累加
end
end
//状态机部分
always @(state_reg, coin, start, ticket_price) begin
case(state_reg)
IDLE: begin
if (start) begin
state_next <= COIN_INSERTED; //转移到已投币状态
end
else begin
state_next <= IDLE; //保持空闲状态
end
end
COIN_INSERTED: begin
if (coin) begin
if (ticket_price == TICKET_PRICE_10) begin
if (coin_count_reg >= 2'b10) begin
state_next <= TICKET_SOLD; //转移到售票状态
end
else begin
state_next <= COIN_INSERTED; //保持已投币状态
end
end
else if (ticket_price == TICKET_PRICE_20) begin
if (coin_count_reg >= 2'b01) begin
state_next <= TICKET_SOLD; //转移到售票状态
end
else begin
state_next <= COIN_INSERTED; //保持已投币状态
end
end
else if (ticket_price == TICKET_PRICE_50) begin
if (coin_count_reg >= 2'b10) begin
state_next <= TICKET_SOLD; //转移到售票状态
end
else begin
state_next <= COIN_INSERTED; //保持已投币状态
end
end
end
else begin
state_next <= COIN_INSERTED; //保持已投币状态
end
end
TICKET_SOLD: begin
state_next <= IDLE; //转移到空闲状态
end
endcase
end
//输出部分
assign ticket_count = ticket_count_reg; //售票数量
assign coin_count = coin_count_reg; //投币数量
endmodule
阅读全文