微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 键盘扫描时使用CASE语句产生的奇怪问题

键盘扫描时使用CASE语句产生的奇怪问题

时间:10-02 整理:3721RD 点击:
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的么?是我们落伍了么、、、

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top