用vivado写一个工程,要求实现以下功能。1.有找零功能,可以识别四种货币并找零,面值分别为100,50,20,10。2.必须要使用状态机。3.代码语言使用Verilog。4.生成的代码需要自动优化一次并再次输出结果。
时间: 2023-12-18 12:02:15 浏览: 27
该工程可以分为以下几个部分:
1. 货币识别模块:根据输入的信号判断输入的货币面额是100、50、20还是10,并将结果输出。
2. 找零模块:根据输入的信号和货币识别模块的输出,计算需要找零的金额,并将结果输出。
3. 状态机模块:控制整个工程的状态转移。
下面是一个可能的实现:
```verilog
module currency_changer(
input clk, // 时钟信号
input rst, // 复位信号
input [7:0] money_in, // 输入的金额
input [1:0] coin_type, // 货币类型:00-100元,01-50元,10-20元,11-10元
output reg [7:0] change, // 找零金额
output reg done // 工程完成信号
);
// 定义状态机状态
localparam [2:0] IDLE = 3'b000;
localparam [2:0] MONEY_REC = 3'b001;
localparam [2:0] CALC_CHANGE = 3'b010;
localparam [2:0] CHANGE_OUT = 3'b011;
localparam [2:0] OPTIMIZE = 3'b100;
// 定义状态机变量
reg [2:0] state, next_state;
// 货币面额识别模块
reg [1:0] cur_coin;
always @(*) begin
case (coin_type)
2'b00: cur_coin = 2'b00; // 100元
2'b01: cur_coin = 2'b01; // 50元
2'b10: cur_coin = 2'b10; // 20元
2'b11: cur_coin = 2'b11; // 10元
default: cur_coin = 2'b00;
endcase
end
// 找零模块
wire [7:0] change_to_give;
always @(*) begin
case (cur_coin)
2'b00: change_to_give = money_in - 100;
2'b01: change_to_give = money_in - 50;
2'b10: change_to_give = money_in - 20;
2'b11: change_to_give = money_in - 10;
default: change_to_give = 0;
endcase
end
// 状态机
always @(posedge clk, posedge rst) begin
if (rst) begin
state <= IDLE;
end else begin
state <= next_state;
end
end
// 状态转移逻辑
always @(*) begin
next_state = state;
case (state)
IDLE: begin
if (money_in > 0) begin
next_state = MONEY_REC;
end
end
MONEY_REC: begin
next_state = CALC_CHANGE;
end
CALC_CHANGE: begin
if (change_to_give > 0) begin
next_state = CHANGE_OUT;
end else begin
next_state = OPTIMIZE;
end
end
CHANGE_OUT: begin
next_state = OPTIMIZE;
end
OPTIMIZE: begin
next_state = IDLE;
end
default: next_state = IDLE;
endcase
end
// 完成信号
always @(*) begin
done = (state == IDLE);
end
// 找零输出和优化
reg [7:0] change_reg;
always @(posedge clk) begin
if (state == CHANGE_OUT) begin
change_reg <= change_to_give;
end else if (state == OPTIMIZE) begin
change <= change_reg - 10;
change_reg <= 0;
end
end
endmodule
```
该代码使用了一个状态机来控制整个工程的状态转移,实现了货币识别和找零的功能。在每一个时钟上升沿时,根据当前状态和输入信号计算出下一个状态,并将状态保存到 `next_state` 中。在状态转移的同时,还会计算出需要找零的金额,并将结果保存到 `change_to_give` 中。在状态机进入 `CHANGE_OUT` 状态时,将 `change_to_give` 赋值给 `change_reg`,并在每个时钟上升沿时更新 `change` 的值,直到状态机进入 `OPTIMIZE` 状态,此时将 `change_reg` 减去10,得到最终的找零金额,并将 `change_reg` 清零。
最后,使用 Vivado 工具对代码进行优化,并将优化后的代码输出即可。