# FPGA, CPLD, 74xx loģikas >  Garu signālu(procesu) simulēšana

## cobalt

Kāda ir praktiski effektīvi simulēt garus notikumus, kas vadās no daudz pulksteņa impulsiesm? 
Piem. jāsimulē VGA sync modulis, kur ieejā iet pixel clock, piem 800x525=420000, lai izietu cauri visiem sinhronicācijas impulsiem...
Bija doma simulēt metot ārā visus tos brīžus kad tiek skaitīts un nekas nemainās... piemēram uzrakstīt savu kodu  un pārbaudes laikā to kas nosaka ka ir 800x525 parnest minimali mazu(piem. 200x85), lai var noskaidrot darbības pareizību, bet tikuntā gara pentere sanāk...
Otra iespēja manā uztverē ir visu kodu un struktūru veidot nevis pastarpināti vajadzībām, bet tam lai būtu iespējams simulēt... netaisīt blokus kas veic garas darbības, vai arī tikai tādus kas periodiskas veic utt.

p.s. programmatūra Xilinx ISE.
(nu jau kādas 10 minūtes simulē  :: ... ).

Liekas ka nekā īpaši  :: .



> Q14. When setting the end of testbench to a large number, such as 500,000 ns, ISE seems to freeze up and hang. Why does this occur?
> A14. This is a problem with the way the waveforms are currently stored. There is a memory leak issue here. This problem will be addressed in the 8.1i release of ISE Simulator.


 Un protams, ka problēmas ir jau ar 8.1  ::

----------


## Vikings

Nu nezinu, man 10MHz shēmas simulēšana ar Alteras Quartus 0,1s garumā nesagādā īpašas problēmas ja neskaita 4min simulācijas laiku. Tāpat pa to laiku kamēr kompilējas var pārskatīt kodu un jau izdarīt kādus labojumus... Ja grib ātrāk tad vai nu tiešām kā pats teici jāizmet ārā daļa programmas vai jāpāriet uz labāku kompi...

----------


## cobalt

> Nu nezinu, man 10MHz shēmas simulēšana ar Alteras Quartus 0,1s garumā nesagādā īpašas problēmas ja neskaita 4min simulācijas laiku. Tāpat pa to laiku kamēr kompilējas var pārskatīt kodu un jau izdarīt kādus labojumus... Ja grib ātrāk tad vai nu tiešām kā pats teici jāizmet ārā daļa programmas vai jāpāriet uz labāku kompi...


 Nu ar Quartus'u situācija ir bišķiņ labāka manā uztverē... a vispār tev tie 10 Mhz, tajā simulācijā eksistēja kā reāls, nedalīts kloks(tb milijons impulsu kādā no signāliem)?
Xilinxam simulācijai pieeja savādāka arī... kautvai marazms, tas pats kods
    Port ( x : out integer range 0 to 1024);
xilinxa simulacija tāds parādās kā kopa ar 1024 signāliem, Quartusā, kā normāla 10bitu(kanālu) kopa.

----------


## Vikings

> a vispār tev tie 10 Mhz, tajā simulācijā eksistēja kā reāls, nedalīts kloks


 Jā tieši tā - noteicu signālu kā reālu 10MHz takti. Daļa shēmas arī strādāja pa tiešo no 10MHz takts, daļa no jau dalītiem taktssignāliem.
It kā pa brīdim biju iedomājies pamēģināt pabakstīt arī Xilinxa CPLD, jo man ir lietotas plates ar viņiem diezgan daudz, bet tā kā reizēm uzpeld šādi ISE brīnumi tad laikam būs šai domai jāatmet ar roku un jāpaliek pie Alteras.

----------


## cobalt

Nu es domāju tie ir mazāk brīnumi, kā pieredzes trūkums un attiecīgās programmas knifu nezināšana  :: .

----------


## Epis

Cik noprotu tad tev vaidzēja simulēt to Loģikas koda funkcionalitāti tad labāk būtu paņemt kādu citu simulātoru kā  piemēram Modelsim. Alterai ir ModelSim-Altera Web Edition simulāotrs (xilinxam noteikti kad arī ir modelsim pakete kas darbojās ar ISE), kas ir par brīvu un viņš tad simulē to loģikas funkcionalitāti un tur visus lielos kodus var nosimulēt ļoti ātri kā piemēram veselu 32bit proci ar čupu iekšējiem signāliem mazāk par minūti, bet ja to domātu simulēt ar Atleras simulātoru kurš rādītu kā uzvedās singāli iekš pašas fpga tad tāda simulācija prasītu baigi daudz laika, līdz ar to ir divi simulācijas tipi iekšējā FPGA un tikai loģikas funkcionalitātes simulēšana.

