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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 11413|回复: 6

[求助] 一个有关于case语句的问题

[复制链接]
发表于 2012-12-10 21:33:05 | 显示全部楼层 |阅读模式

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

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

x
我在编写PS2键盘解码程序的时候遇到了一个有关于case语句的问题:
   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;


  就正确了。。。。。

不知道是什么原因。是不是case语句自己的特点?求指教
发表于 2012-12-11 07:53:06 | 显示全部楼层
case语句最好用来描述组合逻辑吧,感觉你的coding style 有点问题,本人才疏学浅,提点建议~~
 楼主| 发表于 2012-12-11 09:07:37 | 显示全部楼层
本帖最后由 lvlv2011 于 2012-12-11 11:37 编辑

回复 2# lvmingfiona


    谢谢。


    我觉得clk频率太高,是50MHz,多位数据来不及同时翻转所致。把时钟降到1MHz和100KHz,还是不行
发表于 2012-12-11 14:35:33 | 显示全部楼层
你啥意思?是说VCS仿真正确,但是FPGA不正确么?Signaltap是FPGA抓波形工具么?我用Chipscope。
我猜可以这样看看:1. ps2_data_out_d的类型位宽定义的对不对;2. 写一个巨简单的激励,vcs先跑通,确认仿真没有问题;3. FPGA综合的时候注意和这个模块有关的Warning,因为你else不全嘛;4. FPGA上面抓波形看看。一般只要没有出现Latch,仿真和FPGA还是可以达成一致的。
 楼主| 发表于 2012-12-11 17:09:11 | 显示全部楼层
回复 4# elec_zxm


else我写全了
 楼主| 发表于 2012-12-11 21:50:46 | 显示全部楼层
回复 4# elec_zxm


   我写了一个很简单的testbench,测了一下功能仿真,是正确的,但是上板子用signaltap看的时候就有错误;

    我把:else ps2_data_out_d <= 8'b00000000

    改成了:else ps2_data_out_d <= 8'bx,就好了,但是不知道原因是什么。
发表于 2012-12-12 14:00:35 | 显示全部楼层
if( !RSTn ) ps2_data_out_d <= 8'b00000000;
else if(isDone)
else ps2_data_out_d <= 8'b00000000;
你这三句话就有问题,应该是除了isDone情况外都是ps2_data_out_d  = 8'b00000000,我觉得是这样你自己看看R3B8
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-23 18:46 , Processed in 0.032326 second(s), 9 queries , Gzip On, Redis On.

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