例如,如果我想使用常量将滤波器系数存储在n抽头FIR滤波器中,那么CONSTANT
声明会使用FPGA触发器将我的值存储在Block RAM或寄存器中吗?也可以使用SIGNAL
来存储系数而不使用RAM单元?CONSTANT声明是否将值存储在Block-RAM中或FPGA的触发器中?
回答
所使用的存储元件:
- 寄存器
- 分布式RAM(LUTRAM)
- 的BlockRAM
...取决于你所选择的VHDL描述和大小。
您应该使用常数而不是信号。此外,使用同步读取操作来推断注册输出可能会有所帮助。
查看综合报告以验证预期的描述。
常量本身并不是“存储”在任何地方 - 它们的值只是简单地代入您使用它们的VHL代码中。
它们的存储位置取决于您如何使用它们以及如何优化代码。
例如,如果将信号乘以常数2,则根本不使用任何元素 - 数据总线将以一种有效地将值左移一位的方式进行简单连接。或者,它们最终可能会以硬连线的方式输入到其他元素(如您的情况下的乘法器)。
无论采用哪种方法,您都应该查看综合结果以彻底了解生成的RTL。
CONSTANT
声明将使用FPGA触发器将我的值存储在Block RAM或寄存器中吗?
无论常量存储在内存块或寄存器,或者如果他们合并到boolen方程取决于具体的实现算法的。让我们在下面的数学公式(不VHDL代码)一看:
y = c_1 * x_1 + c_2 * x_2 + c_3 * x_3 +... + c_N * x_N
N
是系数的数量,x_i
是输入值,并c_i
是常系数。
可以实现由在VHDL /硬件这个等式:
N
并行乘法器和一个加法器树来总结产品;全部在一个时钟周期内完成组合,或者甚至以每个时钟周期一个结果的吞吐量进行流水线处理。或
N
依次执行乘法 - 累加步骤;每个时钟周期有一个乘法累加。
你甚至可以把两者结合起来。
在情况1中,合成器优化以恒定的各倍增:
-
如果系数是二的幂
- 只是布线,
- 此外如果系数的二进制表示包含少量的(5 * x = x + 4 * x),
- 或乘法器硬宏与常数值(VDD,GND)连接到一个输入。
因此,在情况1中不需要存储器或寄存器来存储常量。
在情况2中,合成器将乘法累加步骤映射到硬件乘法器加上加法器。这个乘法器和加法器将被重新用于所有步骤的N
,因此必须在存储器中查找系数。如果系数很多,则使用内存块(Block-RAM)。当前迭代步骤i
将组成内存地址。如果只有少量系数,则它们也可以存储在分布式存储器(LUT-RAM)中或通过布尔方程计算。但即使在这种情况下,系数将而不是映射到触发器,因为它们的值不随时间而改变。
也可以使用
SIGNAL
来存储系数而不使用RAM单元吗?
是的,当然。通过适当的同步描述,它们将被映射到触发器。
很好的答案。我认为我们的答案说同样的话,但你的细节比我的细节多。有多种解答以不同的方式解释是很有帮助的。 –
建立在Paebbels的答案,这取决于。尽管它们也可以在分布式ROM(LUTROM)中实现。这取决于综合工具。例如,Xilinx的Vivado在其综合指南(UG901)中介绍了如何推断RAM/ROM。
为了您的FIR滤波器的例子,你可能有这样的:
type coeff_array is array(natural range<>) of std_logic_vector(17 downto 0);
constant coeffs : coeff_array(0 to N-1) := (x"XXXX", x"XXXX", ..., x"XXXX");
现在,这是否是一个分布式的ROM或RAM取决于工具。 Vivado的快速测试表明,这种结构可以合成一个门海(只是LUT逻辑)。但是,它可以通过被压入的块RAM(又名方框ROM):
signal coeffs : coeff_array(0 to N-1) := (x"XXXX", x"XXXX", ..., x"XXXX");
attribute ROM_STYLE : string;
attribute ROM_STYLE of coeffs : signal is "block";
的装置来推断任何特定类型的结构(LUT中,LUTRAM,LUTROM,块ROM,块RAM)取决于工具有问题。通过综合运行测试来看看你得到了什么。看看你正在使用的合成器的综合指南来弄清楚如何得到你想要的。
- 1. 在FPGA中读取存储器
- 2. 检查表中是否存在值 - 触发器
- 3. 在mysql中的PLSQL触发器中声明变量
- 4. 是否必须将存储过程的返回值声明为out参数?
- 5. 在MySql错误中声明创建触发器的变量
- 6. 如果在删除触发器中的声明 - 失败
- 7. 在存储过程中声明变量
- 8. 在声明中存储信息
- 9. if else在存储过程中声明?
- 10. 如何获取存储过程或触发器中的结果?
- 11. 将触发器中的位向量存储而不是内存 - 凿子
- 12. 在Sql Server和MySQL中存储过程和触发器是否相同?
- 13. 声明存储类
- 14. Javascript:如何将声明的函数存储在变量中?
- 15. 存储过程中的Firebird CASE声明
- 16. Oracle触发器:声明全局变量
- 17. 声明变量MySQL触发器
- 18. 在触发器或存储过程中调用一个REST API在mysql中?
- 19. 如何检查PostgreSQL中是否存在触发器?
- 20. DB2中是否存在“异步触发器”?
- 21. 为SQL存储过程删除或声明新的临时表是否更好?
- 22. mysql触发器存储的触发器已被使用的语句调用存储的触发器
- 23. 如何找出对象中是否存在声明的函数?
- 24. 在全局QList中存储本地声明对象是否安全?
- 25. 将声明存储在数据库中 - 模式建议?
- 26. 是否可以在Puppet中“声明”?
- 27. 在init中声明块是否安全?
- 28. Three.js - 是否可以将BoxGeometries或MeshLambertMaterial存储在数组中
- 29. 在存储函数或触发器问题中,不允许动态SQL,但在mysql上创建触发器时
- 30. 在条件中声明变量是否存在问题?
默认情况下,它们将被转换为逻辑方程,并被烘焙到其他电路中,并隐式存储在目标架构的逻辑基元中。您可以采取措施将常量数据实现为使用分布式内存或块RAM实现的ROM,但这需要您遵循特定的编码风格,以便合成器会推断内存。 –