2013-10-14 4 views
0

Я пытаюсь построить простой генератор импульсов для CPLD в VHDL. У меня есть серия простых , если операторов, которые должны выполнять определенные задачи в зависимости от состояния входа шины, подключенной к модулю.Сигнал не изменяется в iSim

entity pulse_gen is 
Port (CLK : in STD_LOGIC; 
     pulse_sel_in : in STD_LOGIC_VECTOR (2 downto 0); 
     pulse_r : in STD_LOGIC; 
     pulse_s : inout STD_LOGIC); 
end pulse_gen; 

architecture Behavioral of pulse_gen is 

signal pulse_sel: std_logic_vector (2 downto 0); 
signal pulse_count: integer; 
signal pulse_length: integer range 0 to 100; 
signal pulse_a: std_logic; 

begin 

pulse_sel <= pulse_sel_in; 

pulse: process(CLK) is 
begin 
    if(pulse_sel > "000" and pulse_a = '0') then 
     pulse_s <= '1'; 
     pulse_a <= '1'; 
    end if; 

    if(pulse_a = '1' and pulse_count < pulse_length) then 
     pulse_count <= pulse_count + 1; 
    end if; 

    if(pulse_a = '1' and pulse_count = pulse_length) then 
     pulse_s <= '0'; 
     pulse_a <= '0'; 
     pulse_count <= 0; 
    end if; 
end process; 

set_max: process(CLK) is 
begin 
if (CLK'event) then 
    case pulse_sel is 
     when "001" => pulse_length <= 1; 
     when "010" => pulse_length <= 10; 
     when "011" => pulse_length <= 100; 
     when others => null; 
    end case; 
end if; 
end process; 

end Behavioral; 

При выполнении этого модуля в Isim, заставляя _pulse_s_ автобус ни к чему, но 000 должен вызвать первый, если оператор в процессе импульса, который он делает. Однако в симуляции сигнал _pulse_a_ никогда не устанавливается на высокий уровень логики. Теперь я часами пишу этот модуль по-разному, но я совершенно не знаю, почему этого не происходит. Я относительно новичок в VHDL, поэтому я задаюсь вопросом, есть ли какой-то синтаксис или процедурная ошибка, которую я просто полностью потерял. Есть идеи?

+0

Вы пробовали все в процессе 'pulse' внутри' if rising_edge (CLK) '? вы не использовали 'CLK' в этом процессе. – Thanushan

+0

Спасибо, я только что попробовал это сейчас, и это все равно не имеет значения. При форсировании входа 'pulse_sel_in' до логического максимума устанавливается' pulse_length', а 'pulse_s' переходит на логическую высоту, но до сих пор не работает для' pulse_a'. –

ответ

2

@Philippe является правильным. Вы должны назначить pulse_a для некоторого значения, 0 или 1, когда вы определяете сигнал. Добавьте это: signal pulse_a: std_logic: = '0'; и он будет работать.

Вы сказали, что заставляете его сидеть в iSim. Что ж? Когда вы заставляете его низко, он остается низким! Таким образом, ваш код не сможет его изменить!

РЕДАКТИРОВАТЬ: Вам также следует назначить pulse_count для некоторого начального значения.

+0

Спасибо! Как будто это так с iSim. Я только использовал Modelsim ранее, и если вы наложите там сигнал, он изменится в зависимости от вашего кода. Weird. –

2

Начальное значение сигнала - «U». Ни одно из условий, равных «1» или равное «0», не действует, поэтому новое значение не назначается.

+0

Правильно, поскольку я буду продвигать его дальше в разработке модуля. Однако проблема возникает, когда сигнал принудительно понижается в iSim, что удовлетворяет условиям для этого первого, если состояние. –

 Смежные вопросы

  • Нет связанных вопросов^_^