Maverick_ 15 12 февраля, 2009 Опубликовано 12 февраля, 2009 · Жалоба У меня 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 ???), но зачем мне не понятно и как эту вставку отключить - вот в чем вопрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 12 февраля, 2009 Опубликовано 12 февраля, 2009 · Жалоба 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 и асинхронный ресет Вторая возможная причина - этот асинхронный ресет на счетчик в связке с разрешением сдвига. Пропустите через триггер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 12 февраля, 2009 Опубликовано 12 февраля, 2009 · Жалоба Сначало наверно со списком чувствительности налдо разобраться. Неужели предупреждений нет. по поводу 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuchynski 0 12 февраля, 2009 Опубликовано 12 февраля, 2009 (изменено) · Жалоба А ещё лучше вот так. 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; Изменено 12 февраля, 2009 пользователем kuchynski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 12 февраля, 2009 Опубликовано 12 февраля, 2009 · Жалоба А ещё лучше вот так. И попробуйте всё таки сбрасывать (инициализировать нулём) сигналы: shiften, shift_in, data_int ... Пробовал. К сожалению это не решает проблему :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 12 февраля, 2009 Опубликовано 12 февраля, 2009 · Жалоба Указанные Вами ошибки я исправил - проблему не сняло. Ниже привел исправленную программу Конечно лучше без 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuchynski 0 12 февраля, 2009 Опубликовано 12 февраля, 2009 · Жалоба На мой взгляд судя по коду оно таким и должно быть (совпадать с функциональным моделированием). На мой взгляд наоборот: второй скриншот верный! Изменения outdata строго по фронту clk. "Сначало наверно со списком чувствительности налдо разобраться. " Это ключевые слова в этом топике. outdata <= data_int; flag <= flag_int; Назначение этих сигналов не должны быть в теле процесса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 20 февраля, 2009 Опубликовано 20 февраля, 2009 · Жалоба В итоге, удалось решить проблему? Что оказалось причиной? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 23 марта, 2009 Опубликовано 23 марта, 2009 · Жалоба В итоге, удалось решить проблему? Что оказалось причиной? 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; Как я понял, проблема была в разрешающем сигнале для сдвигающего регистра(его я закоментировал) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться