2014-11-06 2 views
0

Итак, я использую VHDL для создания регистра, где он загружается во вход X, если LOAD равен '1', и выводит данные в серийном режиме, в основном параллельно в регистре серийного выхода. Вход X является входом 4 бит (3 вниз к 0), то, что я хочу сделать, чтобы программа выполнялась, постоянно выводится 0, когда регистр успешно выводит все бит на вход.VHDL Shift Register Program различные результаты при использовании сигналов и переменных

Он работает, когда «счет» определяется как сигнал, однако, когда счетчик определяется как переменная, выход является константой 0, независимо от того, является ли загрузка «1» или нет. Мой код такой, как показано:

entity qn14 is 
    Port (clk : in STD_LOGIC; 
     reset : in STD_LOGIC; 
     LOAD : in STD_LOGIC; 
     X : in STD_LOGIC_VECTOR (3 downto 0); 
     output : out STD_LOGIC); 
end qn14; 

architecture qn14_beh of qn14 is 
    type states is (IDLE , SHIFT); 
    signal state : states; 
    signal count: STD_LOGIC_VECTOR(1 downto 0); 
begin 

    process(clk , reset) 
    variable temp: STD_LOGIC; 
    variable data: STD_LOGIC_VECTOR(3 downto 0); 
    begin 
    if reset = '1' then 
     state <= IDLE; 
     count <= "00"; 
     output <= '0'; 
    elsif clk'event and clk = '1' then 
     case state is 
     when IDLE => 
      if LOAD = '1' then 
      data := X; 
      output <= '0'; 
      state <= SHIFT; 
      elsif LOAD = '0' then 
      output <= '0'; 
      end if; 

     when SHIFT => 
      if LOAD ='1' then 
      output <= '0'; 
      elsif LOAD = '0' then 
      output <= data(conv_integer(count)); 
      count <= count + 1; 
      if (count >= 3) then 
       state <= IDLE ; 
      end if; 
      end if; 
     end case; 
    end if; 
    end process; 

end qn14_beh; 

В надежде найти разъяснения по этому вопросу.

спасибо.

+0

*** Он работает, когда «счет» определяется как сигнал, однако, когда счетчик определяется как переменная, выход является константой 0, независимо от того, является ли загрузка «1» или нет. *** Да , но в чем ваш вопрос? Вы не показываете версию с 'count' как переменной, и ваш код не является [Минимальным, полным и проверяемым примером] (http://stackoverflow.com/help/mcve). Присвоение переменной немедленно, новое значение может быть сразу оценено в выражении.Назначаемое значение сигнала запланировано, прогнозируемый выходной сигнал и значение, доступное в будущем симуляционном цикле. – user1155120

ответ

0

Это может не полностью ответить на ваш вопрос, но я расскажу о нескольких проблемах, которые я вижу.

elsif LOAD = '0' then может быть только else, если вы не пытаетесь покрыть другие состояния (X, U ...), но вам все равно понадобится else, чтобы покрыть их.

count = 3 более ясно, чем count >= 3. count является 2-битный вектор, поэтому он никогда не может быть больше чем 3.

Хотя выход 0 когда LOAD утверждается, в то время как в SHIFT состоянии, вы фактически не загружать новое значение. Вы намеревались?

Изменение счета переменной без изменения положения заданий будет вызывать ваш первый X ->output последовательность, чтобы прервать цикл рано (вы увеличиваем count, прежде чем испытать его против 3). Это вызовет последующие X ->output последовательности идти «X(3), X(0), X(1), X(2)»

переменная temp никогда не используется. Переменная data будет работать так же хорошо, как и сигнал. Для этого вам не нужны свойства переменных. Это также вызывает вопрос о том, почему вы пробовали count как переменную; если вам не нужны мгновенные назначения переменных, обычно лучше использовать сигнал, потому что сигналы легче просматривать в (большинстве) симуляторах и сложнее совершать ошибки. Я надеюсь, что вы не пытаетесь найти count как переменную, но просто имеете академическое любопытство, почему это не работает.

Вы рассматривали это в симуляторе? Правильно ли вы меняете состояния? Все биты всех ваших входов сильно приводятся к определенному значению ('1' или '0')?

Я не вижу ничего, что могло бы привести к тому, что вы описали просто изменение переменной count на переменную из сигнала, но это изменение вызовет описанное выше нежелательное поведение. Мое лучшее предположение заключается в том, что ваш симптом возникает из-за того, как вы управляете своими входами.

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