一个有关于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语句自己的特点?求指教
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
