在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2428|回复: 3

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

[复制链接]
发表于 2008-6-3 16:03:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
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。
怎么会这样的呢?

[ 本帖最后由 hugooh 于 2008-6-3 16:15 编辑 ]
发表于 2008-12-26 13:49:25 | 显示全部楼层
去看你的仿真结果吧.如果仿真结果如实际,就是你代码有问题...你的代码没写全.所以没办法帮你分析.
发表于 2012-12-10 21:31:01 | 显示全部楼层
回复 1# hugooh


    楼主 找到这个问题的原因了没?我也是在编写键盘扫描程序的时候遇到了类似的问题:
   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;


  就正确了。。。。。

不知道是什么原因。
发表于 2012-12-11 14:38:52 | 显示全部楼层
现在大家都是不做仿真,直接上FPGA的么?是我们落伍了么、、、
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-8 00:54 , Processed in 0.026781 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表