将常数除以 std_logic_vector

Dividing a constant by an std_logic_vector

我想知道以下的正确划分方法:

我有以下内容:

constant freq : integer := 50000000;
constant minute : integer := 60;
...
variable sum : std_logic_vector(31 downto 0) := (others => '0');

sum 在一个进程中多次更改。 完成更改后 "sum",我需要计算:freq*minute / sum.

我不能使用 numeric_std,我被要求只能使用 std_logic_unsigned,std_logic_arith(我知道,他们不好,但裸露它)。

我想我应该做整数除法,所以我尝试使用以下方法但结果不正确:

suminteger := conv_integer(sum);
RPM_integer := (minute * freq) / suminteger; -- result is always less than 256
RPM_int <= conv_std_logic_vector(RPM_integer,8);

有什么方法可以用上面提到的库来计算吗?谢谢!

除法是在硬件中执行的相当复杂的操作,需要 IP 核才能正确执行,即使分子是常数。每个 FPGA 供应商都有分部 IP 内核。

如果您想使用自己的,restoring division algorithm 就是您要找的。不要被维基百科吓倒,二进制情况下它很简单,你应该在网上找到很多例子。

由于您的除数是 32 位并且您需要 8 位商,因此电路成本是 8 个 32 位减法和多路复用器。您可以在 8 个连续周期中使用单个 subtractor/mux,在管道中使用 8 个不同的周期,或者两者的组合。不要尝试在单个时钟周期内执行除法,除非你的时钟很慢。