ПРОБЛЕМА: Ошибка (10818): не удается определить регистр для y[0] в FSM_LCD.vhd(42), так как он не удерживает свое значение за границей тактовой частоты

Я пытаюсь реализовать конечный автомат с задержкой (500 нс) между каждым переходом состояния с тактовой частотой 50 МГц, поэтому задержка составляет 25 тактов. Обратите внимание, что: EA=текущее состояние PE=сброс следующего состояния "сбрасывается" при 0


Я производил подсчет от y=0 до y=M, но выдает ту же ошибку: «Ошибка (10818): невозможно вывести регистрацию для «y[0]» в FSM_LCD.vhd(42), потому что это не так. удерживать свое значение за пределами часов"

Кто-нибудь знает, как это исправить? Вот немного кода (у него есть еще один процесс, использующий S0 до S14):

architecture automat of FSM_LCD is
    type states is (S0, S1, S2, S3, S4, S5, S6_00, S6_01, S6_10, S6_11, S7_0, S7_1, S8, S9, S10, S11, S12, S13, S14);
    signal EA, PE: states;
    signal clock: std_logic;
    signal reset: std_logic;
    signal y : integer := 0;--y sera' acrescido ate' M de modo a criar um delay
    constant M : integer := 5;--diferenciar valor ao simular e ao executar por hardware
    signal n : integer := 0;

    begin
        clock <= Clk;
        reset <= Rst;
        EA <= S0;--apenas ao ativar o FSM pela primeira vez

        P1: process(clock, reset)
                begin
                    if reset = '0' then 
                        EA <= S3;--S0,S1 e S2 sao setup, ignorar-los ao resetar?
                    elsif clock'event and clock = '1' and y = 0 then 
                        EA <= PE;
--                  elsif y = M then
--                      y <= 0;--estados so' mudarao se n = 0
                    end if;
            end process;

        P2: process(clock)
            begin
                if clock = '1' then
                    y <= (y+1);
                elsif y = M then
                y <= 0;
                end if;
                n <=y;
            end process;

person user3000171    schedule 16.11.2013    source источник


Ответы (1)


Перепишите P2 в виде нормального синхронного (тактируемого) процесса.

Кстати, гораздо лучшее форматирование; намного легче читать, чем предыдущий вопрос.

    P2: process(clock)
        begin
            if rising_edge(clock) then
               if y = m then
                  y <= 0;
               else 
                  y <= y + 1;
               end if;
            end if;
        end process;

будет синтезируемым и, насколько я могу судить, делать то, что вы хотите.

Однако обычно я не использую отдельный процесс для задержки в SM:

Я бы объединил оба процесса и предложил что-то вроде:

    signal delay : integer;

    P1: process(clock, reset)
        begin
           if reset = '0' then 
              -- reset actions here
           elsif rising_edge(clock) then 
              if delay = 0 then
                 EA <= PE;
                 delay <= M;
              else 
                 delay <= delay - 1;
              end if;
           end if;
        end process;

Я бы еще добавил сюда комбинационный процесс, но это уже совсем другая история!

person user_1818839    schedule 16.11.2013
comment
(когда я нажимаю ввод, он добавляет комментарий вместо строки перехода) - person user3000171; 17.11.2013
comment
Я сделал то, что вы мне сказали, но теперь я получаю следующую ошибку: Ошибка (10028): Не удается разрешить несколько постоянных драйверов для сети EA.S0 на FSM_LCD.vhd(29) картинка: puu.sh/5kq38.png - person user3000171; 17.11.2013
comment
Это потому, что у вас есть несколько драйверов для EA. Другой находится чуть выше процесса и не должен быть там. - person user_1818839; 17.11.2013
comment
puu.sh/5ktbW.png Ну, modelsim не хочет его запускать, пишет Case statement варианты охватывают только 4 случая из 81, что я считаю бессмысленным, поскольку Operacao имеет только 2 бита, а не 81 комбинацию, как было сказано... - person user3000171; 17.11.2013
comment
Operacao имеет 2 бита, каждый из которых принимает 9 возможных значений (включая Z, X и т. д. Таким образом, 9 ** 2 = 81 возможный случай ... хорошая работа Modelsim! Добавьте предложение, когда другие, чтобы покрыть другие. Я предлагаю when others => report "Operacao problem!" severity failure - person user_1818839; 17.11.2013