Начертайте кръг vhdl

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

Соу, трябва да нарисувам червен кръг с радиус ~ 100 px. Мисля, че трябва да използвам някакъв вектор, но как?

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
Потенциално полезни думи за търсене: bresenham, scanline   -  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