Vhdl led yakma ve hız kontrolü

Başlatan rumpi, 12 Ocak 2013, 23:01:43

speak48

2 günde öğrenilcek şey değil ben 2 yılımı verdim.
benim verilog kodunu inceledinizmi.
sentezledinizmi simulation yada fpgada denedinizmi.
peki ben hangi devreyi yazmışım görebildinizmi

rumpi

verilog tan vhdl e çeviren bir program buldum onunla çevirmeye çalışıyorum senin kodunu

pic365

Alıntı yapılan: rumpi - 13 Ocak 2013, 21:19:50
verilog tan vhdl e çeviren bir program buldum onunla çevirmeye çalışıyorum senin kodunu

Eğer lazım olursa kodun VHDL'e çevrilmiş hali aşağıda. Fakat modülün içeriğini değiştirmeyecekseniz VHDL'de sadece component'i yazıp doğrudan Verilog modülünü de çağırabilirsiniz.

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

entity ledyak is
   port(
      clk      : in  std_logic;
      reset    : in  std_logic;
      hizlan   : in  std_logic;
      yavasla  : in  std_logic;
      leds     : out std_logic_vector(7 downto 0)
   );
end entity;

architecture rtl of ledyak is

signal cntled  : std_logic_vector(2 downto 0);
signal cntclk  : std_logic_vector(31 downto 0);
signal regtmr  : std_logic_vector(31 downto 0);

begin

process(cntled) begin
   case cntled is
      when "000"   => leds <= "00000001";
      when "001"   => leds <= "00000010";
      when "010"   => leds <= "00000100";
      when "011"   => leds <= "00001000";
      when "100"   => leds <= "00010000";
      when "101"   => leds <= "00100000";
      when "110"   => leds <= "01000000";
      when "111"   => leds <= "10000000";
      when others  => leds <= "00000000";
   end case;
end process;

process(clk, reset) begin
   if(reset='1') then
      cntled <= (others=>'0');
      cntclk <= (others=>'0');
      regtmr <= x"02FAF080";
   elsif(clk'event and clk='1') then
      if(cntclk=regtmr) then
         cntclk <= (others=>'0');
         cntled <= cntled + '1';
      else
         cntclk <= cntclk + '1';
      end if;
      
      if(hizlan='1') then
         regtmr <= '0' & regtmr(31 downto 1);
      elsif(yavasla='1') then
         regtmr <= regtmr(30 downto 0) & '0';
      else
         regtmr <= regtmr;
      end if;
   end if;
end process;

end architecture;

speak48

sanırım elle çevirdiniz
bukadar iyi çevirici program tanımıyorum.

pic365

Alıntı yapılan: speak48 - 14 Ocak 2013, 15:03:53
sanırım elle çevirdiniz
bukadar iyi çevirici program tanımıyorum.

Evet elle çevirdim.

rumpi

Çok sağolun inanın yardımcı oldu,kodu anlamaya çalışıyorum

rumpi

Led'lere pin ataması yapmam gerekecek mi ?

speak48

tüm giriş  çıkışları fpganın pinlerine bağlaman lazım
sadece clk bağlasanda çalışır ama giriş çıkış almadığın için ne çalıştığını göremezsin.

eğer benim kodları çalıştıracaksan girişleri button için kullanılabilir hale getirmelisin
yoksa sen bir kere butona basan bile 50mhz de kontrol yaptığı için o anda çok fazla giriş yapmışsın sanacaktır.
çok hızlı yavaşlar veya hızlanır
hızlanırsa  okadar çok hızlanır ki  yanıp sönmeyi farkedemez hale gelir.

rumpi

ucf file 'a ihtiyaç yok mu
clk ve leds girişini board üstündeki clock ve ledler olarak nasıl atayayım
kod çalışıyor olsa da board üstünde clk 'yı kitin kendi clock'una atamazsam nasıl çalışacak , ledler için de aynı durum geçerli,anlayamadım

pic365

Alıntı yapılan: rumpi - 15 Ocak 2013, 09:49:22
ucf file 'a ihtiyaç yok mu
clk ve leds girişini board üstündeki clock ve ledler olarak nasıl atayayım
kod çalışıyor olsa da board üstünde clk 'yı kitin kendi clock'una atamazsam nasıl çalışacak , ledler için de aynı durum geçerli,anlayamadım

Evet clock, led ve butonları ucf dosyasında atamanız lazım. Kitin dökümanında hangi pinin nereye bağlanacağı yazıyordur.

speak48'in söylediği 'hizlan' ve 'yavasla' girişleriyle ilgili. Bu pinleri doğrudan butonlara bağlarsanız düzgün çalışmaz. 'Debounce' devresinden geçirmeniz lazım.

rumpi

Teşekkür ederim.

Asıl sorum oradaydı debounce yazılımı hazır olarak sanırım vhdl dosyaları içinde hazır olarak görmüştüm
debounce devresini entity ' ye ekleyip
architectural behavioral'da bu girişleri yeni haliyle mi sokmalıyım kodlara,yani kodların değişmesi lazım

bu arada spartan 3e kitine bağladım yazılımı doğru da yükledim ama sanırım debounce sorunundan ya da başka birşeyden led'ler yanmadı bu yazılım ile
sadece sağ alttaki switchlerin 3 tanesini high yaptıkça yanan led bir sola ötelendi,ki bu yazılımda o butonlarla alakalı bir satır yok..biraz kafam karıştı açıkçası :) yardımcı olursanız sevinirim

speak48

#26
bu yazdığımız yazılım değil yav
burda devre tasarlıyoruz
ne yaptığımız bilmezsek elbette yanlış yaparız.

sorunundada dediklerinden şunu anlıyorum
pin atamalarını yanlış yapmışsın.
devrenin içinde button falan olmaz button devreye bağlanır.
buda pin atamasıyla yapılır.
clk haricindeki girişlere 0 veririsen clk girişinide clock kaynağına bağlarsan ledler her 1snyede  kayacaktır.


rumpi

spartan 3 e kitinin tutorial'ından led 0- led7 arası ucf kodlarını kopyaladım ve yapıştırdım
clock da aynı şekilde
board'un üstündeki butonlardan kuzey'dekini hızlan girişi olarak alıp
güneydekini yavaşla pini olarak atadım
bunların da ucf file larını standarda göre kopyaladım yapıştırdım
buraya kadar doğru sanırım
board a yükledim yazılımın doğru yüklendiğini belirten en sağdaki led yandı
boundary scan ekranıydı sanırım orda gereken işlemleri yapıp daha sonra işlemciyi seçip (xcf04s gibi birşeydi sanırım) "program" a tıkladığımda yazılımın çalışması gerekmez mi?
Yaptım çalışmadı ama yine board üstündeki switchlerin en sağdaki üçünü 1 er 1 er high yapınca az önce yanan led sadece birer sola kaydı sanırım bunun bizim yazılımla alakası yok çalışıyor olduğunu gösteriyor sadece
yanlış yaptığım yeri uyarırsanız sevinirim

rumpi


speak48

xilinxin tasarım şeklini tam olarak bilmiyorum ben altreracıyım.
dediğimi denedinizmi clk harici girişleri 0 yapıb çalıştırmayı.
eğer bu  şekildeyken ledler 1 snyede kaymıyorsa sorun olduğu ozaman anlaşılır.