Fpga'de 50MHz'den 10MHz üretmek

Başlatan vitruvius, 07 Haziran 2012, 13:03:44

vitruvius

Merhaba, 50MHz clock kullanarak 10MHz nasıl üretebilirim? Aşağıdaki gibi bir kod yazdım, çıkışın periyodu 100ns oluyor fakat doluluk oranı %50 değil. %60 dolu, %40 boş. Doluluk oranını nasıl %50 yapabilirim? Bu sinyali haberleşmek istediğim amp'linin clk girişine vereceğim. Aşağıda amplinin ve Spartan-3E User Guide'ın datasheetini var.

Yazdığım kod:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity clk_deneme_4 is
port(   Clk : in std_logic;
        Cikis : out std_logic        
        );
end clk_deneme_4;

architecture Behavioral of clk_deneme_4 is

signal counter : integer := 0;
signal bolum : integer :=5; --Clock 50MHz, istediğim 10Mhz -> 50/10=5
begin

process(Clk) 
begin
    if( rising_edge(Clk) ) then
        if(counter < bolum/2-1) then
            counter <= counter + 1;
            Cikis <= '0';
        elsif(counter < bolum-1) then
            counter <= counter + 1;
            Cikis <= '1';
        else
            Cikis <= '0';
            counter <= 0;
        end if; 
    end if;
end process;    

end Behavioral;


Amplinin zaman diyagramı:


