Перейти к содержанию
    

Помогите, проблемы с регистром сдвига

Пишу на VHDL не много, опыта мало, столкнулся с такой вот проблемой. Написал на VHDL программу регистра сдвига, кажись все правильно, выполняется без ошибок, но при временном моделировании после сдвига влево на выходе оказывается единица но по логике должен быть ноль, я не знаю почему и что мне делать :help: .

 

Код:

 

library IEEE;

USE IEEE.std_logic_1164.all;

--тело регистра ЗСB

entity ZSB is

port( BR, BL: in std_logic; --сигналы управление сдвигами

D_ALB_Q: in std_logic_vector (3 downto 0);

SB0, SB3: inout std_logic; --сигналы переноса

Q_ZSB: out std_logic_vector(3 downto 0) ); --результат

end;

--архитектура регистра

architecture move_reg of ZSB is

begin

process(BL, BR) begin

if (BL = '0' and BR = '0') then --передача данных

Q_ZSB <= D_ALB_Q;

SB3 <= '0';

SB0 <= '0';

elsif (BL = '0' and BR = '1') then --сдвиг вправо

Q_ZSB(3) <= SB3;

for i in 2 downto 0 loop

Q_ZSB(i) <= D_ALB_Q(i+1);

end loop;

SB0 <= D_ALB_Q(0);

elsif (BL = '1' and BR = '0') then --сдвиг влево

SB3 <= D_ALB_Q(3);

for i in 3 downto 1 loop

Q_ZSB(i) <= D_ALB_Q(i-1);

end loop;

Q_ZSB(0) <= SB0;

end if;

end process;

end;

 

 

скрин временного моделирования:

 

post-53504-1257706568_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрел на код минут с 10,.. так и не смог понять, что же такое у Вас получилось. Но уж точно: сдвиговый регистр описывается по иному.

 

Если Вы работаете с Xilinx ISE, то почитайте XST.pdf, в нём есть раздел Shift Registers HDL Coding Techniques. Обратите внимание на то, что в приведённом примере используется C'Event - что позволяет синтезировать триггер. Тогда у Вас получиться нормальный сдвиговый регистр. C'Event and C = '1' эквивалентно rising_edge©.

 

Сейчас же у Вас (если я правильно понял) получилось нечто асинхронное, поведение которого при временном моделировании (у Вас же картинка временного моделирования ?) определяются задержками логических элементов и разводки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрел на код минут с 10,.. так и не смог понять, что же такое у Вас получилось. Но уж точно: сдвиговый регистр описывается по иному.

 

Работаю c Cyclone II. используя C'Event and C = '1', все работает правильно. но в том то и дело мне нужен асинхронный регистр сдвига, я описываю логику схемы (отображена которая ниже) там регистр "ЗСВ".

 

post-53504-1257710430_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

Совершенно верно заметил Boris_TS:

"...поведение которого при временном моделировании (у Вас же картинка временного моделирования ?) определяются задержками логических элементов и разводки".

"Нежелательные" значения(переходные процессы) на выходах асинхронной схемы будут появляться неизбежно и зависеть будут от того, в какие ячейки попадут элементы и как проведутся связи.

 

P.S. Я так понимаю, что результат сдвига у Вас потом поступает в НОЗП, который работает по CLK. Вот там "дребезг" на выходах 3СВ и уберется.

Изменено пользователем Andrew Su

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. Я так понимаю, что результат сдвига у Вас потом поступает в НОЗП, который работает по CLK. Вот там "дребезг" на выходах 3СВ и уберется.

 

Да, все правильно. Результат потом в НОЗП, работает он по CLK.

Спасибо Andrew Su и Boris_TS! Соберу все до кучи посмотрю как оно будет себя вести.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишу на VHDL не много, опыта мало, столкнулся с такой вот проблемой. Написал на VHDL программу регистра сдвига, кажись все правильно, выполняется без ошибок, но при временном моделировании после сдвига влево на выходе оказывается единица но по логике должен быть ноль, я не знаю почему и что мне делать :help: .

 

Код:

 

library IEEE;

USE IEEE.std_logic_1164.all;

--тело регистра ЗСB

entity ZSB is

port( BR, BL: in std_logic; --сигналы управление сдвигами

D_ALB_Q: in std_logic_vector (3 downto 0);

SB0, SB3: inout std_logic; --сигналы переноса

Q_ZSB: out std_logic_vector(3 downto 0) ); --результат

end;

--архитектура регистра

architecture move_reg of ZSB is

begin

process(BL, BR) begin

if (BL = '0' and BR = '0') then --передача данных

Q_ZSB <= D_ALB_Q;

SB3 <= '0';

SB0 <= '0';

elsif (BL = '0' and BR = '1') then --сдвиг вправо

Q_ZSB(3) <= SB3;

for i in 2 downto 0 loop

Q_ZSB(i) <= D_ALB_Q(i+1);

end loop;

SB0 <= D_ALB_Q(0);

elsif (BL = '1' and BR = '0') then --сдвиг влево

SB3 <= D_ALB_Q(3);

for i in 3 downto 1 loop

Q_ZSB(i) <= D_ALB_Q(i-1);

end loop;

Q_ZSB(0) <= SB0;

end if;

end process;

end;

 

 

скрин временного моделирования:

 

post-53504-1257706568_thumb.png

посмотрите здесь может поможет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...