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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5971|回复: 16

[求助] 关于case的问题

[复制链接]
发表于 2012-3-19 20:44:30 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 lyz5432 于 2012-3-19 20:45 编辑

我最近在做一个编码器,用case语句做的,不过条件很多,有64个判断
case(intermediate8)
64'hFFFFFFFFFFFFFFFF: out=6'd0;
64'h7FFFFFFFFFFFFFFF:   out=6'd1;
64'h3FFFFFFFFFFFFFFF:   out=6'd2;
64'h1FFFFFFFFFFFFFFF:   out=6'd3;
64'h0FFFFFFFFFFFFFFF:   out=6'd4;
.
.
.
.
64'h0000000000000001:  out=6'd63;
default:  out=6'd0;
endcase
总共有64个判断项,所以综合出来的电路占用资源多,延时大,求大神指导,如何对这种case语句进行优化
发表于 2012-3-20 00:19:03 | 显示全部楼层
本帖最后由 lucien_1986 于 2012-3-20 00:22 编辑

回复 1# lyz5432

     你可以考虑将这个大的case语句拆成四个小的case语句,再用一个加法器就可以完成了,应该对你有帮助。代码实现如下:


case(intermediate8[63:48])
16'hFFFF: out1=6'd0;
16'h7FFF:   out1=6'd1;
16'h3FFF:   out1=6'd2;
16'h1FFF:   out1=6'd3;
16'h0FFF:   out1=6'd4;
16'h07FF: out1=6'd5;
16'h03FF:   out1=6'd6;
16'h01FF:   out1=6'd7;
16'h00FF: out1=6'd8;
16'h007F:   out1=6'd9;
16'h003F:   out1=6'd10;
16'h001F:   out1=6'd11;
16'h000F:   out1=6'd12;
16'h0007: out1=6'd13;
16'h0003:   out1=6'd14;
16'h0001:   out1=6'd15;.
default:    out1=6'd16;
endcase

case(intermediate8[47:32])
16'hFFFF: out2=6'd0;
16'h7FFF:   out2=6'd1;
16'h3FFF:   out2=6'd2;
16'h1FFF:   out2=6'd3;
16'h0FFF:   out2=6'd4;
16'h07FF: out2=6'd5;
16'h03FF:   out2=6'd6;
16'h01FF:   out2=6'd7;
16'h00FF: out2=6'd8;
16'h007F:   out2=6'd9;
16'h003F:   out2=6'd10;
16'h001F:   out2=6'd11;
16'h000F:   out2=6'd12;
16'h0007: out2=6'd13;
16'h0003:   out2=6'd14;
16'h0001:   out2=6'd15;.
default:    out1=6'd16;
endcase

case(intermediate8[31:16])
16'hFFFF: out3=6'd0;
16'h7FFF:   out3=6'd1;
16'h3FFF:   out3=6'd2;
16'h1FFF:   out3=6'd3;
16'h0FFF:   out3=6'd4;
16'h07FF: out3=6'd5;
16'h03FF:   out3=6'd6;
16'h01FF:   out3=6'd7;
16'h00FF: out3=6'd8;
16'h007F:   out3=6'd9;
16'h003F:   out3=6'd10;
16'h001F:   out3=6'd11;
16'h000F:   out3=6'd12;
16'h0007: out3=6'd13;
16'h0003:   out3=6'd14;
16'h0001:   out3=6'd15;.
default:    out3=6'd16;
endcase


case(intermediate8[15:0])
16'hFFFF: out4=6'd0;
16'h7FFF:   out4=6'd1;
16'h3FFF:   out4=6'd2;
16'h1FFF:   out4=6'd3;
16'h0FFF:   out4=6'd4;
16'h07FF: out4=6'd5;
16'h03FF:   out4=6'd6;
16'h01FF:   out4=6'd7;
16'h00FF: out4=6'd8;
16'h007F:   out4=6'd9;
16'h003F:   out4=6'd10;
16'h001F:   out4=6'd11;
16'h000F:   out4=6'd12;
16'h0007: out4=6'd13;
16'h0003:   out4=6'd14;
16'h0001:   out4=6'd15;.
default:    out4=6'd0;
endcase

assign out = out1 + out2 + out3 + out4;
发表于 2012-3-20 08:18:46 | 显示全部楼层
发表于 2012-3-20 09:10:37 | 显示全部楼层
我看你64个case就用了64位数据,可不可以将它转换成二进制编码在进行case呢?
 楼主| 发表于 2012-3-20 09:23:05 | 显示全部楼层
回复 4# SKILLER


   我这个本身就是将其转化为二进制的
 楼主| 发表于 2012-3-20 09:29:23 | 显示全部楼层
回复 3# bluray2005

请问错在哪?
 楼主| 发表于 2012-3-20 09:31:59 | 显示全部楼层
回复 2# lucien_1986

谢谢
发表于 2012-3-20 11:13:46 | 显示全部楼层
本帖最后由 vongy 于 2012-3-20 12:00 编辑

你这样写实在太累人
换个写法
case(1'b1)
intermediate8[63]:  out = 6'd0;
intermediate8[62]:  out = 6'd1;
............
endcase
当然了,这样写还不能减小电路的面积和延时。

你可以手动优化。
从你给出的数据看,其实可以将问题转化成【从最高位开始找1,这个1出现在哪个位置】, 比如7FFFFFFFFFFFFFFF最高位的1出现在第62位,那么63-62==1即可

wire [63:0] temp = intermediate8;
wire temp5_en = |temp[63:32];
wire[31:0] temp5 = temp5_en ? temp[63:32] : temp[31:0];
wire temp4_en = |temp5[31:16];
wire[15:0] temp4 = temp4_en ? temp5[31:16] : temp5[15:0];
wire temp3_en = |temp4[15:8];
wire[7:0] temp3 = temp3_en ? temp4[15:8] : temp4[7:0];
wire temp2_en = |temp3[7:4];
wire[3:0] temp2 = temp2_en ? temp3[7:4] : temp3[3:0];
wire temp1_en = |temp2[3:2];
wire[1:0] temp1 = temp1_en ? temp2[3:2] : temp2[1:0];
wire  temp0_en = temp1[1];

wire [5:0] out_temp = 6'd63 - {temp5_en, temp4_en, temp3_en, temp2_en, temp1_en, temp0_en};

assign out =  (intermediate8==64'b0) ? 6'd0 : out_temp;
发表于 2012-3-20 23:21:28 | 显示全部楼层
都没仔细看楼主题目。。。楼上也错
发表于 2012-3-21 01:25:15 | 显示全部楼层
回复 3# bluray2005


    我的方法哪里错了啊?求指点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-23 19:19 , Processed in 0.028400 second(s), 10 queries , Gzip On, Redis On.

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