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

Всем день добрый. Необходима некоторая помощь с регистром, т.к. я уже не могу найти где моя ошибка.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity shift is
   Port ( clk :  in   STD_LOGIC;
          reset: in   STD_LOGIC;
          load : in   STD_LOGIC;
          shift: in   STD_LOGIC;
          D :    in   STD_LOGIC_VECTOR (7 downto 0);
          Q :    out  STD_LOGIC);
end shift;

architecture Behavioral of shift is

 signal sr: std_logic_vector(7 downto 0) := (others=>'0');

begin

 process (clk,load,D,)
 begin
     if (load = '1') then
     sr <= D;
     elsif (clk'event and clk = '1') then
        if (shift = '1') then
         sr <= sr(0) & sr(7 downto 1);      
     end if;
   end if;
 end process;

 Q <= sr(0);      

end Behavioral;

В общем проблема состоит в том, что на выходе выводит неверный сигнал. На скрине я выделил лишнее, т.е. он заканчивает этот сигнал по спаду, хотя должен по фронту по сути идти

image.png

 

 

Да и второй сигнал тоже смещен на 1 такт по clk

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


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

begin

 

process (clk,load,D,)

begin

if (load = '1') then

sr <= D;

elsif (clk'event and clk = '1') then

if (shift = '1') then

sr <= sr(0) & sr(7 downto 1);

end if;

end if;

end process;

 

Q <= sr(0);

 

 

Да и второй сигнал тоже смещен на 1 такт по clk

У Вас на картинке load и shift присутствуют одновременно. Так должно быть? И что при этом происходит? Кто имеет более высокий приоритет?

 

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


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

На первый взгляд, никакого криминала в коде нет. Единственное, что смущает - запятая после последнего сигнала в списке чувствительности.

Было бы удобнее, если бы вы добавили еще и тестбенч, чтобы была возможность самому "пощупать".

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


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

У Вас на картинке load и shift присутствуют одновременно. Так должно быть? И что при этом происходит? Кто имеет более высокий приоритет?

Shift - это тот же enable, просто разрешающий сигнал

Load - использую как сигнал загрузки

 

У вас timing simulation, сделайте behavioral

С кодом все ок, должно работать

В квартусовском симуляторе могу выбрать только timing и functional

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


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

В квартусовском симуляторе могу выбрать только timing и functional

functional значит выбирайте

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


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

Shift - это тот же enable, просто разрешающий сигнал

Load - использую как сигнал загрузки

Ответ не принимается!

Так все таки, когда два эти сигнала действуют одновременно, что происходит? Сдвиг или загрузка?

 

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


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

functional значит выбирайте

теперь здесь идет не по clk, а по load идет, на скрине видно что по первому и 3-ему time bar они идут неверно

image.png

 

 

Ответ не принимается!

Так все таки, когда два эти сигнала действуют одновременно, что происходит? Сдвиг или загрузка?

Насколько я понимаю, чтобы ачать разрешать сдвигать, сперва должна произойти загрузка, значит load в большем приоритете?

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


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

теперь здесь идет не по clk, а по load идет, на скрине видно что по первому и 3-ему time bar они идут неверно

 

Почему неверно? Сейчас все четко.

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


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

теперь здесь идет не по clk, а по load идет, на скрине видно что по первому и 3-ему time bar они идут неверно

load у вас асинхронный, так и будет. Хотите чтоб он был синхронный, перенесите его внутрь if (clk'event and clk = '1')

Все достаточно прозрачно - если load - параллельная загрузка. если не load, то ждем клок. load главнее

if (load = '1') then

...

elsif (clk'event and clk = '1')

...

 

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


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

Почему неверно? Сейчас все четко.

мне надо, чтобы перед 3-им time bar было пол такта в нуле

 

load у вас асинхронный, так и будет. Хотите чтоб он был синхронный, перенесите его внутрь if (clk'event and clk = '1')

что-то я вообще не могу придумать как это сделать, вообще под конец дня голова не варит

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


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

мне надо, чтобы перед 3-им time bar было пол такта в нуле

 

 

что-то я вообще не могу придумать как это сделать, вообще под конец дня голова не варит

У вас данные при загрузке 0x81, младший бит в 1. Сделайте его в 0 и тогда будет пол такта в 0

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


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

У вас данные при загрузке 0x81, младший бит в 1. Сделайте его в 0 и тогда будет пол такта в 0

ок, а как сделать синхронный load

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


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

ок, а как сделать синхронный load

А что такое "список чувствительности" у процесса?

Что означает вот эта строка: process (clk,load,D,) ? Когда и по какому сигналу запускается процесс?

Что такое "синхронное проектирование"?

 

Много вопросов, да? :)

 

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


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

А что такое "список чувствительности" у процесса?

Что означает вот эта строка: process (clk,load,D,) ? Когда и по какому сигналу запускается процесс?

Что такое "синхронное проектирование"?

 

Много вопросов, да? :)

от всех вопросов голова сейчас взорвется))

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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