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;
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;
//Strik3r