2016-02-20 2 views
0

Я схожу с ума, пытаясь заставить его работать, но ничего не было об этом в течение последних 6 часов и до сих пор не решить:/Почему мой VHDL код для генерации сигнала VGA не работает

так этот верхний модуль

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

-- Uncomment the following library declaration if using 
-- arithmetic functions with Signed or Unsigned values 
--use IEEE.NUMERIC_STD.ALL; 

-- Uncomment the following library declaration if instantiating 
-- any Xilinx primitives in this code. 
--library UNISIM; 
--use UNISIM.VComponents.all; 

entity Test is 
    Port (CLKI : in STD_LOGIC; 
     HSO : out STD_LOGIC; 
     VSO : out STD_LOGIC; 
     RO,GO,BO : out STD_LOGIC); 
end Test; 

architecture Behavioral of Test is 
    component CLK_25Mhz_Divider 
    Port (CLK : in STD_LOGIC; 
      CLK_OUT : out STD_LOGIC); 
    end component; 

    component VGA_Sync 
    Port (CLK : in STD_LOGIC; 
      HS : out STD_LOGIC; 
      VS : out STD_LOGIC; 
      R,G,B : out STD_LOGIC); 
    end component; 

    signal CLKBE: STD_LOGIC; 

begin 

    CLK_Divider_1: CLK_25Mhz_Divider port map (CLK => CLKI, 
               CLK_OUT => CLKBE); 

    VGA_S1: VGA_Sync port map (CLK => CLKBE, 
      HS => HSO, 
      VS => VSO, 
      R => RO, 
       G => GO, 
       B => BO); 

end Behavioral; 

часы делитель

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

-- Uncomment the following library declaration if using 
-- arithmetic functions with Signed or Unsigned values 
--use IEEE.NUMERIC_STD.ALL; 

-- Uncomment the following library declaration if instantiating 
-- any Xilinx primitives in this code. 
--library UNISIM; 
--use UNISIM.VComponents.all; 

entity CLK_25MHz_Divider is 
    Port (CLK : in STD_LOGIC; 
      CLK_OUT : out STD_LOGIC); 
end CLK_25MHz_Divider; 

architecture Behavioral of CLK_25MHz_Divider is 

BEGIN 
    PROCESS(CLK) 
      VARIABLE COUNT : INTEGER:=0; 
      VARIABLE TEMP : STD_LOGIC:='0'; 
      BEGIN 
       IF RISING_EDGE(CLK)THEN 
        COUNT:=COUNT+1; 
        IF COUNT=2 THEN 
          TEMP:=NOT TEMP; 
          COUNT:=0; 
        END IF; 
       END IF; 
       CLK_OUT<=TEMP; 
       END PROCESS; 
end Behavioral; 

сигнал VGA-модуль генерации

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

-- Uncomment the following library declaration if using 
-- arithmetic functions with Signed or Unsigned values 
--use IEEE.NUMERIC_STD.ALL; 

-- Uncomment the following library declaration if instantiating 
-- any Xilinx primitives in this code. 
--library UNISIM; 
--use UNISIM.VComponents.all; 

entity VGA_Sync is 
    Port (CLK : in STD_LOGIC; 
      HS : out STD_LOGIC; 
      VS : out STD_LOGIC; 
      R,G,B : out STD_LOGIC); 
end VGA_Sync; 

architecture Behavioral of VGA_Sync is 

