将常数除以 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 个不同的周期,或者两者的组合。不要尝试在单个时钟周期内执行除法,除非你的时钟很慢。
我想知道以下的正确划分方法:
我有以下内容:
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 个不同的周期,或者两者的组合。不要尝试在单个时钟周期内执行除法,除非你的时钟很慢。