Тактовый 8-битный детектор простых чисел - PullRequest
0 голосов
/ 01 июня 2019

введите код здесь. Я разрабатываю 8-битный детектор без знака простого числа в VHDL, синтезируемый, для проекта. Цель состоит в том, чтобы не только избегать использования каких-либо циклов или защелок, но и ограничить его только FPGA 50 МГц. часы.

Мы пытались использовать часы на основе последовательных делений, но такая реализация не соответствует требованиям синхронизации в Quartus Timequest, когда мы пытаемся вывести результат. Когда мы комментируем вывод, он, кажется, работает просто отлично, и мы не до конца понимаем, почему.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity primeChecker is
    generic(NumCyclesWait :integer := 1000);
    port(   clock: in  std_logic;
            enable: in  std_logic;
            reset   : in  std_logic;
            input   : in std_logic_vector(7 downto 0);
            output  : out std_logic_vector(7 downto 0);
            isPrime   : out std_logic_vector(0 downto 0));
end primeChecker;

architecture arch of primeChecker is

    signal count: integer := 0;
    signal numToCheck : integer := 0;
    signal prime, primeOut : integer := 1;
    signal s_out: unsigned(7 downto 0);
    signal div : integer := 2;
    signal clockCount : unsigned(0 downto 0) := "0";

begin

    numToCheck <= to_integer(unsigned(input));

    process(clock)
    begin
        if(rising_edge(clock)) then
                if(count = NumCyclesWait) then

                    if ((numToCheck = 1) OR (numToCheck = 0)) then

                        prime <= 0;     --Not Prime

                    elsif(numToCheck > 2 and prime =1 and div < numToCheck) then
                            if (numToCheck rem div = 0) then
                                -- if the number is divisible
                                prime <= 0; 
                            end if;
                            div <= div +1;

                    end if;
                else

                    count <= count +1;

                end if;

                if(enable = '1') then
                    s_out <= to_unsigned(numToCheck,8);
                    count <= 0;
                    div <= 2;
                    primeOut <= prime;
                    prime <= 1;
                else
                    s_out <= s_out;
                end if;
        end if;



    end process;



    isPrime <= std_logic_vector(to_unsigned(primeOut,1));
    output <= std_logic_vector(s_out);

end arch ; -- arch

Я ожидаю, что он не вызовет ошибку "Требование к времени не выполнено" и что он будет полностью скомпилирован.

1 Ответ

1 голос
/ 01 июня 2019

Для быстрого отклика с постоянным временем я бы выбрал другой подход. Ваша задача - иметь дело только с восьмибитными числами, и ваша FPGA, вероятно, имеет более чем достаточно ОЗУ для настройки 8-битной таблицы поиска простых чисел, где каждая запись таблицы просто указывает, является ли ее индекс простым числом:

type prime_numbers_type is array(0 to 255) of std_ulogic;
constant prime_numbers    : prime_numbers_type :=
                            ( '0', '0', '1', '1', '0', '1', ... );

Это делает жизненно важную часть вашего детектора простых чисел слишком простой:

is_prime <= prime_numbers(to_integer(unsigned(num_to_check)));

Я бы, вероятно, просто написал небольшой Tcl-скрипт для настройки таблицы поиска.

...