otrs ir to kodu simulēt atsevišķi pa gabaliem veidojot hirarhiju kur katrs koda gabals ir atsevišķi pārbaudīts un tad beigās ātliek simulēt tikai pāris galvenos signālus.

----------


## cobalt

Nu ModelSim man ir... tikai tur visiem jābūt vienādām versijām, lai viņi integrētos iekš ISE (iekš ISE parādītos opcija simulēt ar model sim), a man ise 8.1, bet modelsim's kkāds 6stais..  ::  jāpalasa moš jamam manuālis, kā var simulēt nesaistīti ar ISE.

A ar ISE tāda lieta, ka behavioral simulācija (funkcionalitātes), liekas(nezinu.... varbūt kļūdos) nesimulējas pēc uzģenerētās loģikas, bet pēc VHDL koda, un tad dažreiz rodas situācija, ka kods simulējas, bet loģiku man vel neizprotamu iemeslu dēļ ISE pēctam nevar uzģenerēt (synthesize), tad kods ir jāpārtaisa tādā veidā kāds "patīk" ISE un papildus problēmas rodas.

Nu labi, patrennēšos vel un tad jau redzēs kā ies un kāds risinājums labāks  :: .

----------


## Epis

Ko tu īsti mēģini simulēt VGA draivera vai recivera (Horizontal;Vertical  sunc) signālus?  vai ko citu.



> Piem. jāsimulē VGA sync modulis, kur ieejā iet pixel clock, piem 800x525=420000, lai izietu cauri visiem sinhronicācijas impulsiem...


 Man pašam ir VGA draivera kods un nebīj īsti vajadzība simulēt 0,1sekundi pietika ar pāris ms.

----------


## cobalt

Draivera... 0.1 sekundi nevajag...
Bet ja man clock's ir 100 ns (tas vienalga...funkcionālajā siulācijā vienkārši pieņemts lielums), tad lai tiktu kautvai līdz pirmajam vsync impulsam, man jāizpilda visu pikseļu impulsi nu tie 42xxx*100ns...

...btw, liekas ka ISE problēma nav nosimulēt bet ielādēt/attēlot tos impulsus, jo ja nepaņem tik daudz ka viņš aiziet pie dieviem, tad nospiežot apstiprinājumu ielādēt jaunās vērtības(rezultātus pēc simulācijas), var redzēt cik viņš lēnu visu clocku un laika vērtības zīmē...

