Vhdl led yakma ve hız kontrolü

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

rumpi

hizlan ve yavaslayı zaten butonlara atadım,reset zaten sadece process içinde tanımlı
hangi girişi sıfıra çekmem gerekiyor bu durumda

speak48

reset denilen şeyde  bir giriştir ve pine bağlanır.
siz sadece clocku ve ledleri bağlayın hızlan yavaş resete 0 verin
öyle bir çalıştırın.
tahminen butonlarınızın normal girişi 1 basınca 0 oluyor ozamanda çalışmaz.

rumpi

in olan her girişe bir buton atadım zaten programı yükleyip "program" a tıklayınca çalışması lazım

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;

bu kısımda regtmr ı 30+1=31 bit yazmışsınız bu yüzden olmuyor olabilir mi

speak48

#33
sanırım beni dinlemiyorsunuz.

30dan0 ra 31 bit bide 0 eder 32 sorun neresinde
oralarda öteleme yapılmıştır
sonuçta ben çevirmedim yani ben yazmış sayılmam

sanırım sıfırı veremiyorsunuz
ozaman button yerine switchler bağlayın ve hepsini sıfıra çekin


pic365

Modülün simülasyonunu yaptım, sorun yok gibi gözüküyor. Yalnız modülün reset vermeden dahi düzgün çalışmaya başlaması için sinyallere ilk değer atamak faydalı olabilir. Sinyal tanımlarını aşağıdaki şekilde değiştirebilirsiniz. Yalnız şunu hatırlatayım, ilk değer atamaları FPGA'e özgü bir özellik.
signal cntled  : std_logic_vector(2 downto 0)  := (others=>'0');
signal cntclk  : std_logic_vector(31 downto 0) := (others=>'0');
signal regtmr  : std_logic_vector(31 downto 0) := x"02FAF080";


Bir de ledlerin hızı değiştirildiğinde cntclk'ın bir tam tur atma ihtimaline karşı "if(cntclk=regtmr) then" satırını aşağıdaki şekilde değiştirmek gerekir.
if(cntclk>=regtmr) then


Pin atamalarının doğru olup olmadığını kontrol etmek için leds sinyaline sabit bir değer vermeyi deneyebilirsiniz. Örneğin, kodda leds'e atama yapılan process'i kaldırıp aşağıdakine benzer bir satır ekleyin. Bu değeri ledlerde göremezseniz pin atamalarında sorun var demektir.
leds <= "10101010";


Kullandığım testbench aşağıda. Simülasyonu kısaltmak için hizlan sinyalini bir süre 1'e çektim.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity testbench is
end entity;

architecture tb of testbench is

signal clk        : std_logic := '1';
signal reset      : std_logic := '0';
signal hizlan     : std_logic := '0';
signal yavasla    : std_logic := '0';
signal leds       : std_logic_vector(7 downto 0);

component 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 component;

begin

process begin	
	clk <= not(clk);
   wait for 5 ns;
end process;

process begin
   wait for 1 ns;
   wait for 50 ns;
   hizlan <= '1';
   wait for 230 ns;
   hizlan <= '0';
   wait;
end process;

ledyak_0 : ledyak
   port map (
      clk      => clk,
      reset    => reset,
      hizlan   => hizlan,
      yavasla  => yavasla,
      leds     => leds
   );

end architecture;


Şu aşamada yanıp sönen bir şeyler görmemize çok engel olmayabilir ama dikkat edilmesi gereken iki konu daha var:

- Leds sinyalini dışarı verirken 'register'lasak iyi olabilir. O yolda sadece 8:1'lik MUX var ama sinyal FPGA'in dışına çıktığı için timing'de sıkıntı çıkabilir.
- Ledlerin ortak anotlu mu, yoksa ortak katotlu mu olduğuna dökümandan bakmak lazım. Yanması istenen led'e belki de 1 değil, 0 atamak gerekiyordur.

speak48

Alıntı yapılan: kakalive - 18 Ocak 2013, 11:01:35
Yalnız modülün reset vermeden dahi düzgün çalışmaya başlaması için sinyallere ilk değer atamak faydalı olabilir.
bu simulasyon için geçerli fpgada gerek yok.

