键盘扫描时使用CASE语句产生的奇怪问题
有如下语句:
input clk; //时钟clk为1.3KHz。
reg [1:0] clock;
always @(posedge clk)begin
if(clock<2'b11)
clock<=2'b00;
else
clock<=clock+1;
end
always @(posedge clk)
case(clock)
0:scan<=4'b0001;
1:scan<=4'b0000;
2:scan<=4'b0000;
3:scan<=4'b0000;
endcase
下面把case语句换成下面这个:
always @(posedge clk)
case(clock)
0:scan<=4'b0001;
1:scan<=4'b0010;
2:scan<=4'b0100;
3:scan<=4'b1000;
endcase
按我的理解,前面那个程序scan[0]是方波,其他的是0;后面那个程序出来的四位scan都是方波,从而实现扫描。我下载后发现两个语句的效果是一样的,都产生4组占空比1:3的方波信号。很晕的。我用的是xilinx spartanII。
怎么会这样的呢?
去看你的仿真结果吧.如果仿真结果如实际,就是你代码有问题...你的代码没写全.所以没办法帮你分析.
小编 找到这个问题的原因了没?我也是在编写键盘扫描程序的时候遇到了类似的问题:
always @( posedge clk or negedge RSTn )
if( !RSTn ) ps2_data_out_d <= 8'b00000000;
else if(isDone)
case(rData)
8'h1c: ps2_data_out_d <= 8'b01100001; // A 8'd97
8'h32: ps2_data_out_d <= 8'b01100010; // B 8'd98
8'h21: ps2_data_out_d <= 8'b01100011; // C 8'd99
8'h23: ps2_data_out_d <= 8'b01100100; // D 8'd100
default: ps2_data_out_d <= 8'b00000000;
endcase
else ps2_data_out_d <= 8'b00000000;
// rData是我通过译码PS2接口的键盘按键断码,case中对ps2_data_out_d的赋值是A~D的ASCII码。
运行并用siganltap查看,只有当rData=8'h23的时候,ps2_data_out_d的ps2_data_out_d[2]=1、其余位为0。此外,无论rData为什么值,ps2_data_out_d 都是0;
受ps2_data_out_d的启发,换成这个代码,就是把赋值的值换成独热码(每一位都不一样的):
always @( posedge clk or negedge RSTn )
if( !RSTn ) ps2_data_out_d <= 8'b00000000;
else if(isDone)
case(rData)
8'h1c: ps2_data_out_d <= 8'b00000001;
8'h32: ps2_data_out_d <= 8'b00000010;
8'h21: ps2_data_out_d <= 8'b00000100;
8'h23: ps2_data_out_d <= 8'b00001000;
default: ps2_data_out_d <= 8'b00000000;
endcase
else ps2_data_out_d <= 8'b00000000;
就正确了。
不知道是什么原因。
现在大家都是不做仿真,直接上FPGA的么?是我们落伍了么、、、