Vispār... cik precīziem jābūt VGA impulsiem?
Piem sākumā gribu dabūt baltu ekrānu 640x460@60 Hz...
Tur pixel clock'am jābūt 25.175 Mhz, es 100 Mhz dalu ar 4 un lietoju 25 Mhz, pārējās vērtības skaitu nevis pēc laika bet pēc pikseļiem vadoties pēc šitiem datiem:
http://diary.rozsnyo.com/2005/07/28/TX26D60VC1CAA.html (parulē uz leju līdz Timing diagram).
(Mēģinu vadīt parastu 19" LCD caur 15 pin DSUB, no tās lapas tikai timing'us skatos).

Bija doma ka nekam trakam nevajadzētu būt, vnk uz beigām attēls nobīdītos/izstieptos(ja monitors skaitītu ar 25.175 - t.i. ātrāk), bet pie sync'iem taču monitors par jaunu skaita...?

Katrā ziņā ja pašam nesanāks, pastīšos, tai štellei līdzi nāca gatavi faili clock'a ģenerācijai, vienīgi tie visi laiam bija orientēti, ja lietotājs darbina savu C kodu procī, un lieto viņu vhdl failus kā perifēriju procim. Sūdīgi, visi sempli tur tādi... a mani taisni VHDL nevis  C interesē patrennēties  :: .

----------


## cobalt

ups...

----------


## Epis

Reku mans VGA draiveris priekš sava 17' LCD monitora kods kur lejā ir galvenais VGA signālu ģenerātors un lai viņu darbinātu vaig tikai pievadīt to pikseļu informāciju vajadzīgajā brīdī un tur es standarta 640x480 izšķirtspēju pārtaisīju par peles sensora 18x18 nu tieši 18x18 nesanāk bet sanāca 20x16 un pikseļu informāciciju lasu no iekšējā RAM atmiņas bloka, bet tā kodu nosintezēt nevarēs jo tur ir vēl viens VHDL koda gabals bet tass attiecās tikai uz to prorgammas daļu kas nolasa pikseļus no RAM tākā to tev nevaig. 


```
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity VGA_test2 is
  port(CLOCK_50  : in std_logic;
		
	data		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
	wraddress		: IN STD_LOGIC_VECTOR (8 DOWNTO 0);
	wrclock		: IN STD_LOGIC ;
	wren		: IN STD_LOGIC;
	
       VGA_R,VGA_G,VGA_B   : out std_logic_vector(3 downto 0);
       VGA_HS    : out std_logic;
       VGA_VS : out std_logic;
--adresY_clkT,adresX_clkT, pixel_readT, D_bitT   : out std_logic;
	Pixel_adresT : out std_logic_vector ( 9 downto 0)
--	adresX_T,adresY_T : out std_logic_vector ( 4 downto 0) 
		);
		
end VGA_test2;

architecture Behavioral of VGA_test2 is

signal clk25              : std_logic;
signal horizontal_counter : std_logic_vector (9 downto 0);
signal vertical_counter   : std_logic_vector (9 downto 0);
signal red_out,green_out,blue_out, hs_out, vs_out : std_logic;
signal AdresX,AdresY : std_logic_vector ( 4 downto 0);
signal Pixel_adres : std_logic_vector (9 downto 0); -- (Ram adrese!)
signal pixel_read, adresX_clk, adresY_clk,D_bit,
stop,stop_D : std_logic;
signal pixel_data : std_logic_vector( 7 downto 0);

component impulse_500Khz_CLK IS
	-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
	PORT
	(
		clock : IN STD_LOGIC;
		timer : IN STD_LOGIC;
		Pulse : OUT STD_LOGIC
	);
	end component;
	
--component VGA_ram
--	PORT
--	(
--		address		: IN STD_LOGIC_VECTOR (8 DOWNTO 0);
--		clock		: IN STD_LOGIC ;
--		data		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
--		wren		: IN STD_LOGIC ;
--		q		: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
--	);
--end component;

component VGA2port_RAM
	PORT
	(
		data		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
		rdaddress		: IN STD_LOGIC_VECTOR (8 DOWNTO 0);
		rdclock		: IN STD_LOGIC ;
		wraddress		: IN STD_LOGIC_VECTOR (8 DOWNTO 0);
		wrclock		: IN STD_LOGIC ;
		wren		: IN STD_LOGIC  := '1';
		q		: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
	);
end component;

begin

image_ram : VGA2port_RAM
Port map( wraddress=>wraddress,wrclock=>wrclock, rdaddress=> pixel_adres(8 downto 0), rdclock=>clk25, Q=> pixel_data, data=>data,wren=>wren);

VGA_R(0)<='0';
VGA_R(1)<='0';
VGA_R(2)<='0';
VGA_R(3)<='0';
VGA_G(0)<=pixel_data(2);
VGA_G(1)<=pixel_data(3);
VGA_G(2)<=pixel_data(4);
VGA_G(3)<=pixel_data(5);
VGA_B(0)<='0';--pixel_adres(0);
VGA_B(1)<='0'; --pixel_adres(1);
VGA_B(2)<='0'; --pixel_adres(2);
VGA_B(3)<='0'; --pixel_adres(3);

VGA_HS<=hs_out;
VGA_VS<=vs_out;

-- generate a 25Mhz clock
process (clock_50)
begin
  if rising_edge(clock_50) then
    if (clk25 = '0') then
      clk25 <= '1';
    else
      clk25 <= '0';
    end if;
  end if;
end process;

Pixel_adresT<= pixel_adres;
--AdresX_T<= adresX;
--adresY_T <= adresY;
--adresY_clkT<=adresY_clk;
--adresX_clkT<=adresX_clk;
--pixel_readT<=pixel_read;
--D_bitT<=D_bit;

adresX_clock_pulse : impulse_500Khz_CLK 
Port map(clock=> clk25, Timer=> horizontal_counter(4), Pulse=>adresX_clk); 
adresY_clock_pulse : impulse_500Khz_CLK 
Port map(clock=> clk25, Timer=> vertical_counter(4), Pulse=>adresY_clk); 


process (clk25)
begin
if rising_edge(clk25) then
	if pixel_read ='1' then
	pixel_adres<= adresX +("10010" * adresY); 
	--adresu generators kapina pa "10100" 20 adresem, bet vaig 18
		if adresX_clk ='1' then
	if Stop_D ='0' then
	adresX<= adresX+1; end if;
	
	if adresX = "10010" then adresX <="00000"; stop<='1'; 
	else stop<='0'; end if; 
 end if; end if;end if;
end process;

process(clk25)
begin
if rising_edge(clk25) then
if Pixel_read ='1' then 
if stop ='1' then
stop_D<=stop; end if;
else stop_D<='0';
end if;end if;--end if;
end process;

process (clk25)
begin
if rising_edge(clk25) then
	if vertical_counter < "0000100111" then 
adresY<="00000"; 
		else if adresY_clk ='1' then
		D_bit<='1'; end if;
		if pixel_read ='1' and D_bit='1' then
			if adresY < "10010" then 
			adresY<= adresY+1; D_bit<='0'; end if; end if;
 end if; end if;
end process;


-- izskirtspeja 640x480
process (clk25) 
begin
  if clk25'event and clk25 = '1' then
    if (horizontal_counter >= "0010010000" ) -- 144
    and (horizontal_counter < "1100010000" ) -- 784 skaits 640
    and (vertical_counter >= "0000100111" ) -- 39
    and (vertical_counter < "1000000111" ) -- 519  skaits 480
    then
-- šeit jāaktivize bitu nolasīsana
	pixel_read <='1';
--      red_out <= horizontal_counter(3) 
--	            and vertical_counter(3);
--      green_out <= horizontal_counter(4) 
--	            and vertical_counter(4);
--      blue_out <= horizontal_counter(5) 
--	            and vertical_counter(5);
    else
--seit beidzas bitu nolasisana
	pixel_read <='0';
--      red_out <= '0';
--      green_out <= '0';
--      blue_out <= '0';
    end if;
    if (horizontal_counter > "0000000000" )
      and (horizontal_counter < "0001100001" ) -- 96+1
    then
      hs_out <= '0';
    else
      hs_out <= '1';
    end if;
    if (vertical_counter > "0000000000" )
      and (vertical_counter < "0000000011" ) -- 2+1
    then
      vs_out <= '0';
    else
      vs_out <= '1';
    end if;
    horizontal_counter <= horizontal_counter+"0000000001"; --H+1
    if (horizontal_counter="1100100000") then --ja H=784
      vertical_counter <= vertical_counter+"0000000001";  --V+1
      horizontal_counter <= "0000000000";  --H=0
    end if;
    if (vertical_counter="1000001001") then	--ja V=519
      vertical_counter <= "0000000000";  -- V=0
    end if;
  end if;
end process;

end Behavioral;
```

 beigās izdomāju arī ielikt tikai pašu galveno VGA draiveri,  šitajā kodā izkomentētās koda daļas bija domātas priekš TEST VGA attēla pikseļu krāsas gēnerēšanas tad sanāktu štiāds attēls ->



```
-- izskirtspeja 640x480
process (clk25) 
begin
  if clk25'event and clk25 = '1' then
    if (horizontal_counter >= "0010010000" ) -- 144
    and (horizontal_counter < "1100010000" ) -- 784 skaits 640
    and (vertical_counter >= "0000100111" ) -- 39
    and (vertical_counter < "1000000111" ) -- 519  skaits 480
    then
-- šeit jāaktivize bitu nolasīsana
	pixel_read <='1';
--      red_out <= horizontal_counter(3) 
--	            and vertical_counter(3);
--      green_out <= horizontal_counter(4) 
--	            and vertical_counter(4);
--      blue_out <= horizontal_counter(5) 
--	            and vertical_counter(5);
    else
--seit beidzas bitu nolasisana
	pixel_read <='0';
--      red_out <= '0';
--      green_out <= '0';
--      blue_out <= '0';
    end if;
    if (horizontal_counter > "0000000000" )
      and (horizontal_counter < "0001100001" ) -- 96+1
    then
      hs_out <= '0';
    else
      hs_out <= '1';
    end if;
    if (vertical_counter > "0000000000" )
      and (vertical_counter < "0000000011" ) -- 2+1
    then
      vs_out <= '0';
    else
      vs_out <= '1';
    end if;
    horizontal_counter <= horizontal_counter+"0000000001"; --H+1
    if (horizontal_counter="1100100000") then --ja H=784
      vertical_counter <= vertical_counter+"0000000001";  --V+1
      horizontal_counter <= "0000000000";  --H=0
    end if;
    if (vertical_counter="1000001001") then	--ja V=519
      vertical_counter <= "0000000000";  -- V=0
    end if;
  end if;
end process;

end Behavioral;
```

----------


## cobalt

Nu tev jau tur notie lasīšana no atmiņas n stuff... es patreiz cenšos dabūt baltu ekrānu  :: 
Jocīgi ka monis pasaka ka nav singāla, un pat nekādus gļukus nerāda... ir aizdoma, ka tam vga DAC'am(PDF) composite_sync(pēc zaļā.. hsync un vsync neiet caur to mikreni) vai blank inputs nesmuki uzvedas(manas vainas dēļ)..  :: .
Ganjau kāda maza kļūdiņa vnk ielasita, es saprotu ka tu aŗi lieto 25 Mhz, nevis 25.175?
Diemžēl šonedēļ laikam vairāk nebūs laika pastīties.

----------


## Epis

manai platei iekšā nav nekādu DAC čipu tur ir parasts 4 bitu rezistoru dalītājs priekš krāsām un H,V sunc ir parastais 3,3 LVTTL, varbūt uz savas plates pamēģini apiet to DAC čipa composite sync signālu, ja pareizi saprotu tad tev laikam ir kautkāds Xilinx development bords ar VGA izeju kur nāca līdzi čupa ar paraug kodiem, (man arī tādi nāca līdzi vienīgi mīnus tāds kad visa loģika bīja Verilog valodā), un tajos paraug kodos tas VGA draiveris arī ir ar RAM atmiņas bloku no kura lasa pikseļa vērtības, tas laikam kalpo kā buferis jo procesors jau nevar to pikseļu informāciju sagatavot 25Mhz ātrumā un tieši tos pikseļus kurus tagat vaidzētu sūtī (tas būtu ļoti liels un bezjēdzīgs darbs) tādēļ arī izolē to vGA draiveri no proča ar divportu RAm atmiņu ka procis pa taisno nevar iedot pikseļu vērtību VGA draiverim, to tikai var izdarīt ar RAM starpniecību un šito principu es arī tajā kodā izmantoju. 
vispār jau lai pārbaudītu vai tas tavs VGA DAC čips un plate strādā pareizi pamēģini palaist kādu no paraug kodiem ja tev monitors rāda kādu attēlu tad skaidrs kad platē problēma nav un jādomā par kodu.

es arī izmantoju 25Mhz clock un man monitors kad pieslēdzu pie plates pats automātiski pielabo attēlu nocentrējot viņu es domāju kad viņš to dara pielabojot savu iekšējo pūlksteni tiem 25Mhz tākā nekādu problēmu ar monitoram ar to kad nav tie 25,175Mhz nav.  ::

----------


## cobalt

Ar DAC'u viss ok... man jau uz plates var pārslēgt Built in self test/User kodu, self tests iet smuki..  ::  Ar oscili vel skatijos sinhroimpulsus ... vot neiedomājos jāpaskatās vai viņam zaļajā iet sinhro. Pie mana koda klusums, tapēc arī domāju varbūt man blank ir aktīvs... laigan tur es konstantu pullup(ta ka ISE shēmu zīmē tur ir tāds) padodu.

Pēc kā monitors pasaka ka viņam nav signāla? Gribētos vismaz kautkādus ķeburus dabūt.. tad varētu kautko vairāk domāt  :: .

Patreiz man "galvenā" koda daļa šāda..


```
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.all;

entity sync is
    Port ( pclk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           hsync : out  STD_LOGIC;
           vsync : out  STD_LOGIC;
			  blank : out	STD_LOGIC_VECTOR(7 downto 0));
           --x : out  STD_LOGIC_VECTOR (10 downto 1);
           --y : out  STD_LOGIC_VECTOR (9 downto 1));
end sync;

architecture Behavioral of sync is
begin
process(pclk)
		variable apixel: integer range 1 to 800;
		variable aline: integer range 1 to 525;
		--variable pixel: integer range 1 to 640;
		--variable line:	integer range 1 to 480;
	begin
	if(pclk='1')then
		if(rst='1') then
			apixel:=1;
			aline:=1;
			--pixel:=1;
			--line:=1;
			--x<="0000000000";
			--y<="000000000";
			blank<="00000000";
			hsync<='0';
			vsync<='0';
		else
			apixel:=apixel+1;
			if(apixel=96)then hsync<='1'; end if;
			if(apixel>143 and apixel<785)then
				--pixel:=apixel-143;
				--x<=std_logic_vector(to_unsigned(pixel,10));
				blank<="11111111";
			else
				blank<="00000000";
			end if;
			if(apixel=800)then
				aline:=aline+1;
				apixel:=1;
				hsync<='0';
				if(aline=4)then vsync<='1'; end if;
				if(aline>33 and aline<515) then
					--line:=aline-33;
					--y<=std_logic_vector(to_unsigned(line,9));
					blank<="11111111";
				else
					blank<="00000000";
				end if;
				if(aline=525)then
					aline:=1;
					vsync<='0';
				end if;
			end if;
		end if;
	end if;
	end process;
end Behavioral;
```

 Kur blank tiek padots uz 3 vienādiem blokiem kas maģistrāli izdala atsevišķos signālos kurus padod uz dac'a r, g un b ieejām.

Mazlied nēesmu pārliecināts par rindiņu
if(aline=4)then vsync<='1'; end if;
Jo 525-33-4=488 nevis 480 pikseļi... moš tas par īsu, varbūt, ja attēls neskaitās līdz 33'ajai līnijai tad sync'u līdz kādai 15..20 dot?

----------


## Epis

Tev tie singāli vispār ir pareizi saslēgti jo skatoties tajā DAC čipa dokumentā viņš vadās ar  blank, sync, clk signāliem un tad iet tās krāsas RED,green, blue 8 bitos, a tev tur kodā ir mistisks  blank : out   STD_LOGIC_VECTOR(7 downto 0); es šitam neredzu nekādu izskaidrojumu ?? un trūkst arī pārējo krāsu signālu (bez tiem jau nekas neies!)
kā tad īsti ir ar tiem pamat signāiem ??

----------


## cobalt

> Kur blank tiek padots uz 3 vienādiem blokiem kas maģistrāli izdala atsevišķos signālos kurus padod uz dac'a r, g un b ieejām.


 Blanlk'aa te(vhdl kodā) ir pavisam cita nozīme... pagaidām viņš tiek padots uz RGB....
un lai nua jautājumi, atlaista poga ieejā dod loģisko 1. CLK_div izejā, ir pulksteņi, kur 1mais no 0tāa ir aizkavēts par pi/2( ja godīgi neatceros kapēc ).

----------


## cobalt

ups.. (man jūk edit ar quote)..

----------


## Vikings

Kādu gadu atpakaļ es arī taisīju VGA kodu uz Altera Cyclone II un man strādāja principā ar pirmajām reizēm. Sākumā uzzīmēju pāris krāsainas līnijas beigās izmentojot iekšējo RAM uzzīmēju par nelielu bildīti. Bet tā kā tam tajā laikā nebija īpaša pielietojuma tad uztaisīju un noliku plauktiņā. Tā kā monitori pieļauj nelielas frekvenču nobīdes tad es cik atceros izmantoju 25MHz, kurus pacēlu uz augšu ar Cyclone iebūvēto PLL no 10MHz.
Cobalt, pārbaudi sinhronizācijas impulsu polaritāti. Kāds no signāliem noteikti bija negatīvi aktīvs ja ne abi. Tas varētu būt par vainu tam, ka monitors nesaprot signālu. Vēl pārbaudi vai gadījumā krāsu signāls netiek padots laikā kad teorētiski nevajadzētu būt bildei, tas var traucēt.
Ā paskatījos kodu - varbūt uztaisi lai process testē CLK signālu nevis uz 1 līmeni, bet augošo fronti? Aptuveni tā:

if (clk'event and clk='1') then...

Diemžēl, tagad savu kodu vairs nevaru atrast un lapa no kuras smēlos info par VGA arī nav atmiņā...

Starp citu, ar Alteras MAX II bija izdevies uzģenerēt arī melnbaltu kompozītvideo...

----------


## Vikings

Atradu gan lapu!
Te nu būs, manuprāt, svarīgākais par VGA. Pievērs uzmanību sinhronizācijas polaritātēm.

"VGA industry standard" 640x480 pixel mode

General characteristics

Clock frequency 25.175 MHz
Line  frequency 31469 Hz
Field frequency 59.94 Hz

One line

  8 pixels front porch
 96 pixels horizontal sync
 40 pixels back porch
  8 pixels left border
640 pixels video
  8 pixels right border
---
800 pixels total per line

One field

  2 lines front porch
  2 lines vertical sync
 25 lines back porch
  8 lines top border
480 lines video
  8 lines bottom border
---
525 lines total per field              

Other details

Sync polarity: H negative, V negative
Scan type: non interlaced.

----------


## cobalt

tāks... nu ja jau man ir uz clk process, tad tur jābūt event'am, un clk='1' pasaka to ka bija kāpjošā fronte...

hmm savādi par to polaritāti.. tu raksti ka negatīva(no lapas).. man arī pie sync iet uz 0, bet tiko atcerējos, kad ar oscili skatijos built in self test, tad sinhroimpulsi bija "uz augšu"(pozetīvi acīmredzot)...

Nu ok... mazliet padomāts ir... jāpamēģinā  ::  ... itkā nekas sarežģīts bet neiet  ::  laikam kautkur kāda kļūda...jāpārskata visi pini vai pareizi, kur inversijas kur nē n stuff.

----------


## Epis

vispār jau šitajos loģikas kodos ir baigi daudz visādu īpatnību un to koda uzvedību, specifiku īsti pēc paša koda nemaz tā sprast nevevar to tikai var redzēt kad simulē kā tie signāli iet un galvneais kādā secībā ar kādām aizturēm
Cobalt a tu to manu kodu esi mēginājis, ja nē tad pamēģini vienīgi saliec pareizi tos ārējos signālus pēc sava varianta un ietestē, šeit arī trūkstošā koda daļa je gribēsi pamēģināt palaist VGA RAM bufferi kurā vari pats ierakstīt pikseļu krāsu vbērtības tādējādi izveidot kādu TEST attēlu šeit ir trūkstošais kda bloks impulse_500Khz_CLK 


```
--šitas ir tas pats Edge_decoder kods tikai modificēts
--lai ģenerētu 1 impulsu uz katru  rising_edge 

LIBRARY ieee;
USE ieee.std_logic_1164.all;
--  Entity Declaration

ENTITY impulse_500Khz_CLK IS
	-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
	PORT
	(
		clock : IN STD_LOGIC;
		timer : IN STD_LOGIC;
		Pulse : OUT STD_LOGIC
	);
	-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
	
END impulse_500Khz_CLK;
ARCHITECTURE impulse_500Khz_CLK_architecture OF impulse_500Khz_CLK  IS
		signal E1_A :std_logic;
		signal E1_IRQ :std_Logic;
		signal BR :std_logic;
		signal BF :std_logic;
		Signal IRQ1_R : std_logic;
		Signal IRQ1_F : std_logic;
		
BEGIN

E1_A <= timer;
-- Sakumā jāuzliek kādam BF,BR biti
--/// JAUNAIS Enkodera Decoderis STRĀDĀ
process(clock) 
begin
if rising_edge(clock) then 
-- priekš Inicialixēšanas lai vismaz VIens no BR;BF ir 1
IF BF ='0' then BR <='1'; end if; 
if BR ='0' then BF <= '1'; end if;
-- Kods sākās šeit :)
if BF ='1' then  -- Ja pirms tam ir bījis Faling Edge un vairāk šāda situācija neatkārtosies
	-- jo pēc tam BF tiks nodzēsts
		if E1_A ='1' then -- Ja Enkoderis A = 1 tad
		BF <='0'; --nodzēš Fling Edge bitu jo tagat ir Rising_edge
		BR <='1'; -- Uzliek Rising Edge bitu 
		IRQ1_R <= '1'; -- Uzliek IRQ bitu
			end if;
		else  irQ1_R <= '0';
	end if;

 IF BR ='1' then 
		if E1_A ='0' then 
		BR <='0';
		BF <='1';
	--	IRQ1_F <= '1';
		end if;
	--	else IRQ1_F <='0';
	end if;
end if;
end process;
Pulse <=  IRQ1_R; --xor IRQ1_F 
--// Jaunais Dekoderis Beidzās šeit 

END impulse_500Khz_CLK_architecture;
```

----------


## cobalt

> Atradu gan lapu!
> Te nu būs, manuprāt, svarīgākais par VGA. Pievērs uzmanību sinhronizācijas polaritātēm....
> ....
>   8 pixels front porch
>  96 pixels horizontal sync
>  40 pixels back porch
>   8 pixels left border
> 640 pixels video
>   8 pixels right border
> ...


 Tiko pieķēros atkal un sāku utis meklēt...
Gribēju uzskatāmi sev sazīmēt laikus, un atdūros pret pāris jautājumiem par sīkumiem... jo:
[attachment=0:1fw5201d]untitled.GIF[/attachment:1fw5201d]
Vel tur ir 8px left un right border, tos abos galos 640 liek? jo tad sanāk tie 800  :: .
Vel jautājums via kāds zin cik ļoti var variēt tie laiki... nu piem es neskaitu visus 800 bet pie pēdējā lecu uz 1, tas var nojautk visu padarīšanu?
Vel piem., vai back porch sākas tajā 96 pikselī, kad es hsync rauju augšā, vai, skaitot no 1, 97-tītajā(tb vienu pikseli pēc hsync pāriešanas).
Tāpat, VSYNC laikā, skaidrs, ka video ir kluss, a ko hsync dara tās divas "klusās" linijas? turpina pukstēt?

----------


## Vikings

Manuprāt, ir svarīgi lai būtu visi impulsi, jo var jau būt tā, ka monitora sinhronizācijas mikrene precīzi skaita impulsus un neuztver signālu par derīgu, ja kāds impulss iztrūkst.
Kad es taisīju savu VGA, ievēroju visus impulsu skaitus kā rakstīts augstākminētajā lapā. Un taišiju visus tieši pēc kārtas kā tur rakstīts - 8pikseļi sākumā, tad Vsync uz nulli, noskaitam 96 pikseļus, Vsync uz viens, noskaitam 40+8 pikseļus, tad video un vēl 8 pikseļi. Tāpat rīkojamies ar līnijām.
Lai veicas!

----------


## cobalt

Liekas ka iet... jasak kautkas zīmēt  :: .
Vispār jau jautri ar ISE strādāt... kura programma vel šitā māk vadus savilkt:
[attachment=0:2x3amzxg]marazm.GIF[/attachment:2x3amzxg]

----------


## cobalt

.s

----------


## Vikings

> Vispār jau jautri ar ISE strādāt... kura programma vel šitā māk vadus savilkt:


 Nez, mikrenē ISE arī tāpat velk savienojumus?  ::

----------


## cobalt

Taks par to mikreni ceru, ka nē... vakar mazliet atkal pieķēros... 640x480@60Hz man monitors nosaka, un melnu ekrānu rāda... kad mēģināju zaļajā PAREIZI(ar visiem porch'iem) padot 255, nekāda reakcija... to pašu signālu(caur UN elementu, jo ISE neļauj pataisno no viena vada uz diviem output'iem vilkt) piemaucu pie LED'a... šams rāda, ka vieninieki ārā nāk, bet uz ekrāna no zaļā ne miņas... pēctam rīkojos vel brutālāk un visiem zaļā izejas bitiem piemaucu konstantu pullup... nifiga... leds kluss(izejā augsts līmenis), bet uz ekrāna ne pleķa, laigan nepiekā nepiesienās monitors.. pat nezinu kur meklēt vainu...

...ar dzelzi viss ok(built in self test veljoprojām iet bez problēmām). Iesāku domāju kādas stundiņas darbiņš trenniņam.. izvērtās par problēmu  ::  laikam rokas līkas pagaidām vel...  :: .

----------


## Vikings

Es arī tā mēģināju un nerādīja. Signāls ir jāpadod (vismaz manā gadījumā tā bija) tikai laikā kad iet 640 pixel video. Pārējā laikā signālam jābūt uz nulli. Starp citu, taviem DAC gadījumā nav vajadzīgs kaut kāds sinhronizācijas signāls?

----------


## cobalt

> Es arī tā mēģināju un nerādīja. Signāls ir jāpadod (vismaz manā gadījumā tā bija) tikai laikā kad iet 640 pixel video. Pārējā laikā signālam jābūt uz nulli. Starp citu, taviem DAC gadījumā nav vajadzīgs kaut kāds sinhronizācijas signāls?


 Njā... par VGA_OUT_PIXEL_CLOCK pavisam biju aizmirsis  ::   ::   :: .

Nu ja, kvadrats zaļš un neparasts ekrāna vidū...  :: . Lab, tagad kautkas kretīniskāks jāizdomā, ko patrenēties..
RS232 bij iesākts.. varētu pabeigt  :: .

----------


## Vikings

> kvadrats zaļš un neparasts ekrāna vidū... .


 Heh, sveicam! Tālāk ar RS232 lādēsi bildi atmiņā?  ::

----------

