Нарисовать круг vhdl

Как я могу нарисовать круг в VHDL? Вот мой дизайн BDF

Итак, мне нужно нарисовать красный круг радиусом ~ 100 пикселей. Я думаю, что я должен использовать какой-то вектор, но как?

entity VGAFrameTest is
port(   yrow, xcolumn : in unsigned(9 downto 0); -- row and  column number of VGA video
        VGA_CLK : in std_logic;                -- pixel clock
        VGA_R, VGA_G, VGA_B: out std_logic_vector(9 downto 0)); --  color information
end;

architecture rtl of VGAFrameTest is
constant COLOR_ON : std_logic_vector(9 downto 0) := (others=>'1'); 
constant COLOR_OFF : std_logic_vector(9 downto 0) := (others=>'0');
constant ROW_HEIGHT : integer := 480; -- number of visible rows
-- A test of visible range is recommended
-- VGA 640x480@60Hz resolution is not natural for LCD monitors
-- They support it but some monitors do not display all columns
-- 1 or 2 last columns can be missing
constant COLUMN_WIDTH : integer := 640 -1 ; -- number of visible columns - correction

begin
  frame:process(VGA_CLK)
  begin
  if rising_edge(VGA_CLK) then
        VGA_R<=COLOR_ON;VGA_G<=COLOR_ON;VGA_B<=COLOR_ON; --initilize  color to white  
        if (yrow = 240 and xcolumn = 320) then
          VGA_B<=COLOR_OFF; VGA_G<=COLOR_OFF; 
        elsif yrow = 1 or yrow = ROW_HEIGHT-2 or xcolumn=1 or xcolumn = COLUMN_WIDTH-2 then
          VGA_R<=COLOR_OFF; VGA_G<=COLOR_OFF; VGA_B<=COLOR_OFF; -- black frame
        elsif yrow = ROW_HEIGHT-1 then        
          VGA_B<=COLOR_OFF; VGA_G<=COLOR_OFF; --last  column is red
        end if;  
 end if;    
 end process;

end;

person JohnDow    schedule 21.11.2012    source источник
comment
Потенциально полезные условия поиска: брезенхэм, сканлайн.   -  person Martin Thompson    schedule 22.11.2012


Ответы (2)


Один из подходов - это некоторый вариант X**2 + Y**2 = R**2;, например Y = Sqrt(R**2 - X**2)

Хитрость эффективной реализации заключается в том, чтобы избежать дорогостоящих операций, таких как sqrt, и свести к минимуму (немного) дорогостоящие умножения.

Вы можете сделать предположение для Y (начните с того, что вы знаете, что Y будет 0), возвести его в квадрат и сравнить с R*2 - X*2 для каждого нового X, пересматривая свое предположение, когда оно будет ошибся слишком сильно. Здесь будут полезны условия поиска Мартина.

Преобразования координат для установки начала координат (0,0) в нужное место на экране относительно просты.

person user_1818839    schedule 22.11.2012
comment
Извините, больше нет информации отсюда. Если вы знаете достаточно VHDL, чтобы написать код, который вы изначально опубликовали, вы знаете достаточно, чтобы завершить проект из подсказок в моем ответе. - person user_1818839; 24.11.2012

Вы можете установить любой радиус, изменив 157696 на (160000 - r^2)

480 и 640 это центр круга умножить на 2

  begin
      frame:process(VGA_CLK)
      begin
      if rising_edge(VGA_CLK) then 
      VGA_R<=COLOR_OFF;VGA_G<=COLOR_OFF;VGA_B<=COLOR_OFF;
            if yrow>159 and yrow <320 and xcolumn < 440  and xcolumn > 199  then 
              VGA_B<=COLOR_ON; VGA_G<=COLOR_ON;VGA_R<=COLOR_ON;   

               if  (480*yrow-yrow*yrow+640*xcolumn-xcolumn*xcolumn )> 157696   then
              VGA_B<="0001001100"; VGA_G<=COLOR_OFF; VGA_R <= "1011111000";  
             end if;
            end if;  


 end if;    
 end process;
person JohnDow    schedule 24.11.2012