VHDL中Case语句与数组查找:哪种更节省FPGA LUT资源?
FPGA中Case语句与常量数组实现只读数据的LUT资源对比
问题描述
我正在对项目进行优化,将部分仅含少量输入的函数转换为只读数据。现咨询:Case语句(或进程外的with语句)与常量数组两种实现方式,哪种综合后占用的FPGA LUT资源更少?
Case语句实现示例
case abs_angle is when 0 to 5 => ratio := 0; -- sin(0) when 6 to 15 => ratio := 2; -- sin(10) when 16 to 25 => ratio := 4; -- sin(20) when 26 to 35 => ratio := 5; -- sin(30) when 36 to 50 => ratio := 6; -- sin(45) when 51 to 65 => ratio := 8; -- sin(60) when 66 to 80 => ratio := 9; -- sin(75) when others => ratio := 10; -- sin(90) end case;
常量数组实现示例
type sin_ratio_lut_t is array (0 to 90) of integer; constant SIN_RATIO_LUT : sin_ratio_lut_t := ( -- Index 0-5 0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, -- Index 6-15 6 => 2, 7 => 2, 8 => 2, 9 => 2, 10 => 2, 11 => 2, 12 => 2, 13 => 2, 14 => 2, 15 => 2, -- Index 16-25 16 => 4, 17 => 4, 18 => 4, 19 => 4, 20 => 4, 21 => 4, 22 => 4, 23 => 4, 24 => 4, 25 => 4, -- Index 26-35 26 => 5, 27 => 5, 28 => 5, 29 => 5, 30 => 5, 31 => 5, 32 => 5, 33 => 5, 34 => 5, 35 => 5, -- Index 36-50 36 => 6, 37 => 6, 38 => 6, 39 => 6, 40 => 6, 41 => 6, 42 => 6, 43 => 6, 44 => 6, 45 => 6, 46 => 6, 47 => 6, 48 => 6, 49 => 6, 50 => 6, -- Index 51-65 51 => 8, 52 => 8, 53 => 8, 54 => 8, 55 => 8, 56 => 8, 57 => 8, 58 => 8, 59 => 8, 60 => 8, 61 => 8, 62 => 8, 63 => 8, 64 => 8, 65 => 8, -- Index 66-80 66 => 9, 67 => 9, 68 => 9, 69 => 9, 70 => 9, 71 => 9, 72 => 9, 73 => 9, 74 => 9, 75 => 9, 76 => 9, 77 => 9, 78 => 9, 79 => 9, 80 => 9, -- Index 81-90 81 => 10, 82 => 10, 83 => 10, 84 => 10, 85 => 10, 86 => 10, 87 => 10, 88 => 10, 89 => 10, 90 => 10, others => 0 );
回答
在多数现代FPGA综合器(如Xilinx Vivado、Intel Quartus)中,这两种实现方式综合后的LUT资源占用几乎没有差异。
原因如下:
- 综合器能精准识别这两种写法的本质:都是实现一个输入为
abs_angle、输出对应ratio值的查找表(LUT)功能。 - 以你的示例来看,输入范围是0-90(7位宽),输出是0-10(4位宽),综合器会自动把Case语句中的范围划分映射成等价的LUT结构,和常量数组的实现逻辑完全一致。
- 极少数极端场景(比如特定综合器的优化策略差异、非常特殊的非连续范围划分)可能出现细微差别,但绝大多数项目场景下,两者的资源占用完全相同。
额外建议
- 代码可读性层面,常量数组更直观,尤其是需要扩展或修改数据时,直接修改数组元素即可;Case语句在范围划分明确时也清晰,但数据量大时维护成本更高。
- 实际项目中无需纠结这两种写法的资源差异,优先选择更易维护的实现方式;若仍有疑虑,可查看综合后的资源利用率报告(如Vivado的Utilization Report)确认具体占用情况。
内容的提问来源于stack exchange,提问作者Tears
相关产品推荐
相关产品推荐

