vhdl'de sinyal üretimi

Başlatan demirkan1, 23 Ağustos 2011, 16:57:17

demirkan1

arkadaşlar merhaba,
hight seviyesi 90ns, low seviyesi 30ns olan sinyal üretiyorum ancak ise aşağıda yazdığım uyarı mesajılarını veriyor.
yazdığım programda aşağıda. farklı bir kod yazarak nasıl çıkarabiliriz böyle bir sinyali? yardımcı olabilirseniz memnun olurum
Saygılarımla

sentezleme'de : WARNING:Xst:737 - Found 1-bit latch for signal <CP>. Latches may be generated from incomplete case or if statements.
We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.

map ve Generate 'de: WARNING:PhysDesignRules:372 - Gated clock. Clock net CP_cmp_eq0000 is sourced by
   a combinatorial pin. This is not good design practice. Use the CE pin to
   control the loading of data into the flip-flop.


process (clk)
   variable say_up:integer:= 0;
   variable say_down:integer:= 0;
   begin
      if (clk'event and clk='1')then
         say_up:=say_up+1;   
      end if;
      if (clk'event and clk='0')then
         say_down:=say_down+1;   
      end if;
      if (say_up=1)then   
         CP<= '1';
         say_down:=0;
      end if;
      if (say_down=4)then   
         CP<= '0';
      end if;
      if (say_up=7)then   
         CP<= '1';
         say_down:=0;
         say_up:=1;
      end if;
  end process;



demirkan1

sorumun cevabını buldum arkadaşlar
after komutuymus
örnegin : CP<= '0' after 10ns;


muuzoo

Alıntı yapılan: demirkan1 - 24 Ağustos 2011, 09:47:01
sorumun cevabını buldum arkadaşlar
after komutuymus
örnegin : CP<= '0' after 10ns;

Aslında derleyicinin verdiği uyarılar tamamen tasarımınızla alakalı. Yazdığınız process yapısı çok iyi tasarlanmış bir yapı değil. Biraz daha üzerinde çalışılması lazım.

Ayrıca bazı komutlar sentezlenemeyn komutlardır. VHDL sadece tasarım için değil aynı zamanda benzetim için de kullanıldığından tasarım aşamasında deneme işlemlerini kolaylaştırmak adına (testbench yazarken) "after" gibi bazı komutlara sahiptir. Benzetim yaparken kolaylık sağlar ama sentezlenemez.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

90alper90

Sayın muuzoo'nun da dediği gibi after komutu sentezlenmeyen bir komuttur. Bunu FPGA içine koymanız mümkün değildir. Sadece simülasyon amaçlı çalıştırmalarda kullanabilirsiniz, örneğin bir "testbench waveform" yaratırken.

Xilinx ISE size latch yapısı oluştuğunu söylüyor ki bu da iyi bir şey değildir. Burada process(clk) içerisine yazdığınız clk bilgisi içermeyen if koşulları içerisindeki atamalar sorun yaratıyor olabilir.

demirkan1

evet dogru söylüyorsunuz simülasyonda 10ns geçikmeli oluyor ancak osilaskopla baktım gerçek ordamda yok peki bunu nasıl başaracağız high seviyesi 90ns low seviyesi 30ns kare dalgaya ihtacım var. daha önce böyle bir uygulama yapan oldumu acaba bir fikir verebilirmisiniz. son yazdığım kod aşağıda ancak after komutu sentezlenmiyor

process (clk)
   variable say:integer:= 0;
   begin
   if (clk'event and clk='1')then
      say:=say+1;   
         if (say=1)then   
            CP<= '1';
         end if;
         if (say=5)then
            CP<= '0' after 10 ns;
         end if;
         if (say=6)then   
            say:=0;     
         end if;
   end if; 
   end process;

muuzoo

Aşağıda istediğiniz işi yapan kod parçacığı eklenmiştir. Çalışma frekansı 100MHz olarak kabul edilmiştir. 100MHz Çalışma frekansı 10ns'lik bir periyot oluşturur.

process(clk)
   variable sayac : integer range 0 to 11:=11;
begin
 if(rising_edge(clk)) then
   if(sayac>2) then
      cp <= '1';
      sayac := sayac - 1;
   elsif(sayac>0) then
      cp <= '0';
      sayac := sayac - 1;
   elsif(sayac=0) then
      sayac := 11;
   end if;
 end if;
end process;
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

demirkan1

Sn. muuzoo
ilgine ve yardımına teşekkür ederim ancak 50mhz osc. frekansım var her period 20ns oldugundan dolayı takıldım. benim yazdığımda sizin vermiş oldugunuz örnege benzer. benim yapamadığım bir periodun yarında low a çekmek, projem 100mhz olsaydı sorun yoktu. 50mhz de 90ns high, 30ns low yapmak istiyorum ancak yapamadım bu konuda yardımlarınızı beklerim, yoluma devam edebilmem için vhdl ustalarından bir kıvılcım bekliyorum. "Bana balık vermeyin, tutmasını ögretin"

muuzoo

#7
Kodu karmaşıklaştırmadan yapacak olsaydım şöyle yapardım. Yanlış hatırlamıyorsam Spartan3 serisi fpga kullanıyorsunuz. Bu fpga da bulunan DCM modülünü kullanarakar 50 Mhz'lik kaynak frekansımı 100Mhz'e çıkarır sonra işlem yapardım.
App-Note: www.xilinx.com/support/documentation/application_notes/xapp462.pdf

Ama farklı bir çözüm isterseniz -şahsi olarak DCM çözümünü kullanırdım- , şöyle bir yaklaşım işinizi görecektir:
Yalnız bu kodun çalışması için Xilinx'e ait özel bir kütüphanenin eklenmesi lazım;

library UNISIM;
use UNISIM.VComponents.all;


BUFG_inst : BUFG
   port map (
      O => clk_n,     -- Clock buffer output
      I => clk_50_n      -- Clock buffer input
   );   

clk_50_n <= not clk;
clk_100  <= clk xor clk_n;

process(clk_100)
   variable sayac : integer range 0 to 11:=11;
begin
 if(rising_edge(clk_100)) then
   if(sayac>2) then
      cp <= '1';
      sayac := sayac - 1;
   elsif(sayac>0) then
      cp <= '0';
      sayac := sayac - 1;
   elsif(sayac=0) then
      sayac := 11;
   end if;
 end if;
end process;


Yaptığım benzetim sonuçlarına göre bu kod istediğiniz gibi çalışıyor gözüküyor fakat ps'ler mertebesinde de olsa bir miktar faz farkı olacaktır. Çünkü kaynak clk işaretimizi ilk önce "not" kapısı ile tersliyoruz.Kapıdan kaynaklı çok çok düşük bir gecikme eklendi. Terslediğimiz sinyali daha sonra "Global Clock Buffer" a giriyoruz. Ordan aldığımız çıkşı da bir "xor" kapısı ile birleştirip 100MHz'lik sinyalimizi elde ediyoruz. Arada yapılan işlemler nediniyle bir miktar gecikme olacaktır. Ayrıca bu üretilen clk her ne kadar girişin iki katı olsa da "duty cycle" %50 değildir. O yüzden ne kadar sağlıklı olur emin değilim.

Aslında bu kodun çalışmasını da sağlayan şey sinyalde oluşturduğumuz gecikme :)

BUFG ile ilgili kaynak : www.xilinx.com/itp/xilinx8/books/docs/s3edl/s3edl.pdf
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

demirkan1

sn. muuzoo teşekkür ederim en son mesajımdan sonra yurtdışındaydım projemle ilgilenemedim verdiğin bilgiler dogrultusunda DCM modülünü deneceğim


pic365

Eğer bu sinyali clock olarak kullanacaksanız DCM veya PLL haricinde bir şey kullanmanızı tavsiye etmem. Core Generator'da Clocking Wizard'dan input clock'u 50Mhz, output clock'u 8.33Mhz, duty cycle'ı da %75 seçerek istediğiniz sinyali elde edebilirsiniz.