begin 

    process(CLK) 

    Variable countH : Integer := 0; 
    Variable countV : Integer := 0; 

    begin 
    if (CLK'EVENT and CLK = '1') then 

     if countH < 800 then 
      countH := countH + 1; 
     else 
      countH := 0; 
      if countV < 500 then 
       countV := countV + 1; 
     else 
       countV := 0; 
      end if; 
     end if; 

     if countH >= 16 and countH < 112 then 
      HS <= '0'; 
     else 
      HS <= '1'; 
     end if; 

     if countV >= 10 and countV < 12 then 
      VS <= '0'; 
     else 
      VS <= '1'; 
     end if; 

     if (countH < 160) or (countV < 45) then 
      R <= '0'; 
      G <= '0'; 
      B <= '0'; 
     else 
      R <= '1'; 
      G <= '0'; 
      B <= '1'; 
     end if; 
    end if; 
end process;  
end Behavioral; 

так скажите мне ваши мысли о том, что случилось с кодом

+0

Btw разрешение, для которого я нацелен, составляет 640x480 – Mostafa

+0

Пожалуйста, уберите свой вопрос. Вы отправили 'vga_sync' два раза. Отсутствует компонент верхнего уровня, а также тестовый стенд. И какова ошибка (сообщение)? И удалите ненужные строки комментариев. –

+0

Извините, что публиковал vga_sync дважды, я исправил его сейчас. это не то, что я получаю ошибку, мой код не дает мне никаких синтаксических ошибок, но когда я подключаю плату к экрану, ничего не появляется, когда цвет пикселей должен меняться на пурпурный. я сделал тест-стенд, но его здесь не стоит писать, так как это всего лишь часы, и тестовый стенд не показал ничего плохого, я мог бы включить его с некоторыми снимками экрана в форме волны, если вы этого захотите. – Mostafa

ответ

1

Потому что вы на самом деле не описать проблему и потому, что у меня был испытательный стенд для 25 МГц тактовой УПУ генератор, который требуется только изменение типа для г, г и б, я побежал вы sync_vga против тестбенча:

library ieee; 
use ieee.std_logic_1164.all; 

entity vga_sync_tb is 
end entity; 

architecture foo of vga_sync_tb is 
    signal clk: std_logic := '0'; 
    signal hs:  std_logic; 
    signal vs:  std_logic; 
    signal r,g,b: std_logic; 
begin 
DUT: 
    entity work.vga_sync 
     port map (
      clk => clk, 
      hs => hs, 
      vs => vs, 
      r => r, 
      g => g, 
      b => b 
     ); 
CLOCK: 
    process 
    begin 
     wait for 20 ns; -- clock period 25 MHz = 40 ns; 
     clk <= not clk; 
     if now > 20 ms then -- one frame time plus a bit 
      wait; 
     end if; 
    end process; 
end architecture; 

Это дало вертикальную скорость SYNC около 60 Гц:

sync_vga_tb_full.png

Увеличение и измерения между двумя краями HS показывает горизонтальную скорость около 31,17 кГц.

У вас есть горизонтальные и вертикальные интервалы гашения, а ваши R, G и B делают то, что говорит ваш код.

Этот вид листьев делитель часов или что-то связанное с платформой.

Поскольку испытательный стенд для часов просто:

library ieee; 
use ieee.std_logic_1164.all; 

entity clock_tb is 
end entity; 

architecture foo of clock_tb is 
    signal clk:  std_logic := '0'; 
    signal clk25: std_logic; 
begin 
DUT: 
    entity work.clk_25mhz_divider 
     port map (
      clk => clk, 
      clk_out => clk25 
     ); 
CLOCK: 
    process 
    begin 
     wait for 10 ns; -- half the period of 50 MHz 
     clk <= not clk; 
     if now > 130 ns then 
      wait; 
     end if; 
    end process; 
end architecture; 

Он демонстрирует ответ Мартина Зейбел в:

clock_tb.png

Это ваш разделить на два фактически делит на четыре. давая период 80 нс (12,5 МГц).

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

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

+0

Спасибо за объяснение. это то, что я буду иметь в виду в будущем. Я не очень разбираюсь в VHDL, потому что я не часто его использую, но я получаю от этого зависание. – Mostafa

+0

@Mostafa: если вы узнаете одну вещь из этого превосходного ответа, пусть это будет так: не требуется шесть часов, чтобы написать testbench и имитировать ваш дизайн. –

+0

Я должен признать, что этот ответ лучше моего, потому что он демонстрирует тестирование подмодулей. Итак, +1. Жаль, я должен был это знать. –

1

Из комментариев ниже вопрос:

в этой резолюции я должен использовать 25MHz, так что я с помощью бортовой часы , что это 50 МГц и разделив он использует модуль делителя часов. - Мустафы

Ваши часы делитель делит частоту входного сигнала 4 вместо 2. Вы переключать TEMP каждые два цикла CLK которая CLKI верхнего модуля. Таким образом, полный цикл CLK_OUT занимает 4 цикла входных часов.

Чтобы разделить на два, вы должны переключить TEMP каждый тактовый цикл входного тактового сигнала:

architecture Behavioral of CLK_25MHz_Divider is 
BEGIN 
    PROCESS(CLK) 
      VARIABLE TEMP : STD_LOGIC:='0'; 
    BEGIN 
     IF RISING_EDGE(CLK)THEN 
      TEMP:=NOT TEMP; 
     END IF; 
     CLK_OUT<=TEMP; 
    END PROCESS; 

end Behavioral; 

Начиная с TEMP = '0', он переключается на «1» на первом нарастающем фронте CLK. На втором нарастающем фронте TEMP переключает на «0», а на третьем фронте возвращается к «1». Продолжительность между первым и третьим фронтом входного тактового импульса 50 МГц составляет 40 нс, что делает частоту 25 МГц для выходных часов.

+0

ЭТО РАБОТАЕТ !!!!!! TY sir :) Я не могу поблагодарить вас. – Mostafa

Смежные вопросы