VHDL Hjälp

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Strik3r
Inlägg: 1
Blev medlem: 21 november 2011, 18:27:23

VHDL Hjälp

Inlägg av Strik3r »

Tjenare!

Hoppas att det finns någon/några som är duktiga på vhdl här på detta forumet.
verkar inte finnas så många bra vhdl forum.

Jag har en uppgift som jag skulle bli otroligt tacksam för om jag fick lite hjälp med.

Jag ska utveckla en drivrutin för en VGA-skärm. När programmet startas ska den rita ut en pixel i mitten på skärmen, exempelvis 4X4 kvadrat.
Därefter ska jag sedan kunna styra denna pixel med hjälp av 4 knappar, där varje knapp har ett kommando (flytta upp, ner, vänster, höger).
Jag behöver lite hjälp att skriva detta, då jag är relativt ny på det här och är inte jätte duktig på matte.

Jag använder upplösningen 640 X 480 och jag vet att mitten på en 4X4 pixel blir 318 till 322 i X led samt 238 till 242, men hur jag skriver detta i vhdl språk vet jag inte.

Jag tror att 3 processer är det enklaste man kan göra, en som sköter knapparna och deras kommandon, en som sköter x och y samt dess uppdatering, och sist en som sköter synk signalerna och räknare, vilket jag redan fixat:
X och Y ska ju vara detsamma som räknarna, så frågan är om jag gjort rätt eller om det finns något enklare sätt?


Här är den kod jag fixat hittils:

Kod: Markera allt

--Insert library and use clauses--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

-- Begin entity declaration for "uppgift_vhdl_2b"--
entity vhdl_ingenjorsjobb_1 is
--Begin port declaration--  
port
(
	 -- Reset and clock 50 MHZ-- 
    RESET_N, CLOCK_50      : in std_logic;
	 --Commmand-switches--
	 SW                     : in std_logic_vector (3 downto 0);
	 --Colours (Blue/Red/Green) 8bit each--
	 VGA_R,VGA_G,VGA_B      : out std_logic_vector (7 downto 0);
	 --No color,outside writing area--	 
    VGA_BLANK_N,VGA_SYNC_N : out std_logic;
	 --Sync signals Horizontal/vertical, VGA clock--
    VGA_HS,VGA_VS,VGA_CLK  : out std_logic
);
	 
--End entity--
end entity vhdl_ingenjorsjobb_1;

--Begin architecture--
architecture vga of vhdl_ingenjorsjobb_1 is


type hv_type is --Horizental/Vertical type
record
       --Elements 9bit--
		  H:std_logic_vector(10-1 downto 0);
		  V:std_logic_vector(10-1 downto 0);

end record;


constant rgb_en_const      : hv_type :=("1001111111","0111011111");


--Internal signal declaration--
signal counter_int         : hv_type;
signal CLK_25MHZ           : std_logic;
signal SW_INTERNAL         : std_logic_vector (3 downto 0);
signal X,Y                 : std_logic_vector (10-1 downto 0);
begin

VGA_CLK<=CLK_25MHZ;
SW_INTERNAL <= NOT SW;
X<=counter_int.h;
Y<=counter_int.v;


-- Create process sensitive to all inputs--
process_clock_25mhz : process(CLOCK_50)
begin
		  
		  
		          if rising_edge(CLOCK_50) then
					 CLK_25MHZ<=not CLK_25MHZ;
	
                end if;--end rising_edge (clock_50)--
				 
