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

Нужна помощь

У меня Xilinx ISE 10.1.03. Возникла проблема на разных этапах симуляции разные результаты. Помогите это дело исправить.

Справа рисунок функционального моделирования (Behav Simulition)

Слево рисунок моделирования после имплементации (Post-Rout Simulition)

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity shift_registerN is
    Port ( clk : in std_logic;
            shift_en : in std_logic;
              indata : in std_logic;
              flag : out std_logic;
              outdata : out std_logic_vector(15 downto 0));
end  entity shift_registerN;

architecture behavioral of shift_registerN is

signal data_int : std_logic_vector(15 downto 0):= (others => '0');
signal cnt : std_logic_vector(3 downto 0):= (others => '0');
signal flag_int : std_logic;

begin
--сдвигающий регистр
process (clk, indata, data_int, shift_en) 
begin
if ( clk'event and clk ='1') then
if shift_en = '1' then
data_int <= data_int(14 downto 0) & indata;
end if; end if;
outdata <= data_int
end process;

--счетчик 
process (clk, shift_en, cnt, rst)
begin
if shift_en = '0' then
cnt <= (others => '0');
elsif (clk'event and clk = '1') then
cnt <= cnt + "0001";
end if;
end process;

--формирование строб-импульса
process (clk, cnt, flag_int)
begin
if (clk'event and clk = '1') then
if cnt = "1111" then
flag_int <= '1';
else
flag_int <= '0';
end if;
end if;
flag <= flag_int;
end process;

end behavioral;

 

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

ЗЫ Я так понимаю синтезатор где-то добавляет триггер (на выходе/входе outdata ???), но зачем мне не понятно и как эту вставку отключить - вот в чем вопрос.

post-24839-1234429835_thumb.jpg

post-24839-1234431329_thumb.jpg

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


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

process (clk, indata, data_int, shift_en)

outdata <= data_int

end process;

 

 

process (clk, cnt)

begin

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

flag <= flag_int;

end process;

 

end behavioral;[/code]

 

Сначало наверно со списком чувствительности налдо разобраться. Неужели предупреждений нет. по поводу flag_int

Да и зачем outdata <= data_int, flag <= flag_int; в теле процесса. Ведь это только путает. (В процессе по клоку пользователь вправе регистр увидеть, а Вы его проводом потчуюте.) Тогда и список чувствительности только clk и асинхронный ресет

Вторая возможная причина - этот асинхронный ресет на счетчик в связке с разрешением сдвига. Пропустите через триггер.

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


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

Сначало наверно со списком чувствительности налдо разобраться. Неужели предупреждений нет. по поводу flag_int

Да и зачем outdata <= data_int, flag <= flag_int; в теле процесса. Ведь это только путает. (В процессе по клоку пользователь вправе регистр увидеть, а Вы его проводом потчуюте.) Тогда и список чувствительности только clk и асинхронный ресет

Вторая возможная причина - этот асинхронный ресет на счетчик в связке с разрешением сдвига. Пропустите через триггер.

 

Указанные Вами ошибки я исправил - проблему не сняло. Ниже привел исправленную программу

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity shift_registerN is
    Port ( clk : in std_logic;
            shift_en : in std_logic;
              indata : in std_logic;
              flag : out std_logic;
              rst_out : out std_logic;
           outdata : out std_logic_vector(15 downto 0));
end  entity shift_registerN;

architecture behavioral of shift_registerN is

signal data_int : std_logic_vector(15 downto 0):= (others => '0');
signal cnt : std_logic_vector(3 downto 0):= (others => '0');
signal shiften : std_logic;
signal flag_int : std_logic;
signal shift_in : std_logic;

attribute SHIFT_EXTRACT : string;
attribute SHIFT_EXTRACT of data_int : signal is "NO";

begin

process (clk, shift_en) 
begin
if ( clk'event and clk ='1') then
shiften <= shift_en;
end if; 
end process;

process (clk, indata) 
begin
if ( clk'event and clk ='1') then
shift_in <= indata;
end if; 
end process;

process (clk, shift_in, data_int, shiften) 
begin
if ( clk'event and clk ='1') then
if shiften = '1' then
data_int <= data_int(14 downto 0) & shift_in;
end if; end if;
outdata <= data_int;
end process;

process (clk, shiften, cnt)
begin
if shiften = '0' then
cnt <= (others => '0');
elsif (clk'event and clk = '1') then
cnt <= cnt + "0001";
end if;
end process;

process (clk, cnt, flag_int, shiften)
begin
if (clk'event and clk = '1') then
if shiften = '1' then
if cnt = "1111" then
flag_int <= '1';
else
flag_int <= '0';
end if;
end if;
end if;
flag <= flag_int;
end process;

--process (clk, flag_int) 
--begin
--if ( clk'event and clk ='1') then
--flag <= flag_int;
--end if; 
--end process;

end behavioral;

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


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

А ещё лучше вот так.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity shift_registerN is
    Port ( clk : in std_logic;
            shift_en : in std_logic;
              indata : in std_logic;
              flag : out std_logic;
              rst_out : out std_logic;
           outdata : out std_logic_vector(15 downto 0));
end  entity shift_registerN;

architecture behavioral of shift_registerN is

signal data_int : std_logic_vector(15 downto 0):= (others => '0');
signal cnt : std_logic_vector(3 downto 0):= (others => '0');
signal shiften : std_logic;
signal flag_int : std_logic;
signal shift_in : std_logic;

attribute SHIFT_EXTRACT : string;
attribute SHIFT_EXTRACT of data_int : signal is "NO";

begin

process (clk) 
begin
if ( clk'event and clk ='1') then
shiften <= shift_en;
shift_in <= indata;
end if; 
end process;

process (clk) 
begin
if ( clk'event and clk ='1') then
if shiften = '1' then
data_int <= data_int(14 downto 0) & shift_in;
end if; end if;
end process;
outdata <= data_int;

process (clk, shiften)
begin
if shiften = '0' then
cnt <= (others => '0');
elsif (clk'event and clk = '1') then
cnt <= cnt + 1;
end if;
end process;

process (clk)
begin
if (clk'event and clk = '1') then
if shiften = '1' then
if cnt = "1111" then
flag_int <= '1';
else
flag_int <= '0';
end if;
end if;
end if;
end process;
flag <= flag_int;

end behavioral;

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

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


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

А ещё лучше вот так.

 

И попробуйте всё таки сбрасывать (инициализировать нулём) сигналы: shiften, shift_in, data_int ...

 

Пробовал. К сожалению это не решает проблему :smile3046:

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


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

Указанные Вами ошибки я исправил - проблему не сняло. Ниже привел исправленную программу

 

Конечно лучше без a_clr обойтись, но все должно работать.

Каюсь, только сейчас временные Ваши просмотрел.

shift_en : in std_logic;

indata : in std_logic;

С чего это вдруг эти сигналы по разным фронтам клока формируются.

 

Чтобы не гадать, должно уложиться в типа такое

 

signal data_int : std_logic_vector(15 downto 0):= (others => '0');
signal cnt : std_logic_vector(3 downto 0):= (others => '0');
signal flag_int : std_logic;

begin

process (clk) 
begin
if ( clk'event and clk ='1') then
if shift_en = '0' then
cnt <= (others => '0');
data_int <= data_int;
else
cnt <= cnt + 1;
data_int <= data_int(14 downto 0) & indata;
end if;
if shift_en = '1' then
if cnt = "1111"   then
flag_int <= '1';
else
flag_int <= '0';
end if;
end if;
flag <= flag_int;
end if;
end process;

outdata <= data_int;

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


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

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

На мой взгляд наоборот: второй скриншот верный! Изменения outdata строго по фронту clk.

 

 

"Сначало наверно со списком чувствительности налдо разобраться. "

Это ключевые слова в этом топике.

 

outdata <= data_int;

flag <= flag_int;

Назначение этих сигналов не должны быть в теле процесса.

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


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

В итоге, удалось решить проблему? Что оказалось причиной?

 

 

    
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity shift_registerN is
    Port ( clk : in std_logic;
           -- shift_en : in std_logic;
              indata : in std_logic;
              flag : out std_logic;
              outdata : out std_logic_vector(15 downto 0));
end  entity shift_registerN;

architecture behavioral of shift_registerN is

signal data_int : std_logic_vector(15 downto 0):= (others => '0');
signal cnt : std_logic_vector(3 downto 0):= (others => '0');
signal flag_int : std_logic;

begin
--сдвигающий регистр
process (clk, indata, data_int, shift_en)
begin
if ( clk'event and clk ='1') then
--if shift_en = '1' then
data_int <= data_int(14 downto 0) & indata;
end if; --end if;
outdata <= data_int
end process;

--счетчик
process (clk, shift_en, cnt, rst)
begin
if shift_en = '0' then
cnt <= (others => '0');
elsif (clk'event and clk = '1') then
cnt <= cnt + "0001";
end if;
end process;

--формирование строб-импульса
process (clk, cnt, flag_int)
begin
if (clk'event and clk = '1') then
if cnt = "1111" then
flag_int <= '1';
else
flag_int <= '0';
end if;
end if;
flag <= flag_int;
end process;

end behavioral;

 

Как я понял, проблема была в разрешающем сигнале для сдвигающего регистра(его я закоментировал)

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


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

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

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

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

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

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

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

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

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

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