Alıntı Yap
- Leds sinyalini dışarı verirken 'register'lasak iyi olabilir. O yolda sadece 8:1'lik MUX var ama sinyal FPGA'in dışına çıktığı için timing'de sıkıntı çıkabilir.
cntled registeri decod edilerek çıkış alınmıştır.
3x8 decodda timing sıkıntısı olmaz ama olsa bile ledlere reg koymamızın bir faydası olmaz.
hatta daha sıkıntılı olur.led reglerine yanlış değer alabilir.

pic365

Alıntı yapılan: speak48 - 18 Ocak 2013, 14:01:36
bu simulasyon için geçerli fpgada gerek yok.
cntled registeri decod edilerek çıkış alınmıştır.
3x8 decodda timing sıkıntısı olmaz ama olsa bile ledlere reg koymamızın bir faydası olmaz.
hatta daha sıkıntılı olur.led reglerine yanlış değer alabilir.
Evet cntled ve cntclk sinyallerine ilk değer sadece simülasyon için gerekli ama regtmr sinyali sıfırda takılı kalacağından cntled her cycle'da değişir ve bütün ledler sürekli yanık halde gözükür.
Ben zaten timing sıkıntısının decoder'dan değil, FPGA'in I/O gecikmesinden kaynaklanacağını düşünüyorum. Devrenin şu anki halinde critical path CLB'lerdeki register'lardan başlıyor, fakat leds sinyali register'lanmış olsa IOB'lerin register'larından başlayacak ve yol kısalacak. Gerçi bu yapı Xilinx'in FPGA'lerine özeldir belki, ben Altera'nın yapısını bilmiyorum. :)

speak48

Alıntı Yapregtmr sinyali sıfırda takılı kalacağından
evet kod basit olsun derken orda bir mantık hatası yapılmıştır.
resete basınca düzgün çalışacaktır ama ben yeni versiyonunu yayınlayayım bari

speak48

revision 1
module ledyak2
(
input clk,
input reset,
input bthizlan,
input btyavasla,
output reg [7:0] leds
);

reg [31:0]	cntclk;
reg [31:0]  regtmr;
reg basladi;
reg [3:0] bth;
reg [3:0] bty;

wire hizlan;
wire yavasla;

assign hizlan=  bth[3] & bth[2] & bth[1] & (~bth[0])  ;
assign yavasla= bty[3] & bty[2] & bty[1] & (~bty[0]) ;

always@(posedge clk or posedge reset)
begin
    if(reset)
    begin
        cntclk<=0;
        regtmr<=0;
        basladi<=0;
        bth<=0;
        bty<=0;
        leds<=0;
    end
    else
    begin
		if(basladi)
		begin
			basladi<=basladi;
			bth<={bth[2:0],bthizlan};
			bty<={bty[2:0],btyavasla};
		
			if(cntclk==regtmr)
			begin
				cntclk<=0;
				leds<={leds[6:0],leds[7]};
			end
			else
			begin
				cntclk<=cntclk+1;
			end
			
			if(hizlan)begin
				regtmr<={1'b0,regtmr[31:1]};end
			else if(yavasla)begin
				regtmr<={regtmr[30:0],1'b0};end
			else begin
				regtmr<=regtmr;end
				
		end
		else
		begin
			leds<=8'd1;
			regtmr<=50000000;
			basladi<=1;
			bth<=bth;
			bty<=bty;
			cntclk<=cntclk;
		end   
    end
end
endmodule

rumpi

bana da test bench simülasyonunun görüntüsü gerekiyor sunumum için aslında
ben denedim değer atamalar doğru çalışıyor ama acil bir biçimde simülasyonu gerekli
eğer yapıp gönderebilirseniz sevinirim bende ISIM programı yok
mail adresim : rompicog@gmail.com
herkese teşekkürler

pic365

Alıntı yapılan: rumpi - 19 Ocak 2013, 23:03:28
bana da test bench simülasyonunun görüntüsü gerekiyor sunumum için aslında
ben denedim değer atamalar doğru çalışıyor ama acil bir biçimde simülasyonu gerekli
eğer yapıp gönderebilirseniz sevinirim bende ISIM programı yok
mail adresim : rompicog@gmail.com
herkese teşekkürler

Sentez için ISE'yi kullanıyorsanız içinde simülatör de olması lazım. Yanlış hatırlamıyorsam ISE 11'den önce simülatörün adı ISim değildi ama yine de simülatör vardı.