end process;--end process_clock_25mhz--
 --Sync process--
                      process_sync_screen : process(CLK_25MHZ)
			             begin
					
			             if rising_edge(CLK_25MHZ) then
			             if RESET_N ='0' then
					
				          counter_int.h <=(others =>'0');
					       counter_int.v <=(others =>'0');
			         
					        --Every output gets a starting value--	
						           VGA_HS      <= '1';
				                 VGA_VS      <= '1';
					              VGA_BLANK_N <= '1';
					              VGA_SYNC_N  <= '1';
				                 VGA_R       <=(others =>'0');
						           VGA_G       <=(others =>'0');
						           VGA_B       <=(others =>'0');
			             else  
  
			         
		          			-- Clock out RGB Pixel Row Data  Horizontal Sync--
		                  -- ------------------------------------__________--------
		                  -- 0                           639   659       755    799
	                  	if counter_int.h >= 799 then
  			                  counter_int.h <= (others => '0');
		                  else
   		                	counter_int.h <= counter_int.h + 1;
		                  end if;
				             
								 
						      --         Horizontal Sync Generation ('0')--
							   -- ------------------------------------__________-------
		                  -- 0                                 659       755    
		                  if (counter_int.h <= 755) and (counter_int.h>= 659) then
  			                   VGA_HS <= '0';
		                  else
  			                   VGA_HS <= '1';
		                  end if;
			    
			     
     	                  -- 480 Horizontal Sync (pixel rows) Vertical Sync-- 
		                  -- ---------------------------------------_______----------
		                  -- 0                                480   493-494       524
		                  if   (counter_int.v >= 524) and (counter_int.h >= 699) then
		                        counter_int.v <= (others => '0');
		                  elsif counter_int.h = 699 then
		  	                     counter_int.v <= counter_int.v + 1;
	                     end if;
				            
								--            Vertical Sync Generation ('0') --
							   -- ---------------------------------------_______----------
		                  -- 0                                      493-494     
		                  if (counter_int.v <= 494) and (counter_int.v >= 493) then
 			                   VGA_VS <= '0';
		                  else
   			                VGA_VS <= '1';
		                  end if;
		                  
				 	       --Declares when blank will be low/active--
							   if counter_int.h<=639 then
                           VGA_BLANK_N<='1';
                        else 
                           VGA_BLANK_N<='0';
                        end if;

                     --Declares when sync will be low/active--
                        if counter_int.v<=479 then
                           VGA_SYNC_N<='1';
                        else
                           VGA_SYNC_N<='0';
                        end if;
								
Sen hade jag tänkt mig något sånt här med för färgerna, men mer än så här har jag inte lyckats fixa

Kod: Markera allt

 if(counter_int.h = X and counter_int.v=Y)then
					 
						   VGA_R <= "11111111"; VGA_G <= "11111111"; VGA_B <= "11111111";
					 else  
					 
					      VGA_R <= "00000000"; VGA_G <= "00000000"; VGA_B <= "00000000";
					 end if;
Är det någon som skulle kunna hjälpa mig att lösa detta?

//Strik3r
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: VHDL Hjälp

Inlägg av blueint »

VHDL beskriver ett logiskt nätverk, eller tillståndsmaskin. Det är inget program.

Hur du ska lösa det beror på om du ska använda bildminne, eller direktgenerera videosignalen samt hur kringliggande elektronik fungerar.
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7226
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: VHDL Hjälp

Inlägg av psynoise »

Att läsa en massa kod är jobbigt, presentera gärna din lösning via blockdiagram eller något annat mer lättsmält.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: VHDL Hjälp

Inlägg av stekern »

@psynoise: blockdiagram, wtf?

@Strik3r:
Du är på god väg.
Det enda du har kvar att göra är att låta X och Y bero på SW.
om du vill att den ska ritas i 4x4 så får du jämföra om de pågående H & V räknarna ligger inom det området.
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7226
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: VHDL Hjälp

Inlägg av psynoise »

@psynoise: blockdiagram, wtf?
Eftersom det är ett helt system vill jag se någon dokumentation på hur man tänkt lösa problemen. Felet kanske redan finns där på en högnivå och då är det ingen ide att kolla på en massa kod enligt min mening.
frågan är om jag gjort rätt eller om det finns något enklare sätt?
Detta ser man enklast via en ordentlig systembeskrivning. I den bästa av världar använder man

* Kortbeskrivning av systemet.
* Blockschema.
* Beskrivning av delblocken (kod, kretsschema...)
Skriv svar