Сигнал не изменяет состояние в iSim

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

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, должно инициировать первый оператор if в импульсном процессе, который он выполняет. Однако в симуляции сигнал _pulse_a_ никогда не устанавливается на высокий логический уровень. Сейчас я часами писал этот модуль по-разному, но совершенно не представляю, почему этого не происходит. Я относительно новичок в VHDL, поэтому мне интересно, есть ли какой-то синтаксис или процедурная ошибка, которую я просто полностью пропускаю. Есть идеи?

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам