FPGA按键控制数码管

2024-12-15 11:38:54
推荐回答(2个)
回答1:

module juzhenanjian (shumaout,weiout,swhang,swlie,clk);
output [7:0] shumaout,weiout;
input [3:0] swlie;
output [3:0] swhang;
input clk;
reg [7:0] shumaout,weiout;
reg [3:0] a,key_swhang,key_swlie ,swhang;
reg [32:0] cnt;
reg [32:0] cnt1;
reg [4:0] state,sta;
reg clk1khz;
initial state='d0;

always @(posedge clk)
begin
cnt=cnt+1;
if(cnt<50) clk1khz=0;
else if(cnt<100) clk1khz=1;
else cnt=0;
end
always @(posedge clk1khz)
begin

case(state)
'd0: //判断是否按下键
begin swhang=4'b0000;a='b0;
if(swlie!=4'b1111) begin sta='d1;swhang=4'b1110;state='d5;end //行扫描第一行,第一行为0,判断列是否是1111是跳到第二行,
else state='d0;
end
'd1:
begin
if(swlie!=4'b1111) state='d6; //是的话,传数据,显示
else begin sta='d2;swhang=4'b1101;state='d5;end //行扫描第2行,第2行为0,判断列是否是1111.是跳到第3行,

end
'd2:
begin
if(swlie!=4'b1111) state='d6;//是的话,传数据,显示
else begin sta='d3;swhang=4'b1011;state='d5;end //行扫描第3行,第3行为0,判断列是否是1111.是跳到第3行,
end
'd3:
begin
if(swlie!=4'b1111) state='d6;//是的话,传数据,显示
else begin sta='d4;swhang=4'b0111;state='d5;end //行扫描第4行,第4行为0,判断列是否是1111.是跳到第行,
end
'd4:
begin
if(swlie!=4'b1111) state='d6;//是的话,传数据,显示
else state='d0;
end

'd5: begin cnt1=cnt1+1; //延时消抖
if(cnt1==20000) begin cnt1=0;state=sta; end

end
'd6 :
begin //中间变量,传数据显示
if(swlie!=4'b1111) begin a='b1; key_swhang=swhang;key_swlie=swlie;state='d6;end
else begin state='d0;a='b0;end

end
default : state='d0;
endcase
end

always @(clk1khz or key_swlie or key_swhang) //数码管显示
begin
if(a=='b1)
begin
case({key_swlie,key_swhang})
8'b1110_1110: begin weiout=8'b0000_0001 ;shumaout='h3f ; end
8'b1101_1110: begin weiout=8'b0000_0010 ;shumaout='h06 ; end
8'b1011_1110: begin weiout=8'b0000_0100 ;shumaout='h5b ; end
8'b0111_1110: begin weiout=8'b0000_1000 ;shumaout='h4f ; end

8'b1110_1101: begin weiout=8'b0001_0000 ;shumaout='h66 ; end
8'b1101_1101: begin weiout=8'b0010_0000 ;shumaout='h6d ; end
8'b1011_1101: begin weiout=8'b0100_0000 ;shumaout='h7d ; end
8'b0111_1101: begin weiout=8'b1000_0000 ;shumaout='h07 ; end

8'b1110_1011: begin weiout=8'b0000_0001 ;shumaout='h7f ; end
8'b1101_1011: begin weiout=8'b0000_0010 ;shumaout='h6f ; end
8'b1011_1011: begin weiout=8'b0000_0100 ;shumaout='h77 ; end
8'b0111_1011: begin weiout=8'b0000_1000 ;shumaout='h7c ; end

8'b1110_0111: begin weiout=8'b0001_0000 ;shumaout='h39 ; end
8'b1101_0111: begin weiout=8'b0010_0000 ;shumaout='h5e ; end
8'b1011_0111: begin weiout=8'b0100_0000 ;shumaout='h79 ; end
8'b0111_0111: begin weiout=8'b1000_0000 ;shumaout='h71 ; end
default : begin weiout=8'b0000_0000 ;shumaout='h00 ; end
endcase
end
else begin weiout=8'b0000_0000 ;shumaout='h00 ; end
end

endmodule

回答2:

应该是。Efica