从泛型vhdl中高效地派生参数

从泛型vhdl中高效地派生参数,vhdl,fpga,xilinx,vivado,ghdl,Vhdl,Fpga,Xilinx,Vivado,Ghdl,我的实体上有两个泛型: clk_freq, io_delay: integer 由此,我想计算io_delay所需的周期数,单位为ms。我还想将此计数器值存储在无符号变量中,这样我就不会在整数类型上浪费资源。为此,我实施了以下措施: constant COUNT_MAX_I: integer := integer(ceil(real(io_delay) * 0.001 * real(clk_freq))); constant COUNTER_WIDTH: integer := integer(

我的实体上有两个泛型:

clk_freq, io_delay: integer
由此,我想计算
io_delay
所需的周期数,单位为ms。我还想将此计数器值存储在无符号变量中,这样我就不会在整数类型上浪费资源。为此,我实施了以下措施:

constant COUNT_MAX_I: integer := integer(ceil(real(io_delay) * 0.001 * real(clk_freq)));
constant COUNTER_WIDTH: integer := integer(ceil(log2(real(COUNT_MAX_I))));
constant COUNT_HIGH: integer := unsigned(COUNTER_WIDTH - 1 downto 0) := to_unsigned(COUNT_MAX_I, COUNTER_WIDTH);
然而,只要看看它,它看起来效率非常低。所以我的问题是:


有没有一种更有效的方法可以做到这一点,合成工具会不会因为只在计算其他常数时才使用而放弃
COUNT\u MAX\u I

一般来说
常量
声明本身不会直接产生任何合成逻辑。因此,编写的代码没有任何低效之处。

太好了,谢谢!有没有更直接的方法来实现这一点?它可能不会影响整体解决方案的效率,但似乎效率低下。您所说的“效率低下”到底是什么意思?它只是在精化时计算的一些常量。@当您只想从0..N-1计算计数器的位数时,持久化VHDL往往有点冗长。但是编译器可能花费在详细说明和计算这些常量表达式上的时间可以忽略不计(除非你正在实例化数百万个常量表达式)。如果你想要一些“更干净”的代码,你可以使用一个函数来封装计数器宽度和/或计数高的计算。尽管如此,正如@Tricky所说的,您用来计算任何被详细描述为常量的值的复杂性对于合成/运行时来说都是无关的。事实上,在描述通用硬件时,编写非常复杂的参数计算逻辑是很典型的。@user1155120哪一部分看起来是错误的?OP正在声明一个特定宽度的
无符号
向量常数(数值标准),并为其分配一个常量值。常量标识符列表:子类型指示[:=表达式];(你太匆忙了,没有时间发表你的意见。)@user1155120对。我假设
整数:=
。因为它不符合陈述的其余部分,所以是不正确的。为什么这个问题以“基于意见”结束?请重新打开。问题中没有定义“高效”(或低效)的指标。这表明了模棱两可,只留下了发表意见的余地。“当我使用一个词时,”汉普提·达姆蒂用一种相当轻蔑的语气说,“它的意思正是我选择它的意思,既不多也不少。”这就引发了对“荣耀”一词含义的争论。