пытаясь использовать несколько компонентов, образуют комбинаторный цикл - PullRequest
1 голос
/ 23 октября 2019

Я создал каждый модуль и тестовый стенд. каждый делает именно то, что должен в симуляторе. но когда я пытаюсь синтезировать, я получаю ошибку «2170 - Unit VgaTest: следующие сигналы образуют комбинаторный цикл: U1 / Madd_divider_lut <1>», за которым следует процесс карты, удаляющий каждый отдельный сигнал из модуля верхнего уровня (сообщение701) это оставляет мое устройство без какого-либо вывода (подтверждено осциллографом)

Я не понимаю, почему оно моделирует и работает нормально, но затем делает это. любой совет или информация будут оценены. (используя mimas v2 с часами 100 МГц, на спартанском 6 да, я знаю, что часы 25.000 МГц, а не 25.175)

ClockGen:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

entity ClockGen is
    Port (    clk : in  STD_LOGIC;
               rst : in  STD_LOGIC;
           clkout : out STD_LOGIC);
end ClockGen;

architecture Behavioral of ClockGen is
    signal divider : std_logic_vector(3 downto 0) := (others => '0');
begin
    process(clk, rst)
    begin
        if (rst = '1') then
            divider <= "0000";
        else
            divider <= divider + '1';
        end if;
    end process;

    clkout <= divider(3);
end Behavioral;

VgaController:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity vgaController is
    Port(
          clk: in std_logic;    -- pixel clock (25.175Mhz)
        hsync: out std_logic;
        vsync: out std_logic;
            r: out std_logic_vector(3 downto 0);
            g: out std_logic_vector(3 downto 0);
            b: out std_logic_vector(2 downto 0)
    );
end vgaController;

architecture Behavioral of vgaController is
    -- horizontal timing(line)
    constant hva: integer := 640;   -- visible area
    constant hfp: integer := 16;    -- front porch
    constant hsp: integer := 96;    -- sync pulse
    constant hbp: integer := 48;    -- back porch

    -- vertical timing
    constant vva: integer := 480; -- visible area
    constant vfp: integer := 10;    -- front porch
    constant vsp: integer := 2; -- sync pulse
    constant vbp: integer := 32;    -- back porch

    signal HPOS: integer range 0 to 800 := 0;
    signal VPOS: integer range 0 to 525 := 0;
begin
    process (clk)
    begin
        if (rising_edge(clk)) then
            -- update the position counters
            if (HPOS < (hva+hfp+hsp+hbp)) then  -- are we within the horizontal area?
                HPOS <= HPOS + 1;
            else
                HPOS <= 0;
                if (VPOS < (vva+vfp+vsp+vbp)) then  -- are we within vertical area?
                    VPOS <= VPOS + 1;
                else
                    VPOS <= 0;
                end if;
            end if;

            -- update the sync signals
            if (HPOS > (hva+hfp) and HPOS < (hva+hfp+hsp)) then -- horiz sync
                hsync <= '0';
            else
                hsync <= '1';
            end if;

            if (VPOS > (vva+vfp) and VPOS < (vva+vfp+vsp)) then -- vertical sync
                vsync <= '0';
            else
                vsync <= '1';
            end if;

            -- TEMP -- SET OUR PIXELS (this will be replaced with actual driver code later)
            if ((HPOS > hva) or (VPOS > vva)) then
                -- blank signal
                R <= (others => '0');
                G <= (others => '0');
                B <= (others => '0');
            else
                -- blue background
                R <= (others => '0');
                G <= (others => '0');
                B <= (others => '1');

                -- white cross hair
                if ((HPOS > 475 and HPOS < 485) or (VPOS > 280 and VPOS < 290)) then
                    R <= (others => '1');
                    G <= (others => '1');
                    B <= (others => '1');
                end if;
            end if;
        end if;
    end process;
end Behavioral;

и VgaTest (самый верхний модуль):

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity VgaTest is
    Port(
          clk: in std_logic;
        HSYNC: out std_logic;
        VSYNC: out std_logic;
            r: out std_logic_vector(3 downto 0);
            g: out std_logic_vector(3 downto 0);
            b: out std_logic_vector(2 downto 0)
    );
end VgaTest;

architecture Behavioral of VgaTest is
    component ClockGen
    Port(
         clk : IN  std_logic;
         rst : IN  std_logic;
         clkout : OUT  std_logic
        );
    end component;

    component vgaController
    Port(
         clk : IN  std_logic;
         hsync : OUT  std_logic;
         vsync : OUT  std_logic;
         r : OUT  std_logic_vector(3 downto 0);
         g : OUT  std_logic_vector(3 downto 0);
         b : OUT  std_logic_vector(2 downto 0)
        );
    end component;

     signal clktmp: std_logic;

     signal out_hsync: std_logic := '0';
     signal out_vsync: std_logic := '0';

     signal out_r: std_logic_vector(3 downto 0);
     signal out_g: std_logic_vector(3 downto 0);
     signal out_b: std_logic_vector(2 downto 0);

begin

   U1: ClockGen Port map (
          clk => clk,
          rst => '0',           -- reset is not being used, so hardwire it low
          clkout => clktmp
       );

   U2: vgaController Port map (
          clk => clktmp,
          hsync => out_hsync,
          vsync => out_vsync,
          r => out_r,
          g => out_g,
          b => out_b
        );

    HSYNC <= out_hsync;
    VSYNC <= out_vsync;
    r <= out_r;
    g <= out_g;
    b <= out_b;
end Behavioral;

Я действительно думаю, что это, вероятно, проблема новичка, но я просто не могу понять, почему.

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

elsif(rising_edge(clk)) then
 ...

разрешил жалобы синтезаторов. еще не тестировался на реальном оборудовании, но я не вижу причин, по которым он все еще не работает.

1 Ответ

0 голосов
/ 26 октября 2019

согласно user1155120 проблема была с часами. он синтезировал бы всю сеть, потому что он никогда не генерировал часы. Вот исправление

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

entity ClockGen is
    Port (    clk : in  STD_LOGIC;
               rst : in  STD_LOGIC;
           clkout : out STD_LOGIC);
end ClockGen;

architecture Behavioral of ClockGen is
    signal divider : std_logic_vector(3 downto 0) := (others => '0');
begin
    process(clk, rst)
    begin
        if (rst = '1') then
            divider <= "0000";
        elsif (rising_edge(clk)) then
            divider <= divider + '1';
        end if;
    end process;

    clkout <= divider(3);
end Behavioral;

, с помощью которого оно отлично отображается при условии, что монитор будет поддерживать 25 МГц с ровной поверхностью. часы были заменены установкой PLL, чтобы дать мне ровно 25,175, чтобы они работали на любом мониторе (по крайней мере, я до сих пор пробовал)

...