ylu 发表于 2012-2-25 16:02:52

矩阵键盘+ 数码管 Verilog

求助用FPGA实现矩阵键盘的数码管显示,代码不知道哪里还有问题,就是不能正常显示键值,感觉显示都是乱码module key4x4(kbrow,seg7_out,scan,clk,rst,kbcol);

output seg7_out;//7段显示控制信号(a,b,c,d,e,f,g)

output scan; //数码管段地址选择

output kbrow; //列扫描信号

input rst; //复位信号

input kbcol; //行扫描信号

input clk; //信号

reg seg7_out;

reg scan;

reg kbrow;

reg count;

reg sta;

reg seg7;

reg dat;

reg fn; //按键按下 标志位 ,判断是否有按键按下

initial scan<=3'b010; //只使用一个数码管显示

always @(posedge clk)

begin

if(!rst)

begin dat<=5'b10000;end//全灭

else

begin

count<=count+1'b1; //循环扫描列 ,列扫描

case(count)

2'b00: begin kbrow<=4'b1110;sta<=2'b00;end

2'b01: begin kbrow<=4'b1101;sta<=2'b01;end

2'b10: begin kbrow<=4'b1011;sta<=2'b10;end

2'b11: begin kbrow<=4'b0111;sta<=2'b11;end
endcase                                //行扫描译


case(sta)

2'b00:begin

case(kbcol)

4'b1110:begin dat<=5'd3;end //3

4'b1101:begin dat<=5'd2;end //2

4'b1011:begin dat<=5'd1;end //1

4'b0111:begin dat<=5'd0;end //0

default:begin dat<=5'b11111;end

endcase

end

2'b01:begin

case(kbcol)

4'b1110:begin dat<=5'b00111;end //7

4'b1101:begin dat<=5'b00110;end //6

4'b1011:begin dat<=5'b00101;end //5

4'b0111:begin dat<=5'b00100;end //4

default:begin dat<=5'b11111;end

endcase

end

2'b10:begin

case(kbcol)

4'b1110:begin dat<=5'b01011;end //11 B

4'b1101:begin dat<=5'b01010;end //10A

4'b1011:begin dat<=5'b01001;end //9

4'b0111:begin dat<=5'b01000;end //8

default:begin dat<=5'b11111;end

endcase

end

2'b11:begin

case(kbcol)

4'b1110:begin dat<=5'b01111;end //15 F

4'b1101:begin dat<=5'b01110;end //14 E

4'b1011:begin dat<=5'b01101;end //13 D

4'b0111:begin dat<=5'b01100;end //12 C

default:begin dat<=5'b11111;end

                endcase

                end

        endcase

end

end

always @(dat)

begin

begin fn<=~(dat&dat&dat&dat&dat);
end

case(dat)

5'b01111:begin seg7<=7'b1110001;end

5'b01110:begin seg7<=7'b1111001;end

5'b01101:begin seg7<=7'b1011110;end

5'b01100:begin seg7<=7'b0111001;end

5'b01011:begin seg7<=7'b1111100;end

5'b01010:begin seg7<=7'b1110111;end

5'd9:begin seg7<=7'b1101111;end

5'd8:begin seg7<=7'b1111111;end

5'd7:begin seg7<=7'b0000111;end

5'd6:begin seg7<=7'b1111101;end

5'd5:begin seg7<=7'b1101101;end

5'd4:begin seg7<=7'b1100110;end

5'd3:begin seg7<=7'b1001111;end

5'd2:begin seg7<=7'b1011011;end

5'd1:begin seg7<=7'b0000110;end

5'd0:begin seg7<=7'b0111111;end

default: begin seg7<=7'b0000000;end
               
        endcase

end

always @(posedge fn)

    begin seg7_out<=seg7;
    end
endmodule

jahero 发表于 2012-2-25 21:38:08

91 109 127的default是致命错误 应该删除 直接将seg7进行输出 废掉fn信号和与之相关的139-144行代码

ylu 发表于 2012-2-26 17:06:43

谢谢上楼的建议,小弟重新修改了下,可是效果还是一样,按键是数码管总是闪,看不清,一靠近键盘也闪,不知道是不是其他方面的问题,还请大侠指教

jahero 发表于 2012-2-26 17:37:56

73行别忘删了 139-141别删 就删143 144 。如果按下去一瞬间数字闪动然后就保持稳定 就再做个按键防抖。 如果数字稳定了 但显示的数不正确 告诉我 我再告诉你为什么不正确

ylu 发表于 2012-2-26 20:36:50

73删了,186-189行改成assign seg7_out=seg7;还有都按照你说的改了,可是效果还是不行,数码管都是有阴影的,跳呀跳的,没有出现你说的情况
页: [1]
查看完整版本: 矩阵键盘+ 数码管 Verilog