使用VHDL的算法中的逻辑输出错误

时间:2016-06-29 17:31:34

标签: vhdl primes quartus

我正在尝试做一个验证素数的算法。要做到这一点,我必须使用RTL设计方法制作电路,我使用下面的算法来获得素数:

int prime (int x) {
int i, div;
div = 0;
    for (i = 1; i <= x; i++){
        if (mod(x, i) == 0)
        div++;
    }
if (div == 2)
return 1; // PRIME
else
return 0; // NPRIME
}

为了实现这个解决方案,我创建了两个块:Datapath和Control,如下图所示:

enter image description here

我的数据路径有4个实习生块:

for_reg --> register that control the loop for of the prime algorithm (have a flag to indicate when the loop ends)
buffer  --> Makes the output equal the input
modulo  --> Get the mod of the div from the two inputs
comp    --> Compare the output from modulo (if equal 0 the output of compare goes 1 else 0).

我的控制工作比较输入C (input C <= output_comp),如果比较值等于1我增加信号div,此后我验证输入标志的值,如果等于1我进入完成状态状态机验证信号div的值是否等于2,如果是控制的输出得到值1,如果没有得到值0(1 - 素数,0 - 不是素数)。

我的问题是控制块的输出始终保持为0.我已经模拟了所有分隔的块,它似乎正常工作。

enter image description here

我认为错误发生在for_reg或控制块中,因为其他块很简单,就像我之前说的那样,它工作正常。

在mod模块的模拟下面:

enter image description here

PS:我已经使用状态机创建了这个块,当它进入最终状态时会自动返回到第一个状态,所以这是因为输出总是保持0和3。

来自control和for_reg的代码:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.std_logic_arith.ALL;

ENTITY verifica_primo_control IS
  PORT (
       i_CLK    : IN STD_ULOGIC;
       i_RST    : IN STD_LOGIC;
       i_C      : IN STD_LOGIC;
       i_FLAG   : IN STD_LOGIC;
       o_DOUT   : OUT STD_LOGIC
      );     
END verifica_primo_control;

ARCHITECTURE arch_1 OF verifica_primo_control IS
  TYPE state_type IS (s0, s1, s2, s3);
  SIGNAL stateT : state_type;
  SIGNAL w_AUX : integer;
BEGIN
  PROCESS(i_CLK)
  BEGIN
    IF rising_edge(i_CLK) THEN
      IF (i_RST = '1') THEN
        stateT <= s0;
        w_aux <= 0;
      ELSE
        CASE stateT IS
          when s0 => IF (i_C = '1') THEN
                        stateT <= s1;
                     ELSE
                        stateT <= s3;
                     END IF;
          when s1 => w_AUX <= w_AUX +1;
                     if (i_FLAG = '1') then 
                       stateT <= s2;
                     else 
                       stateT <= s0;
                     end if;
          when s2 => IF (w_AUX = 2) THEN
                        o_DOUT <= '1';
                     ELSE 
                        o_DOUT <= '0';
                     END IF;
          when s3 => 
                    if (i_FLAG = '1') then 
                       stateT <= s2;
                     else 
                       stateT <= s0;
                     end if;
        END CASE;
      END IF;
    END IF;
  END PROCESS;


END arch_1;

enter image description here

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.std_logic_arith.ALL;

ENTITY for_reg IS
  PORT (
      i_CLR  : IN STD_LOGIC;         
      i_CLK  : IN STD_ULOGIC;        
      i_X    : IN UNSIGNED (7 downto 0); -- number input to verify if its prime
      i_I    : IN UNSIGNED (7 downto 0) ;        
      o_FLAG : OUT STD_LOGIC;
      o_II   : OUT UNSIGNED (7 downto 0)
      );     
END for_reg;

ARCHITECTURE arch_1 OF for_reg IS
signal w_AUX : unsigned (7 downto 0);
BEGIN
  PROCESS(i_CLK)
  BEGIN
    IF rising_edge(i_CLK) THEN
      IF (i_CLR = '1') THEN
        o_II <= "00000000";
        w_AUX <= "00000000";
        o_FLAG <='0';
      ELSIF (i_CLR ='0' AND i_I < i_X) THEN
        w_AUX <= i_I;
        o_II <= w_AUX + "00000001";
        o_FLAG <='0';
      ELSIF (i_CLR = '0' AND i_I = i_X) THEN
        o_II <= i_I;
        o_FLAG <= '1';
      END IF;
    END IF;
  END PROCESS;


END arch_1;

enter image description here

就像我之前说的那样,我相信错误是在这两个块中的一个,我相信代码可以验证错误在哪里。如果这还不足以让MCVE警告我将使用验证错误所需的其他代码更新帖子。

我正在使用quartus II模拟器,因此我没有测试版本,我手动输入所有测试信号。

0 个答案:

没有答案