2015-02-05 2 views
-1

Добрый вечер всем. Я начну, сказав, что я очень новичок в VHDL. У меня есть проект, который просит меня смоделировать счетчик обновления, который сделан Motorola в VHDL (MC14510B для любого любопытного).VHDL Up/Down Counter

Из таблицы видно, что если входной PE (предустановленное разрешение) переключается высоко, то 4 предустановленных значения на входном контакте p4 ... p1 передаются прямо на выход q4 ... q1.

По какой-то причине, мой код отказывается компилироваться, метание ошибка Ошибка: COMP96_0143: MC14510B.vhd: (56, 13): Объект "р" не может быть написана. Я использую Aldec как компилятор и понятия не имею, что я делаю неправильно. Я не хочу писать на вход, я хочу написать qtemp со значениями, которые хранятся в p.

Может ли кто-нибудь увидеть, что я испортил? В инструкции процесса оператор else в главном if-else - это то, что дает мне проблемы (строка p < = qtemp). Любая помощь будет чрезвычайно оценена.

library IEEE; 
use IEEE.STD_LOGIC_1164.all; 
use IEEE.std_logic_unsigned.all; 

entity MC14510B is 
    port (
    signal pe  : in std_logic; 
    signal ci_not : inout std_logic; 
    signal reset : in std_logic; 
    signal updown : in std_logic; 
    signal clk : in std_logic; 
    signal p  : in std_logic_vector (3 downto 0); 
    signal q  : out std_logic_vector(3 downto 0); 
    signal co_not : inout std_logic 
    ); 
end; 

architecture myarch of MC14510B is 
begin 

    process(pe, ci_not, reset, updown, clk) 
    variable qtemp : std_logic_vector(3 downto 0); 
    variable cotemp : std_logic; 
    begin 
    if reset = '1' then          --reset condition 
     qtemp := "0000"; 
    elsif clk'event and updown = '1' and ci_not = '1' then --count up 
     if qtemp < 15 then 
     qtemp := qtemp + 1; 
     cotemp := '1'; 
     else 
     qtemp := "0000"; 
     cotemp := '0'; 
     end if; 
    elsif clk'event and updown = '0' and ci_not = '1' then --count down 
     if qtemp > 0 then 
     qtemp := qtemp - 1; 
     cotemp := '1'; 
     else 
     qtemp := "0000"; 
     cotemp := '0'; 
     end if; 
    elsif ci_not = '0' then 
     qtemp := "1010"; 
     cotemp := '1'; 
    else 
     if pe = '1' then          --enable preset 
     p  <= qtemp;         --output = input presets 
     cotemp := '1'; 
     else 
     qtemp := qtemp;         --output = output 
     cotemp := '1'; 
     end if; 
    end if; 
    q  <= qtemp; 
    co_not <= cotemp; 
    end process; 
end myarch; 

ответ

0

Вы, кажется, есть задание qtemp обернулись, где у вас есть p := qtemp и должны иметь qtemp <= p. Также похоже, что p должен быть в списке чувствительности для этого процесса.

Затем ваш код анализирует. Нет гарантий, что это в противном случае правильно.

p объявлен в режиме, вы не можете писать на него.

+0

Список чувствительности? Боюсь, я не знаю, что это значит:/ –

+0

Отличная возможность изучить фундаментальную концепцию VHDL; попробуйте здесь: [Список чувствительности Google VHDL] (http://www.google.dk/#q=vhdl%20sensitivity%20list) –

+0

В скобках бит: process (pe, ci_not, reset, updown, clk) ' список чувствительности. В конце процесса подразумевается выражение 'wait on pe, ci_not, reset, updown, clk;'. Он приостанавливает выполнение процесса до тех пор, пока транзакция не произойдет на одном из этих сигналов. Наряду с часами все, что влияет на асинхронное назначение, должно быть в списке чувствительности. В этом случае, что произойдет, если P изменится, а PE - 1? Без P в списке чувствительности изменение будет пропущено. – user1155120