如何解决vhdl上变量之间的划分问题?

时间:2016-11-22 20:18:44

标签: vhdl

我正在使用基于DDS方法(直接数字合成)的函数发生器项目在Basys 2中实现,但是当我运行Synthesize时,我得到了一个

ERROR ("ERROR:Xst:769 - "C:/Users/dell6410/Desktop/DDS    VHDL/DDS_VHDL/triangularwave.vhd"
line 55: Operator <DIVIDE> must have constant operands or first operand must be power of 2")` 

错误是由两个变量整数之间的划分引起的,这不允许我生成编程文件。有人知道解决方案吗?

n :in integer; 

variable count:integer:=0;

op <= count*255 / n;

1 个答案:

答案 0 :(得分:0)

从Xilinx支持document(第183页)复制,只能在以下情况下实现分频器,

  

除数是常数,是2的幂。

显然,您的n不是常数。在这样的划分中,硬件难以在一个周期内有效地确定resule。

在通用分频器中,最好将除法实现为每个时钟实例减去数字的过程。

signal quotient: integer := 0;
signal remainder: integer := 0;
signal division_complete: std_logic := '0';
-- Begin architecture
process(clk, dividend, divisor, quotient, remainder)
  variable n_quotient: integer := 0;
  variable n_remainder: integer := 0;
  variable n_division_complete: std_logic := '0';
begin
  n_quotient := quotient;
  n_remainder := remainder;
  n_division_complete := '0';
  if (dividend < divisor) then
    -- End of division
    n_division_complete := '1';
  elif (division_complete = '1') then
    -- Start of next division
    n_division_complete := '1';
    n_quotient := 0;
  else
    -- Division in progress
    n_quotient := n_quotient + 1;
    n_remainder := dividend - divisor;
  end if;
  if (clk'event and clk = '1') then
    quotient <= n_quotient;
    remainder <= n_remainder;
    division_complete <= n_division_complete;
  end if;
end process;

如果上述同步解决方案不可行,则需要将输入限制为上述Xilinx条件。如果你的除法是2的幂的简单除法,你可以使用>>(右移)运算符。