是这样的,矩阵键盘那一部分已经完成了,就是显示这一块,比如想通过键盘输入125,先按1,应该显示001;再按2,显示012;最后按5,显示125。但是问题是先后分别显示的是111、222、555。显示部分的代码如下:
数码管显示部分的时钟是1KHZ;
key_data=4'hb或4'hc或4'ha是我定义的功能键;
按理key_data_reg0、key_data_reg1、key_data_reg2、key_data_reg3的变化应该如下:
按下c键(设置按键):key_data_reg0=0
key_data_reg1=0
key_data_reg2=0
key_data_reg3=0
按下1键: key_data_reg0=1
key_data_reg1=0
key_data_reg2=0
key_data_reg3=0
按下2键: key_data_reg0=2
key_data_reg1=1
key_data_reg2=0
key_data_reg3=0
按下5键: key_data_reg0=5
key_data_reg1=2
key_data_reg2=1
key_data_reg3=0
按下a键(确认按键):key_data_reg0=a
key_data_reg1=5
key_data_reg2=2
key_data_reg3=1
- module display(
- clk ,
- rst_n ,
- key_data ,
- sel ,
- seg
- );
- //输入信号定义
- input clk ;
- input rst_n ;
- input[3:0] key_data ;
- //输出信号定义
- output sel ;
- output seg ;
- //输出信号reg定义
- reg[2:0] sel ; //数码管的位选信号
- reg[7:0] seg ; //数码段的段选信号
- //中间信号定义
- reg[3:0] disp_data ; //单个数码管要显示的数据
- reg[3:0] key_data_reg0 ;
- reg[3:0] key_data_reg1 ;
- reg[3:0] key_data_reg2 ;
- reg[3:0] key_data_reg3 ;
-
- always @(posedge clk or negedge rst_n)begin
- if(rst_n == 1'b0)begin
- sel <= 3'b110;
- end
- else if(sel == 3'b110)begin
- sel <= 3'b101;
- end
- else if(sel == 3'b101)begin
- sel <= 3'b011;
- end
- else begin
- sel <= 3'b110;
- end
- end
-
- always@(key_data)begin
- if(rst_n==1'b0)begin
- key_data_reg0 <= 4'd0;
- key_data_reg1 <= 4'd0;
- key_data_reg2 <= 4'd0;
- key_data_reg3 <= 4'd0;
- end
- else if(key_data == 4'hb | key_data == 4'hc)begin
- key_data_reg0 <= 4'd0;
- key_data_reg1 <= 4'd0;
- key_data_reg2 <= 4'd0;
- key_data_reg3 <= 4'd0;
- end
- else begin
- key_data_reg0 <= key_data;
- key_data_reg1 <= key_data_reg0;
- key_data_reg2 <= key_data_reg1;
- key_data_reg3 <= key_data_reg2;
- end
- end
-
-
-
- always @(posedge clk or negedge rst_n)begin //将对应位数的值赋给对应位数码管
- case(sel)
- 3'b110: disp_data <= key_data_reg1 ;
- 3'b101: disp_data <= key_data_reg2 ;
- 3'b011: disp_data <= key_data_reg3;
- default: disp_data <= 4'b0000;
- endcase
- end
- always @(posedge clk or negedge rst_n)begin //数码管显示表
- if(rst_n == 1'b0)begin
- seg = 8'b11000000;
- end
- else begin
- case(disp_data)
- 4'd0:seg = 8'b11000000;
- 4'd1:seg = 8'b11111001;
- 4'd2:seg = 8'b10100100;
- 4'd3:seg = 8'b10110000;
- 4'd4:seg = 8'b10011001;
- 4'd5:seg = 8'b10010010;
- 4'd6:seg = 8'b10000010;
- 4'd7:seg = 8'b11111000;
- 4'd8:seg = 8'b10000000;
- 4'd9:seg = 8'b10010000;
- default:seg = 8'b10001110;
- endcase
- end
- end
- endmodule
复制代码
单纯的对这段代码进行了
仿真,如图结果应该是正确的,但是到板子上就不对了。
怀疑是时序问题,但是对时序问题不知如何下手(可能实际按键输入值key_data与我仿真时给key_data直接赋值不一样?)
又或者是阻塞非阻塞的问题?
-
一周热门 更多>