用std_logic_vector

时间:2015-06-21 20:30:59

标签: vhdl division

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

我有以下内容:

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

总和在一个过程中被多次改变。 当我完成更改" 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);

有没有办法用上面提到的库来计算?谢谢!

1 个答案:

答案 0 :(得分:1)

除非分子是常数,否则除法是在硬件中执行的相当复杂的操作,并且需要IP核才能正确执行。每个FPGA供应商都有分区IP核。

如果您想使用自己的,restoring division algorithm就是您所寻求的。不要被维基百科吓倒,对二进制案例来说这很简单,你应该在网上找到很多例子。

由于你的除数是32位,你需要8位商,电路成本是8位32位减法和多路复用器。您可以在8个连续循环中使用单个减法器/ mux,在管道中使用8个不同的减法器或两者的组合。除非你的时钟非常慢,否则不要试图在一个时钟周期内进行除法。