Amplinin datasheeti: http://cds.linear.com/docs/Datasheet/6912fa.pdf
Spartan-3E Starter Kit (İlgili kısım sayfa 75'te başlıyor): http://www.xilinx.com/support/documentation/boards_and_kits/ug230.pdf

Teşekkürler.

speak48

clock üreten ip var onu kullancan. alterada pll diye geçiyor xilinxte dcm gibi bişeydi diğital clock manegement.
bu araçla fpgada bulunan clock üretici donanıma istediğiniz ayarı verip her türlü clock sinyalini üretebiliyonuz

vitruvius

Bu hoş olmadı, daha önce ip hiç kullanmadım. Sanırım CORE Generator ile yapıyoruz bu işi ama çözemedim. Aratarak aşağıdaki resimde verdiğim kısmı buldum. Sol taraftan DCM'lerden herhangi birini seçsem de "there is no project open" diyor. Programın nasıl kullanıldığını biliyor musunuz?


muuzoo

gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

vitruvius

Hocam çok çok teşekkür ederim. Bu .vhi dosyasını nasıl kullanacağım? Port map'teki eşleştirmeleri nasıl yapmam lazım, çok çıkış var burada  :)

vitruvius

Hocam videonuzdaki işlemleri "Virtex 5" yerine "Spartan-3E"yi seçerek aynısını yaptım. Daha önce component de kullanmadığımdan yamak'ın vaktinde vermiş olduğu bir örnek vardı ona bakıp aşağıdaki gibi bir uygulama yaptım. Simulasyonda baktığımda istediğim kare dalga 230.ns'den itibaren başladığını gördüm. Benim mi bir hatam oldu kodlarda? Ama istediğim gibi %50 doluluk oranına ulaştım, orada sorun olmadı.

Kodum:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.all;

entity clk_deneme_3 is
    Port ( clk : in  STD_LOGIC;
			  reset : in std_logic:='0';
           cikis : out  STD_LOGIC);
end clk_deneme_3;

architecture Behavioral of clk_deneme_3 is

signal div : std_logic;

COMPONENT clock_divide
	PORT(
		CLKIN_IN : IN std_logic;
		RST_IN : IN std_logic;          
		CLKFX_OUT : OUT std_logic;
		CLKIN_IBUFG_OUT : OUT std_logic;
		CLK0_OUT : OUT std_logic;
		LOCKED_OUT : OUT std_logic
		);
	END COMPONENT;

begin

	Inst_clock_divide: clock_divide PORT MAP(
		CLKIN_IN =>clk,
		RST_IN =>reset,
		CLKFX_OUT =>div
	);

cikis<=div;
end Behavioral;


Simulasyon:


vitruvius

Hocam bir şey soracağım, core generator'dan 10MHz elde etmek için CLKIN_IN girişine 50MHz'lik clk'u verdim. Bu 50MHz'lik clk'u başka bir yerde kullanamıyor muyum? Mesela clk'a bağlı bir process yazmak istediğimde aşağıdaki hatayı alıyorum.

Port <clk> has illegal connections. This port is connected to an input buffer and other components.

muuzoo

Alıntı yapılan: vitruvius - 09 Haziran 2012, 13:39:40
Hocam bir şey soracağım, core generator'dan 10MHz elde etmek için CLKIN_IN girişine 50MHz'lik clk'u verdim. Bu 50MHz'lik clk'u başka bir yerde kullanamıyor muyum? Mesela clk'a bağlı bir process yazmak istediğimde aşağıdaki hatayı alıyorum.

Port <clk> has illegal connections. This port is connected to an input buffer and other components.

DCM çıkışındaki clk0'ı kullanın.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

vitruvius

Teşekkür ederim hocam. Bir de bu CLKFX_OUT'ın 230.ns'de başlaması benim hatam mı?

muuzoo

#10
Alıntı yapılan: vitruvius - 09 Haziran 2012, 14:00:09
Teşekkür ederim hocam. Bir de bu CLKFX_OUT'ın 230.ns'de başlaması benim hatam mı?

Sistem oturuna kadar bir miktar gecikme olabilir diye tahmin ediyorum Ama emin olmak için klavuza bakmak lazım. Ayrıca sizin durumunuzda CLKFX yerine CLKDIV çıkışı kullnarak giris frekansını 5'e bölerek de 10 mhz elde edebilirsiniz. CLKFX kullanmak yerine CLKDIV kullanmak sizin durum için daha mantıklı. Bir ihtimal gecikme süresi de düşebilir.

Ek olrak DCM çıkışlarından LOCK çıkışı '1' ise çıkışlar oturmuş ve kullanıma hazırdır demek. 0 ise henüz çıkışların henüz kararlı olmadığını belirtir. Bu kontrolü de yapmanızı tavsiye ederim.

Parça parça oldu ama ayrıntılı bilgi için XAPP462 dosyasını inceleyin.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

vitruvius

Evet hocam az önce tüm çıkışları simüle ederek neyin ne olduğunu gördüm. Teşekkür ederim. FX ve DIV'i de karşılaştırdım. İkisi de 230. ns'de başlıyor. Mühim bir şey değil, sadece benim hatam mı oldu onu bilmek istemiştim. Tekrar teşekkür ederim.

muuzoo

Alıntı yapılan: vitruvius - 09 Haziran 2012, 14:23:01
Evet hocam az önce tüm çıkışları simüle ederek neyin ne olduğunu gördüm. Teşekkür ederim. FX ve DIV'i de karşılaştırdım. İkisi de 230. ns'de başlıyor. Mühim bir şey değil, sadece benim hatam mı oldu onu bilmek istemiştim. Tekrar teşekkür ederim.

Yalnız o 230ns her zaman için geçerli olmayabilir. Netice de benzetim ortamında test ediyorsunuz ve gecikme için böyle bir değer belirlenmiş olabilir. Gerçekte sisteminiz daha kısa sürede hazır olabilir. Kullanılan frekans ve yapılan işleme göre o süre değişecektir diye tahmin ediyorum.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

vitruvius

Dediğiniz gibi LOCKED'u kontrol edip işlemlere başlarsam bir sorun olmaz diye düşünüyorum hocam.

kralsam

Biraz geç oldu ama konunun daha da oturması için gecikmeye bir açıklama yapmak istedim. Aynı zamanda başka arkadaşlara da yardımı olabilir.

Kullanmakta olduğunuz API yonga içerisinde bulunan bir bölümü kullanmanıza olanak tanıyor. Ben Altera kullanıyorum ve ondaki yapı PLL yapısı. Xilinx de benzer bir yapı kullanıyor. Gecikme buradan kaynaklanıyor. İstenen frekansa kilitlenme süresi var. Kilitlendikten sonra sıkıntı olmaz. Ayrıca bu yapı sayesinde frekans katlanabiliyorda.

Diğer yöntem olarak bir arkadaşında yazdığı gibi 10MHz çok kritik değilse bölme işlemi daha hızlı olur. Onuda sayaç dolduğunda başka bir process içerisinde bir register i toogle ederek yapabilirsin. Doluluk oranı clk kaynağında ne ise öyle olacaktır.

İyi çalışmalar.