verilog 键盘控制数码管显示数字程序中的一个always,大家帮看看问题出在哪儿

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-26
verilog中有关显示数码管的问题,很简单~

就那那种丑丑的七个HEX display来说吧,你给他一个七位长的二级制,七位对应display上的七格,0就是亮,1就是不亮。(有的是反过来的)


http://en.wikipedia.org/wiki/Seven-segment_display
拉倒下面看那个表啦
表里的abcdefg对应的是七个segment

code如下

module SevenSegmentDisplayDecoder(ssOut, nIn);
output reg [6:0] ssOut;
input [3:0] nIn;

// ssOut format {g, f, e, d, c, b, a}

always @(nIn)
case (nIn)
4'h0: ssOut = 7'b0111111;
4'h1: ssOut = 7'b0000110;
4'h2: ssOut = 7'b1011011;
4'h3: ssOut = 7'b1001111;
4'h4: ssOut = 7'b1100110;
4'h5: ssOut = 7'b1101101;
4'h6: ssOut = 7'b1111101;
4'h7: ssOut = 7'b0000111;
4'h8: ssOut = 7'b1111111;
4'h9: ssOut = 7'b1100111;
4'hA: ssOut = 7'b1110111;
4'hB: ssOut = 7'b1111100;
4'hC: ssOut = 7'b0111001;
4'hD: ssOut = 7'b1011110;
4'hE: ssOut = 7'b1111001;
4'hF: ssOut = 7'b1110001;
default: ssOut = 7'b1001001;
endcase
endmodule

你没有加按键消抖,用状态切换(状态机),调整按键消抖时间在5MS-10MS就差不多了,这部分程序是用在产品上的,裁减了下,不懂请留言:
input clk; //10MHz
input [1:0]KEY;
reg [1:0] KEY_BUFFER;
reg [2:0] state;
reg[15:0] dly_reg ;
always@(posedge clk)
begin
begin
KEY_BUFFER<=KEY; //读取键盘
case(state)
3'b001: if (KEY_BUFFER==2'b01) 判断
begin
state <= 3'b011;
end //
else if(KEY_BUFFER==2'b10)
begin
state <= 3'b011;
end //
else state <= 3'b001;
3'b011:if(dly_reg>=16'b1100001101010000) //延时
begin
state <= 3'b100;
dly_reg <=16'd0;
end
else
begin
dly_reg<=dly_reg+1'b1;
end
3'b100: if ((KEY_BUFFER==2'b11)) //在判断
begin
;
end

else if ((KEY_BUFFER==2'b11))//--
begin
;
else
state <= 3'b101;
3'b101: begin state <= 3'b001;end //
endcase
end
end

电平触发和边沿触发不能同时在always语句内进行判断,所以将key1 or key2 or key3 or key4 or删除就不会出现这个错误了

always @ ( posedge clk or negedge rst_n),改成这个,时序逻辑里面不需要其他的敏感变量

楼主用case语句代替吧,这样看着累,而且运行容易出错