微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 一个有关于case语句的问题

一个有关于case语句的问题

时间:10-02 整理:3721RD 点击:
我在编写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语句自己的特点?求指教

case语句最好用来描述组合逻辑吧,感觉你的coding style 有点问题,本人才疏学浅,提点建议



    谢谢。

    我觉得clk频率太高,是50MHz,多位数据来不及同时翻转所致。把时钟降到1MHz和100KHz,还是不行

你啥意思?是说VCS仿真正确,但是FPGA不正确么?Signaltap是FPGA抓波形工具么?我用Chipscope。
我猜可以这样看看:1. ps2_data_out_d的类型位宽定义的对不对;2. 写一个巨简单的激励,vcs先跑通,确认仿真没有问题;3. FPGA综合的时候注意和这个模块有关的Warning,因为你else不全嘛;4. FPGA上面抓波形看看。一般只要没有出现Latch,仿真和FPGA还是可以达成一致的。



else我写全了



   我写了一个很简单的testbench,测了一下功能仿真,是正确的,但是上板子用signaltap看的时候就有错误;
    我把:else ps2_data_out_d <= 8'b00000000
    改成了:else ps2_data_out_d <= 8'bx,就好了,但是不知道原因是什么。

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

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

网站地图

Top