case语句分支太多如何优化?
时间:10-02
整理:3721RD
点击:
如下面所示,一共有2000多个分支,请问如何优化以减少资源消耗?
begin
case(index)
12'd0 :cmd_data = {1'b1, 10'h000, 8'h42};
12'd1 :cmd_data = {1'b1, 10'h3DF, 8'h01};
12'd2 :cmd_data = {1'b1, 10'h2A6, 8'h0E};
12'd3 :cmd_data = {1'b1, 10'h2A8, 8'h0E};
12'd4 :cmd_data = {1'b1, 10'h292, 8'h08};
12'd5 :cmd_data = {1'b1, 10'h293, 8'h80};
12'd6 :cmd_data = {1'b1, 10'h294, 8'h00};
12'd7 :cmd_data = {1'b1, 10'h2AB, 8'h06};
12'd8 :cmd_data = {1'b1, 10'h2AC, 8'h73};
12'd9 :cmd_data = {1'b1, 10'h009, 8'h07};
……
12'd2566 :cmd_data = {1'b1, 10'h050, vco_data[23:16]};
12'd2567 :cmd_data = {1'b1, 10'h057, vco_data[15:8]};
12'd2568 :cmd_data = {1'b1, 10'h261, vco_data[7:0]};
endcase
end
begin
case(index)
12'd0 :cmd_data = {1'b1, 10'h000, 8'h42};
12'd1 :cmd_data = {1'b1, 10'h3DF, 8'h01};
12'd2 :cmd_data = {1'b1, 10'h2A6, 8'h0E};
12'd3 :cmd_data = {1'b1, 10'h2A8, 8'h0E};
12'd4 :cmd_data = {1'b1, 10'h292, 8'h08};
12'd5 :cmd_data = {1'b1, 10'h293, 8'h80};
12'd6 :cmd_data = {1'b1, 10'h294, 8'h00};
12'd7 :cmd_data = {1'b1, 10'h2AB, 8'h06};
12'd8 :cmd_data = {1'b1, 10'h2AC, 8'h73};
12'd9 :cmd_data = {1'b1, 10'h009, 8'h07};
……
12'd2566 :cmd_data = {1'b1, 10'h050, vco_data[23:16]};
12'd2567 :cmd_data = {1'b1, 10'h057, vco_data[15:8]};
12'd2568 :cmd_data = {1'b1, 10'h261, vco_data[7:0]};
endcase
end
使用Block RAM吧,将所有数据写到BRAM中,然后根据INDEX读出。
可以这样吗
case(index[11:8])
4'd0: case(index[7:4])
4'd0:case(index[3:0])
4'd0:
4'd1:
……
endcase
4'd1:
……
endcase
4'd1:
……
endcase
我觉得这个本质上和一个case没有太大区别,仍然都是遍历0~2047,使用LUT和FF资源。
去掉高位固定的1,不就是1块BRAM的事情吗
高位的1貌似是寄存器读写使能,1表示写,0表示读
首先要把ROM和MUX_OP部分区分开来。就你上面的例子,最后三个index的低8位就是MUX_OP,其他的就是ROM
猜測應該是某IC的register設定
然後透過SPI之類的介面去讀寫吧
把所有command存到ROM就行了
LUT貌似可以
看起来你的输出可能是常量,也可能是某个变量输入,常量部分可以用ROM,变量部分要用MUX,具体怎么简化取决于地址空间和输出的对应情况。