Maverick_ 15 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба Доброго времени суток! Что-то я наверно туплю - вчера вечером после работы сел и до двух часов ночи просидел... Я в шоке... Пытаюсь сделать АЛУ, на функциональном уровне работает, а Post-Rout нет... Может кто подскажет в чем причина? Файлы приложены... example.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба Я в шоке... if rst = '0' then Flag <= '0'; В результате Ваш rst на ena триггера садится. Если его в ноль уронить, с чего бы состоянию флага изменится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба if rst = '0' then Flag <= '0'; В результате Ваш rst на ena триггера садится. Если его в ноль уронить, с чего бы состоянию флага изменится. согласен, но пока это не принципиальный вопрос Главный вопрос почему арифметика не работает на Post-Rout? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба Главный вопрос почему арифметика не работает на Post-Rout? не знаю. У меня на gate уровне моделсим из квартуса Вашу связку не берет. # Loading instances from ALU_VHDL_vhd.sdo # ** Error: (vsim-SDF-3250) ALU_VHDL_vhd.sdo(0): Failed to find INSTANCE '/NA'. # ** Error: (vsim-SDF-3894) : Errors occured in reading and resolving instances from compiled SDF file(s). # ** Error: (vsim-SDF-3250) ALU_VHDL_vhd.sdo(0): Failed to find INSTANCE '/NA'. # Error loading design # Error: Error loading design # Pausing macro execution # MACRO ./ALU_VHDL_run_msim_gate_vhdl.do PAUSED at line 12 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба не знаю. У меня на gate уровне моделсим из квартуса Вашу связку не берет. # Loading instances from ALU_VHDL_vhd.sdo # ** Error: (vsim-SDF-3250) ALU_VHDL_vhd.sdo(0): Failed to find INSTANCE '/NA'. # ** Error: (vsim-SDF-3894) : Errors occured in reading and resolving instances from compiled SDF file(s). # ** Error: (vsim-SDF-3250) ALU_VHDL_vhd.sdo(0): Failed to find INSTANCE '/NA'. # Error loading design # Error: Error loading design # Pausing macro execution # MACRO ./ALU_VHDL_run_msim_gate_vhdl.do PAUSED at line 12 я работаю в xilinx в квартусе нужно прописать подключение модуля к тестовому воздействию. Кажется UUT: shema_cpu PORT MAP( заменить UUT1: shema_cpu PORT MAP( upd Вопрос снят - причина выяснена - перепутал присвоения := и <= Всем спасибо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба я работаю в xilinx Так ведь на функциональном уровне работает. Пора водку пить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба Доброго времени суток! Что-то я наверно туплю - вчера вечером после работы сел и до двух часов ночи просидел... Я в шоке... Пытаюсь сделать АЛУ, на функциональном уровне работает, а Post-Rout нет... Может кто подскажет в чем причина? Файлы приложены... Не уверен, что это может быть причиной, но меня немного смущает одно обстоятельство: почти везде в операторе case у Вас идет присвоение результата в переменные reg_Result и reg_Flag и только для одного случая (Operation = 001) Вы используете для этого сигналы Result и Flag. Все бы ничего, но чуть ниже в этом же процессе, но уже не под условием триггера Вы снова сигналам Result и Flag присваиваете значения переменных reg_Result и reg_Flag! Формально вроде криминала нет, но излишне намешано, крышу ISE может сносить запросто:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба Не уверен, что это может быть причиной, но меня немного смущает одно обстоятельство: почти везде в операторе case у Вас идет присвоение результата в переменные reg_Result и reg_Flag и только для одного случая (Operation = 001) Вы используете для этого сигналы Result и Flag. Все бы ничего, но чуть ниже в этом же процессе, но уже не под условием триггера Вы снова сигналам Result и Flag присваиваете значения переменных reg_Result и reg_Flag! Формально вроде криминала нет, но излишне намешано, крышу ISE может сносить запросто:) Признаюсь честно - Вашего сообщения не читал.. Выше в своем сообщенни отписался... а потом увидел Ваше.. "в яблочко" :) Спасибо... Вопрос снят.. PS Исправил на переменные внутри процесса.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба Ещё тут лишние сигналы в списке чувствительности процесса. Достаточно clk и rst так как все операции выполняются только по их фронтам. Хотя работе это не мешает, но warning лишний должен появляться. И под условием "if rst=0" надо присвоить значения всем сигналам, присваиваемым под условием фронта clk, иначе rst криво сядет на вход ena "забытых" триггеров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 марта, 2012 Опубликовано 7 марта, 2012 · Жалоба еще глупый вопрос: как передать с АЛУ значения и флаг на регистр... ? у меня флаг на Post-Rout красный (циклограмма в приложении)... схема в приложении.. Аккумулятор это простые регистры для флага и результата.... library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity acumulator is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; flag_in : in STD_LOGIC; data_in : in STD_LOGIC_VECTOR (3 downto 0); flag_out : out STD_LOGIC; data_out : out STD_LOGIC_VECTOR (3 downto 0)); end acumulator; architecture Behavioral of acumulator is signal reg_data : STD_LOGIC_VECTOR (3 downto 0); signal reg_flag : STD_LOGIC; begin process (clk) --variable reg_flag : STD_LOGIC; begin if rst = '0' then -- reg_flag <= '0'; reg_data <= (others => '0'); elsif clk'event and clk='1' then reg_data <= data_in; reg_flag <= flag_in; end if; end process; data_out <= reg_data; flag_out <= reg_flag; end Behavioral; и само АЛУ (исправленное) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity ALU_VHDL is port ( clk : in std_logic; --rst : in std_logic; Nibble1, Nibble2 : in std_logic_vector(3 downto 0); Operation : in std_logic_vector(2 downto 0); -- Carry_Out : out std_logic; Flag : out std_logic; Result : out std_logic_vector(3 downto 0) ); end entity ALU_VHDL; architecture Behavioral of ALU_VHDL is -- signal Temp: std_logic_vector(4 downto 0); begin process(Nibble1, Nibble2, Operation, clk) is variable Temp: std_logic_vector(4 downto 0); variable reg_Flag : std_logic; variable reg_Result : std_logic_vector(3 downto 0); begin if clk'event and clk='1' then case Operation is when "000" => -- res = niblle1 + niblle2, flag = carry = overflow Temp := std_logic_vector((unsigned('0'&Nibble1) + unsigned('0'&Nibble2))); reg_Result := temp(3 downto 0); reg_Flag := temp(4); when "001" => --|Nibble1 - Nibble2| if (Nibble1 >= Nibble2) then reg_Result := std_logic_vector(unsigned(Nibble1) - unsigned(Nibble2)); reg_Flag := '0'; else reg_Result := std_logic_vector(unsigned(Nibble2) - unsigned(Nibble1)); reg_Flag := '1'; end if; when "010" => reg_Result := Nibble1 and Nibble2; reg_Flag := '0'; when "011" => reg_Result := Nibble1 or Nibble2; reg_Flag := '0'; when "100" => reg_Result := Nibble1 xor Nibble2; reg_Flag := '0'; when "101" => reg_Result := not Nibble1; reg_Flag := '0'; when "110" => reg_Result := not Nibble2; reg_Flag := '0'; when others => -- res =niblle1-nibble2 = nib1 + not(nib2) + 1 Temp := std_logic_vector(unsigned('0' & Nibble1) - unsigned('0'& Nibble2)); --Temp := std_logic_vector(unsigned('0' & Nibble1) + unsigned(not (Nibble2)) +1); reg_Result := temp(3 downto 0); reg_Flag := temp(4); end case; end if; Result <= reg_Flag; Flag <= reg_Result; end process; end architecture Behavioral; Неужели нужно переходить на инверсную или более высокую частоту? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 8 марта, 2012 Опубликовано 8 марта, 2012 · Жалоба неужели никто не знает???? плиз помогите... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 9 марта, 2012 Опубликовано 9 марта, 2012 · Жалоба судя по вейвформам, вы используете моделсим, так почему вы не используете возможность отладки x/z states? проблема быстро локализуется и станет все понятно :) ЗЫ. в коде захвата ошибка в описании сигнала rst, либо его нет в списке чувствительности либо в он не в том месте процесса описан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
6oraTblpb 0 9 марта, 2012 Опубликовано 9 марта, 2012 · Жалоба Проблема связана с асинхронной подачей сигнала sel. Сейчас насколько я понимаю, вы его формируете сами в tb файле. Поставьте триггеры на этот сигнал, хотя бы для симуляции, потому что в законченной схеме скорее всего этот сигнал у вас будет синхронным, если он конечно не приходит снаружи кристалла или из другого клок домена. И всё у вас заработает ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 9 марта, 2012 Опубликовано 9 марта, 2012 · Жалоба Проблема связана с асинхронной подачей сигнала sel. Сейчас насколько я понимаю, вы его формируете сами в tb файле. Поставьте триггеры на этот сигнал, хотя бы для симуляции, потому что в законченной схеме скорее всего этот сигнал у вас будет синхронным, если он конечно не приходит снаружи кристалла или из другого клок домена. И всё у вас заработает ) в самую точку... Спасибо... PS Что-то я наверно устал... "тупить" начал на простых вещах... Наверно надо отдохнуть... PS PS Выкладываю код - может кому-то пригодиться... Исправил АЛУ - вот его код library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity ALU_VHDL is port ( clk : in std_logic; rst : in std_logic; Nibble1, Nibble2 : in std_logic_vector(3 downto 0); Operation : in std_logic_vector(2 downto 0); -- Carry_Out : out std_logic; Flag : out std_logic; Result : out std_logic_vector(3 downto 0) ); end entity ALU_VHDL; architecture Behavioral of ALU_VHDL is signal reg_Nibble1: std_logic_vector(3 downto 0); signal reg_Nibble2: std_logic_vector(3 downto 0); signal reg_Operation: std_logic_vector(2 downto 0); begin process (clk, rst) begin if rst = '0' then reg_Nibble1 <= (others => '0'); reg_Nibble2 <= (others => '0'); reg_Operation <= (others => '0'); elsif clk'event and clk='1' then reg_Nibble1 <= Nibble1; reg_Nibble2 <= Nibble2; reg_Operation <= Operation; end if; end process; process(reg_Nibble1, reg_Nibble2, reg_Operation, clk) is variable Temp: std_logic_vector(4 downto 0); variable reg_Flag : std_logic; variable reg_Result : std_logic_vector(3 downto 0); begin if clk'event and clk='1' then case reg_Operation is when "000" => -- res = niblle1 + niblle2, flag = carry = overflow Temp := std_logic_vector((unsigned('0'®_Nibble1) + unsigned('0'®_Nibble2))); reg_Result := temp(3 downto 0); reg_Flag := temp(4); when "001" => --|Nibble1 - Nibble2| if (Nibble1 >= Nibble2) then reg_Result := std_logic_vector(unsigned(reg_Nibble1) - unsigned(reg_Nibble2)); reg_Flag := '0'; else reg_Result := std_logic_vector(unsigned(reg_Nibble2) - unsigned(reg_Nibble1)); reg_Flag := '1'; end if; when "010" => reg_Result := reg_Nibble1 and reg_Nibble2; reg_Flag := '0'; when "011" => reg_Result := reg_Nibble1 or reg_Nibble2; reg_Flag := '0'; when "100" => reg_Result := reg_Nibble1 xor reg_Nibble2; reg_Flag := '0'; when "101" => reg_Result := not reg_Nibble1; reg_Flag := '0'; when "110" => reg_Result := not reg_Nibble2; reg_Flag := '0'; when others => -- res =niblle1-nibble2 = nib1 + not(nib2) + 1 Temp := std_logic_vector(unsigned('0' & reg_Nibble1) - unsigned('0'& reg_Nibble2)); --Temp := std_logic_vector(unsigned('0' & Nibble1) + unsigned(not (Nibble2)) +1); reg_Result := temp(3 downto 0); reg_Flag := temp(4); end case; end if; Result <= reg_Result; Flag <= reg_Flag; end process; end architecture Behavioral; тестбенч для схемы во вложении (рисунок) LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; LIBRARY UNISIM; USE UNISIM.Vcomponents.ALL; ENTITY shema_cpu_shema_cpu_sch_tb IS END shema_cpu_shema_cpu_sch_tb; ARCHITECTURE behavioral OF shema_cpu_shema_cpu_sch_tb IS COMPONENT shema_cpu PORT( clock : IN STD_LOGIC; XLXN_17 : OUT STD_LOGIC; XLXN_18 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); data1 : IN STD_LOGIC_VECTOR (3 DOWNTO 0); data2 : IN STD_LOGIC_VECTOR (3 DOWNTO 0); sel : IN STD_LOGIC_VECTOR (2 DOWNTO 0); flg : OUT STD_LOGIC; res : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END COMPONENT; SIGNAL clock : STD_LOGIC; SIGNAL XLXN_17 : STD_LOGIC; SIGNAL XLXN_18 : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL data1 : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL data2 : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL sel : STD_LOGIC_VECTOR (2 DOWNTO 0):= (others => '0'); SIGNAL flg : STD_LOGIC; SIGNAL res : STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN UUT: shema_cpu PORT MAP( clock => clock, XLXN_17 => XLXN_17, XLXN_18 => XLXN_18, data1 => data1, data2 => data2, sel => sel, flg => flg, res => res ); -- *** Test Bench - User Defined Section *** -- Clock process definitions clk_process :process begin clock <= '0'; wait for 100 ns; clock <= '1'; wait for 100 ns; end process; -- Stimulus process stim_proc2: process begin -- rst <= '1'; data1 <= "1001"; data2 <= "1101"; wait; end process; stim_proc: process begin wait until clock'event and clock = '1'; sel <= sel + "001"; end process; -- *** End Test Bench - User Defined Section *** END; судя по вейвформам, вы используете моделсим, так почему вы не используете возможность отладки x/z states? проблема быстро локализуется и станет все понятно :) Совершенно верно я использую моделсим а можно поподробнее про возможность отладки x/z states - никогда не использовал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 10 марта, 2012 Опубликовано 10 марта, 2012 · Жалоба а можно поподробнее про возможность отладки x/z states - никогда не использовал... на вейвформе тыкаете два раза мышой в сигнал, в отдельном окне открывается dataflow window с отдельной вейвформой. по нему лего вычисляется из чего формируется сигнал и что не так %) в хелпе хорошо расписано Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться