将按键消抖模块连接到其他模块发现按键消抖模块没有输出
//按键消抖模块
module key(
input wire clk,
input wire rst,
input wire key_in, // 按键输入
output reg key_out // 消抖后的按键, 1为按下
);
parameter TIME_DELAY = 10; // 延迟时间,20ms
reg [19:0] cnt_delay; // 计数器
wire add_cnt; // 是否计数
wire end_cnt; // 是否完成一次计数
reg key_before; // 前一个状态电平
reg key_now; // 当前按键电平
wire flag_fall; // 按下(开始抖动)标志
reg flag_timing; // 在计时标志,1表示在(可)计时
// 当前按键电平设置
always @(posedge clk or negedge rst) begin
if (!rst)
key_now <= 1'b1;
else
key_now <= key_in;
end
// 前一个按键状态电平设置
always @(posedge clk or negedge rst) begin
if (!rst)
key_before <= 1'b1;
else
key_before <= key_now;
end
// 前一状态为1,后一状态为0,开始抖动
assign flag_fall = key_before & (~key_now);
// 计时标志判断
always @(posedge clk or negedge rst) begin
if (!rst)
flag_timing <= 1'b0;
else if (flag_fall) // 开始计时
flag_timing <= 1'b1;
else if (end_cnt) // 计时结束
flag_timing <= 1'b0;
end
// 计数器
always @(posedge clk or negedge rst) begin
if (!rst)
cnt_delay <= 20'd0;
else if (add_cnt) begin // 计数
if (end_cnt)
cnt_delay <= 20'd0;
else
cnt_delay <= cnt_delay + 1'd1;
end
end
assign add_cnt = flag_timing; // 在计时状态 计时
assign end_cnt = ((cnt_delay==TIME_DELAY) && add_cnt); // 计时结束标志
// 消抖后的按键
always @(posedge clk or negedge rst) begin
if (!rst)
key_out <= 1'b0;
else if (end_cnt)
key_out <= ~key_now;
else
key_out <= 1'b0;
end
endmodule
//销售模块
module sell(
input clk,
input rst,
input money_two, //输入2元
input money_ten, //输入10元
input commodity_A, //商品A
input commodity_B, //商品B
input get_commodity,
output reg led_money_two, //投入币值1元亮灯
output reg led_money_ten, //投入币值2元亮灯
output reg led_commodityA, //选择商品1
output reg led_commodityB, //选择商品2
output reg led_commodity_out, //取出商品亮灯
output reg led_remainder,
output [3:0] commodity_numA,
output [3:0] commodity_numB,
output reg [7:0] back_money, //找回的钱
output reg [7:0] money,
output reg [7:0] commodity_price,
output flga_A
);
parameter s0 = 0,
s1 = 1,
s2 = 2,
s3 = 3;
reg AA;
reg BB;
reg [3:0] numA = 2;
reg [3:0] numB = 5;
reg flagA = 0;
reg flagB = 0;
reg fga;
reg fgb;
reg out_flag; //出货找零复位
reg [1:0] state; //状态机状态
reg [1:0] state_x;
reg two;
reg ten;
reg get;
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
AA<=0;
BB<=0;
two<=0;
ten<=0;
get<=0;
fga<=0;
fgb<=0;
end
else
begin
AA<=commodity_A;
BB<=commodity_B;
two<=money_two;
ten<=money_ten;
get<=get_commodity;
end
end
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
state<=s0;
end
else
begin
state<=state_x;
end
end
always@(posedge clk or negedge rst)
begin
case(state)
s0: begin
if(AA||BB)
begin
if(AA)
begin
fga=1;
flagA=fga;
end
else if(BB)
begin
fgb=1;
flagB=fgb;
end
state_x=s1;
end
else
begin
state_x = state;
end
end
s1: begin
if(two)
begin
state_x=s2;
end
else if(ten)
begin
state_x=s2;
end
else
begin
state_x=state;
end
end
s2: begin
if(moneybegin
state_x=s1;
end
else if(money >= commodity_price)
begin
state_x = s3;
end
else
begin
state_x = state;
end
end
s3: begin
if(get)
begin
state_x=s0;
end
else
begin
state_x=state;
end
end
default:
begin
state_x=s0;
end
endcase
end
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
money<=0;
end
else if(state==s0)
begin
money<=0;
end
else if(state==s1)
begin
if(two)
begin
money<=money+2;
end
else if(ten)
begin
money<=money+10;
end
else
begin
money<=money;
end
end
else if(state==s2)
begin
money<=money;
end
else if(state==s3)
begin
money<=money;
end
end
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
commodity_price<=0;
led_money_two<=0;
led_money_ten<=0;
led_commodityA<=0;
led_commodityB<=0;
end
else if(state==s0)
begin
if(AA)
begin
commodity_price<=3;
led_commodityA<=1;
led_commodityB<=0;
end
else if(BB)
begin
commodity_price<=7;
led_commodityA<=0;
led_commodityB<=1;
end
else
begin
commodity_price<=0;
led_commodityA<=0;
led_commodityB<=0;
end
end
else if(state==s1||state==s2)
begin
if(two)
begin
led_money_two<=1;
led_money_ten<=0;
end
else if(ten)
begin
led_money_two<=0;
led_money_ten<=1;
end
end
else if(state==s3)
begin
commodity_price<=commodity_price;
led_money_two<=0;
led_money_ten<=0;
led_commodityA<=0;
led_commodityB<=0;
if(flagA&&get)
begin
numA<=numA-1;
end
else if(flagB&&get)
begin
numB<=numB-1;
end
end
end
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
back_money<=0;
led_commodity_out<=0;
led_remainder<=0;
end
else if(state==s0)
begin
back_money<=0;
led_commodity_out<=0;
led_remainder<=0;
end
else if(money>=commodity_price)
begin
back_money<=money-commodity_price;
led_commodity_out<=1;
led_remainder<=1;
end
end
assign commodity_numA = numA;
assign commodity_numB = numB;
assign flga_A=flagA;
assign flga_A=flagA;
endmodule
//顶层模块
module top(
input wire clk,
input wire rst,
input wire[4:0] key_in,
input money_two, //输入2元
input money_ten, //输入10元
input commodity_A, //商品A
input commodity_B, //商品B
input get_commodity,
output reg led_money_two, //投入币值1元亮灯
output reg led_money_ten, //投入币值2元亮灯
output reg led_commodityA, //选择商品1
output reg led_commodityB, //选择商品2
output reg led_commodity_out, //取出商品亮灯
output reg led_remainder,
output [3:0] commodity_numA,
output [3:0] commodity_numB,
output reg [7:0] back_money, //找回的钱
output reg [7:0] money,
output reg [7:0] commodity_price,
output flga_A
);
wire [4:0] key;
wire twoyuan,tenyuan; //按键消抖后的信号
wire [7:0] back_money_top; //找回的钱
wire [7:0] money_show_top;
wire [7:0] commodity_price_top;
wire commodity_A_A; //商品A
wire commodity_B_B; //商品B
wire en_get;
wire flag_A;
key k0(
.clk (clk),
.rst (rst),
.key_in (key_in[0]), // 按键输入
.key_out (twoyuan)
);
key k1(
.clk (clk),
.rst (rst),
.key_in (key_in[1]), // 按键输入
.key_out (tenyuan)
);
key k2(
.clk (clk),
.rst (rst),
.key_in (key_in[2]), // 按键输入
.key_out (commodity_A_A)
);
key k3(
.clk (clk),
.rst (rst),
.key_in (key_in[3]), // 按键输入
.key_out (commodity_B_B)
);
key k4(
.clk (clk),
.rst (rst),
.key_in (key_in[4]), // 按键输入
.key_out (en_get)
);
sell due(
.clk (clk),
.rst (rst),
.money_two (twoyuan),
.money_ten (tenyuan),
.commodity_A (commodity_A_A),
.commodity_B (commodity_B_B),
.get_commodity (en_get),
.led_money_two (led_money_two),
.led_money_ten (led_money_ten),
.led_commodityA (led_commodityA),
.led_commodityB (led_commodityB),
.led_commodity_out (led_commodity_out),
.led_remainder (led_remainder),
.commodity_numA (commodity_numA),
.commodity_numB (commodity_numB),
.back_money (back_money_top),
.money (money_show_top),
.commodity_price (commodity_price_top),
.flga_A (flga_A)
);
endmodule
销售模块单独测试的话是没问题,但是一旦连接按键消抖模块就没有输出了