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

Доброго времени суток!

Что-то я наверно туплю - вчера вечером после работы сел и до двух часов ночи просидел... Я в шоке...

Пытаюсь сделать АЛУ, на функциональном уровне работает, а Post-Rout нет...

Может кто подскажет в чем причина?

Файлы приложены...

example.rar

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


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

Я в шоке...

if rst = '0' then

Flag <= '0';

 

В результате Ваш rst на ena триггера садится.

Если его в ноль уронить, с чего бы состоянию флага изменится.

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


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

if rst = '0' then

Flag <= '0';

 

В результате Ваш rst на ena триггера садится.

Если его в ноль уронить, с чего бы состоянию флага изменится.

согласен, но пока это не принципиальный вопрос

Главный вопрос почему арифметика не работает на Post-Rout?

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


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

Главный вопрос почему арифметика не работает на 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

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


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

не знаю.

У меня на 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

Вопрос снят - причина выяснена - перепутал присвоения

:= и <=

 

Всем спасибо...

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


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

я работаю в xilinx

Так ведь на функциональном уровне работает.

Пора водку пить.

 

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


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

Доброго времени суток!

Что-то я наверно туплю - вчера вечером после работы сел и до двух часов ночи просидел... Я в шоке...

Пытаюсь сделать АЛУ, на функциональном уровне работает, а Post-Rout нет...

Может кто подскажет в чем причина?

Файлы приложены...

 

Не уверен, что это может быть причиной, но меня немного смущает одно обстоятельство: почти везде в операторе case у Вас идет присвоение результата в переменные reg_Result и reg_Flag и только для одного случая (Operation = 001) Вы используете для этого сигналы Result и Flag. Все бы ничего, но чуть ниже в этом же процессе, но уже не под условием триггера Вы снова сигналам Result и Flag присваиваете значения переменных reg_Result и reg_Flag! Формально вроде криминала нет, но излишне намешано, крышу ISE может сносить запросто:)

 

 

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


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

Не уверен, что это может быть причиной, но меня немного смущает одно обстоятельство: почти везде в операторе case у Вас идет присвоение результата в переменные reg_Result и reg_Flag и только для одного случая (Operation = 001) Вы используете для этого сигналы Result и Flag. Все бы ничего, но чуть ниже в этом же процессе, но уже не под условием триггера Вы снова сигналам Result и Flag присваиваете значения переменных reg_Result и reg_Flag! Формально вроде криминала нет, но излишне намешано, крышу ISE может сносить запросто:)

Признаюсь честно - Вашего сообщения не читал.. Выше в своем сообщенни отписался... а потом увидел Ваше..

"в яблочко" :)

 

 

Спасибо...

 

Вопрос снят..

 

PS Исправил на переменные внутри процесса....

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


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

Ещё тут лишние сигналы в списке чувствительности процесса. Достаточно clk и rst так как все операции выполняются только по их фронтам. Хотя работе это не мешает, но warning лишний должен появляться.

И под условием "if rst=0" надо присвоить значения всем сигналам, присваиваемым под условием фронта clk, иначе rst криво сядет на вход ena "забытых" триггеров.

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


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

еще глупый вопрос:

как передать с АЛУ значения и флаг на регистр... ?

у меня флаг на 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;

 

Неужели нужно переходить на инверсную или более высокую частоту?

post-24839-1331127203_thumb.jpg

post-24839-1331127512_thumb.jpg

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


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

судя по вейвформам, вы используете моделсим, так почему вы не используете возможность отладки x/z states? проблема быстро локализуется и станет все понятно :)

 

ЗЫ. в коде захвата ошибка в описании сигнала rst, либо его нет в списке чувствительности либо в он не в том месте процесса описан.

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


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

Проблема связана с асинхронной подачей сигнала sel. Сейчас насколько я понимаю, вы его формируете сами в tb файле.

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

 

 

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


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

Проблема связана с асинхронной подачей сигнала 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'&reg_Nibble1) + unsigned('0'&reg_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 - никогда не использовал...

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


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

а можно поподробнее про возможность отладки x/z states - никогда не использовал...

на вейвформе тыкаете два раза мышой в сигнал, в отдельном окне открывается dataflow window с отдельной вейвформой. по нему лего вычисляется из чего формируется сигнал и что не так %) в хелпе хорошо расписано

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


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

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

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

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

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

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

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

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

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

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