FPGA ile Flasher LED

Başlatan turkplc, 10 Kasım 2009, 20:32:53

turkplc

-- Spartan 3E XC3S500E
-- Flasher LED
-- www.cemalettinalbayrak.com
-- turkplc@qmail.com

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

entity b is
   Port ( LED0 : out  STD_LOGIC;
         clk : in  STD_LOGIC);
end b;

architecture Behavioral of b is
   signal FF:std_logic;
begin
   process (clk)
   variable say:integer;
   begin
   if (clk'EVENT and clk='1') then
   say:=say+1;
      if (say>25000000) then
      say:=0;
      FF<=not FF;
      LED0<=FF;
      end if;
   end if;
   
   end process;

end Behavioral;

--UCF
NET "LED0" LOC = "F12";
NET "clk" LOC ="C9";
NET "clk"  period = 20 ns high 50 %;

aykut54

hocam mazur görün bir şey soracağım FPGA türkiyede satılıyormu.FPGA ile yazmış olduğunuz bu kodun simülasyonu için hangi program kullanıyorsunuz?

turkplc

Spartan 3E starter kit deneme bordu ile bu kodu çalıştırtım. Derleyicisi Xilinx ISE programıdır. Empa elektronik bu bordları satıyor olması lazım. Saygılarımla

turkplc

-- Spartan 3E XC3S500E
-- LED Animasyon (Yürüyen Işık)
-- www.cemalettinalbayrak.com
-- turkplc@qmail.com
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity b is
   Port ( LED : out  STD_LOGIC_vector(7 downto 0) ;
         clk : in  STD_LOGIC);
end b;

architecture Behavioral of b is
   signal FF:std_logic_vector (7 downto 0);
begin
   process (clk)
   variable say:integer;
   begin
   if (clk'EVENT and clk='1') then
   say:=say+1;
      if (say>10000000) then
      say:=0;
      FF<=FF(6 downto 0)& "0";
      if (FF="00000000") then FF<="00000001";
      End if;
      LED <= FF;
      end if;
   end if;
   
   end process;

end Behavioral;

--UCF File
NET "LED<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "clk" LOC = "C9" | IOSTANDARD = LVCMOS33 ;
NET "clk"  period = 20 ns high 50 %;

turkplc

-- Spartan 3E XC3S500E
-- LED Animasyon (Karaşimşek)
-- www.cemalettinalbayrak.com
-- turkplc@qmail.com

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

entity b is
   Port ( LED : out  STD_LOGIC_vector(7 downto 0) ;
         clk : in  STD_LOGIC);
end b;

architecture Behavioral of b is
   signal FF:std_logic_vector (7 downto 0);
   signal k :std_logic;
   
begin
   process (clk)
   variable say:integer;
   begin
   if (clk'EVENT and clk='1') then
   say:=say+1;
      if (say>10000000) then
      say:=0;
         if (k='0') then
         FF<=FF(6 downto 0)& "0";
         else
         FF<= "0" & FF(7 downto 1);
         end if;
         
         if (FF="00000000") then
         FF<="00000001";
         end if;
         if (FF="00000001") then
         k<='0';
         elsif (FF="01000000") then
         k<='1';
         End if;
      LED <= FF;
      end if;
   end if;
   
   end process;

end Behavioral;


-- UCF File
NET "LED<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "clk" LOC = "C9" | IOSTANDARD = LVCMOS33 ;
NET "clk"  period = 20 ns high 50 %;

turkplc

Önerilerin için teşekkür ediyorum FxDev. Bende senin siteni inceledim sende gerçekten güzel işler yapmışsın. şuan ben FPGA ile mikrocontroller tasarımı üzerinde çalışıyorum. Fakat sen zaten mikro işlemci tasarlamışsın. tebrik ederim. Saygılarımla

turkplc

Anladım fakat ben kendim yapmak istiyorum başlangıç için daha sonra 32 bitlik gelişmiş birşey yapmak istiyorum.

turkplc

FxDev Cpu-Turkey yarışmasına katıldınız mı?  Ege üniversitesinden baya katılan olmuştu.

turkplc

2010 Da düzenlenecek diye biliyorum. ben şimdiden hazırlanıyorum. Türkiye için çok faydalı oldu o yarışma üniversitelere bedava deneme bordu verdiler.

turkplc

-- Spartan 3E XC3S500E
-- 2X16 LCD 4 BIT MODE "TURKPLC" 
-- www.cemalettinalbayrak.com
-- turkplc@qmail.com

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

entity b is
    Port ( LED : out  STD_LOGIC_vector(7 downto 0) ;
			 clk : in  STD_LOGIC;
			
			DB : out  STD_LOGIC_VECTOR (7 downto 4); 
			LCD_E :out STD_LOGIC;
			LCD_RS :out STD_LOGIC;
			LCD_RW :out STD_LOGIC);

end b;

architecture Behavioral of b is
	Signal StopTimer:std_logic;
	Signal DATA : STD_LOGIC_VECTOR (7 downto 0);
begin



	
	process (clk)
	variable say1:integer;
	variable say2:integer;
	begin
	if (clk'EVENT and clk='1') then
	if (StopTimer='0') then 
	say1:=say1+1;
	end if;
		if (say1>50000) then	--1 KHZ
		say1:=0;
		say2:=say2+1;
			case say2 is
			when 90=>
				LCD_RW<='0';
				LCD_RS<='0'; --CMD
				DB<="0011";
			when 99=>LCD_E<='1';
			when 100=>LCD_E<='0';
			when 115=>LCD_E<='1';
			when 116=>LCD_E<='0';
			when 121=>LCD_E<='1';
			when 122=>LCD_E<='0';
			when 127=>DB<="0010";
			when 128=>LCD_E<='1';
			when 129=>LCD_E<='0';

			
			when 149=>DATA<=X"28";
			when 150=>DB<=DATA(7 downto 4);
			when 151=>LCD_E<='1';			
			when 152=>LCD_E<='0';
			when 153=>DB<=DATA(3 downto 0);
			when 154=>LCD_E<='1';
			when 155=>LCD_E<='0';			
			DATA<=X"08";

			when 156=>DB<=DATA(7 downto 4);
			when 157=>LCD_E<='1';			
			when 158=>LCD_E<='0';
			when 159=>DB<=DATA(3 downto 0);
			when 160=>LCD_E<='1';
			when 161=>LCD_E<='0';				
				DATA<=X"01"; 
			when 162=>
				DB<=DATA(7 downto 4);
			when 163=>LCD_E<='1';			
			when 164=>LCD_E<='0';
			when 165=>DB<=DATA(3 downto 0);
			when 166=>LCD_E<='1';
			when 167=>LCD_E<='0';	
				DATA<=X"06";
			when 168=>
				DB<=DATA(7 downto 4);
			when 169=>LCD_E<='1';			
			when 170=>LCD_E<='0';
			when 171=>DB<=DATA(3 downto 0);
			when 172=>LCD_E<='1';
			when 173=>LCD_E<='0';
				DATA<=X"0C";
			when 174=>
				DB<=DATA(7 downto 4);
			when 175=>LCD_E<='1';			
			when 176=>LCD_E<='0';
			when 177=>DB<=DATA(3 downto 0);
			when 178=>LCD_E<='1';
			when 179=>LCD_E<='0';			
			
			when 180=>LCD_RS<='1'; --Chr
				DATA<=X"54"; --T
			when 181=>
				DB<=DATA(7 downto 4);
			when 182=>LCD_E<='1';			
			when 183=>LCD_E<='0';
			when 184=>DB<=DATA(3 downto 0);
			when 185=>LCD_E<='1';
			when 186=>LCD_E<='0';	
				DATA<=X"55"; --U
			when 187=>
				DB<=DATA(7 downto 4);
			when 188=>LCD_E<='1';			
			when 189=>LCD_E<='0';
			when 190=>DB<=DATA(3 downto 0);
			when 191=>LCD_E<='1';
			when 192=>LCD_E<='0';	
				DATA<=X"52"; --R
			when 193=>
				DB<=DATA(7 downto 4);
			when 194=>LCD_E<='1';			
			when 195=>LCD_E<='0';
			when 196=>DB<=DATA(3 downto 0);
			when 197=>LCD_E<='1';
			when 198=>LCD_E<='0';
				DATA<=X"4B"; --K
			when 199=>
				DB<=DATA(7 downto 4);
			when 200=>LCD_E<='1';			
			when 201=>LCD_E<='0';
			when 202=>DB<=DATA(3 downto 0);
			when 203=>LCD_E<='1';
			when 204=>LCD_E<='0';
				DATA<=X"50"; --P
			when 205=>
				DB<=DATA(7 downto 4);
			when 206=>LCD_E<='1';			
			when 207=>LCD_E<='0';
			when 208=>DB<=DATA(3 downto 0);
			when 209=>LCD_E<='1';
			when 210=>LCD_E<='0';
				DATA<=X"4C"; --L
			when 211=>
				DB<=DATA(7 downto 4);
			when 212=>LCD_E<='1';			
			when 213=>LCD_E<='0';
			when 214=>DB<=DATA(3 downto 0);
			when 215=>LCD_E<='1';
			when 216=>LCD_E<='0';
				DATA<=X"43"; --C
			when 217=>
				DB<=DATA(7 downto 4);
			when 218=>LCD_E<='1';			
			when 219=>LCD_E<='0';
			when 220=>DB<=DATA(3 downto 0);
			when 221=>LCD_E<='1';
			when 222=>LCD_E<='0';

			when 1000=>lED<=X"00";
			when 1200=>lED<=X"01";
			when 1400=>lED<=X"02";
			when 1600=>lED<=X"04";
			when 1800=>lED<=X"08";
			when 2000=>lED<=X"10";
			when 2200=>lED<=X"20";
			when 2400=>lED<=X"40";
			when 2600=>lED<=X"80";
			
			when 3000=>--StopTimer<='1';
			when others=>
			end case;
		
		end if;
	end if;
	end process;

end Behavioral;

-UCF FILE
NET "LED<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "LED<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "clk" LOC = "C9" | IOSTANDARD = LVCMOS33 ;
NET "clk"  period = 20 ns high 50 %;

NET "LCD_E" LOC = "M18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "LCD_RS" LOC = "L18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "LCD_RW" LOC = "L17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "DB<4>" LOC = "R15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "DB<5>" LOC = "R16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "DB<6>" LOC = "P17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "DB<7>" LOC = "M15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;

turkplc

yukarıdaki örnekte FPGA bir işlemci gibi kullanılarak seri işlem yaptırılmıştır. Bu yöntem ile picoblaze microblaze gibi gömülü kontrolcüler kullanılmaya gerek kalmadan LCD sürülmüştür. LCD de TURKPLC yazdırılmıştır ve deneme bordundaki 8 adet led sırayla 200 ms aralıklarla yakılmıştır.

teknikelektronikci

#11
üstad elinize sagliik cok güzel calismalar
benim bir  sorum olacak fpga ögrenmeye calisiyorumda sormak istediigm architecture altinda 2 tane procces kulanamazmiyiz acaba ? bildiigm kadari ile proces icindekiler seri calisir processler ise kendi aralarinda paralel böylece amacim 1.proces de led yakip söndürmek ikincisinde ise diger ledlerle baska bir sey yapmak mesela sizin karasimsek v.s ama 2 farkli process yapinca hata veriyor acaba bir yerde hatami yapiyorum simdiden tesekürler


problemi cözdüm tesekürler
2 tane begin kullanmisim su an 2 farkli islem yaptirtiyorum ikiside paralel calisiyor :) sayenizde fpga yi ögrencez hocam :)
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

turkplc

Selam teknikelektronikci
picprojeye uzun zamandır girmiyordum. Mesajını yeni gördüm. kusura bakma
Faydalı olabildiysem ne mutlu bana.
iyi günler

teknikelektronikci

hocam merhaba
programlarinizi denerken bir sorunla karsilasdim o da belli bir süreden sonra led flash yapmais veya animasyon yapmais
sanirim
variable say:integer;  bu say degerini 0 atamak gerekyior ben cözümü variable degilde integer ollarak tanimlayip en ba$da sifirladim alttaki ile sorunsuz calisiyor

library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity DE0_TOP IS

PORT 
(
----INPUTS----------------------------------------------------------------------------
						CLOCK_50 		:	IN STD_LOGIC;
					

						BUTTON 			:   IN STD_LOGIC_vector(2 DOWNTO 0);
						SW					:   IN STD_LOGIC_vector(3 DOWNTO 0);

----OUTPUTS---------------------------------------------------------------------------
						LEDG 				:   OUT STD_LOGIC_vector(9 DOWNTO 0) :="0000111111"; 

						HEX0_D 			:   OUT STD_LOGIC_vector(6 DOWNTO 0) :="1000000"; -- GFEDCBA
						HEX1_D 			:   OUT STD_LOGIC_vector(6 DOWNTO 0) :="1110111";
						HEX2_D 			:   OUT STD_LOGIC_vector(6 DOWNTO 0) :="0000110";
						HEX3_D 			:   OUT STD_LOGIC_vector(6 DOWNTO 0) :="0100001";

						HEX0_DP 			:   OUT STD_LOGIC :='1';
						HEX1_DP 			:   OUT STD_LOGIC	:='1';
						HEX2_DP 			:   OUT STD_LOGIC :='1';
						HEX3_DP 			:   OUT STD_LOGIC :='1'
);
end DE0_TOP;



architecture donanim of DE0_TOP is
signal DRIVE_LED:std_logic_VECTOR (9 DOWNTO 0);
signal say:integer :=0  ;
signal reset: std_logic:='0';



begin 

process (CLOCK_50) 
begin 


if (CLOCK_50'EVENT AND CLOCK_50='1') THEN
SAY<=SAY+1;
IF (SAY> 25000000) THEN
SAY<=0;
DRIVE_LED<= NOT DRIVE_LED;
LEDG<=DRIVE_LED;
END IF ;
END IF ;



end process;
end donanim;
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

pic365

Alıntı yapılan: FxDev - 11 Kasım 2009, 16:08:01

process (clk)

şeklinin içine kullanılan signal değişkenleri de yazılmalıdır.


Clock'lu process'lerde parantez içine sadece clock ve varsa asenkron reset yazılır, bir yanlışlık olmasın.