Verilog State Machine ile ADC ve Zamanlayıcı Kontrolü hakkında

Başlatan hsnhsyn, 12 Mayıs 2013, 20:11:15

hsnhsyn

merhaba arkadaşlar

forumda yeniyim ve aynı zamanda FPGA alanında da. tasarımı üzerinde çalıştığım sistem hakkında bazı tereddütlerim var, tecrübeli arkadaşlar fikir verirse çok memnun olurum.

2 adet analog mesafe sensörüyle ölçüm yapıyorum. bu sensörler normal durumda maksimum çıkış vermekte ve sürekli çalışır halde. gelen sinyali sayısal hale getirip zamanlayıcı, ram'e kaydetme ve bilgisayara gönderme görevlerim var. sensörün önünden obje geçtiğinde çıkış değeri düşmekte. bu sistemi bir state machine ile tamamen otonom olarak çalıştırmaya çalışıyorum. sorum şu;

1) objenin ilk sensörden ikinci sensöre ulaştığı zamanı ölçmek istiyorum. start ve stop sinyallerini ADC çıkışında maksimum değerden değiştikleri anda oluşturabilir miyim? örneğin; 12 bitlik sayısal veri t0 anında [111...111], yani normal durumda gelen sinyal. t1 anında gelen sinyal t0 anındakinden küçük olduğunda bir 1 seviyeli sinyal veya pulse üreterek zamanlayıcının start ve stop sinyallerini üretebilir miyim? Rising edge veya falling edge detector mantığıyla düşünmeye çalıştım. verilog üzerinde bir T flip-flop veya başka bir şekilde üretmem uygun olur mu?

ya da daha uygun/pratik bir yöntem tavsiye edebilir misiniz? laf gevelemeden öz olarak anlatmaya çalıştım. teşekkürler

volkii

gerçek uygulama yapacaksan, elektriksel seviyeler (sensör çıkışı, ADC gişileri, referansı v.s.) uygunsa anlattığın şekilde olur tabiki. zaten similasyonda yapacaksan hiç bir sıkıntı yok bence.

Mefe

FPGA'de paralel işlem yaptığın için, algoritmayı oluştururken normal programlama dillerindeki gibi düşünmemek gerekir. Bunun yanında sözünü ettiğin olayı FPGA ile rahat bir şekilde yapabilirsin. Öncelikle FPGA içerisinde frekansını bildiğin bir sayıcı bloğu oluştur ve bu sayıcı bloğuna tek giriş olarak ayarla. Bu girişten High gelirse(rising edge) sayıcı çalışmaya başlasın, Low geldiğinde ise(lowing edge) sayıcı dursun ve çıkıştan ne kadar saydığını göstersin. Frekansı da bildiğin için süreyi anında hesaplamış oluyorsun. FPGA'de akıcı ve kullanışlı kodlar yazmak istiyorsan, sistemini blok blok kurarak çalıştırmanı tavsiye ederim. Böylece en zor projelerin üzerinden bile çok kolay bir şekilde kalkabilirsin.
Muhammet EFE || http://muhammetefe.com

hsnhsyn

Gerçek bir uygulama yapıyorum. sensörün karta bağlantısını yaptık, henüz bilgisayarla haberleşmesi olmadığı için board üzerindeki 8 led'i görsel çıkış için kullanıyorum. ADC'nin herhangi bir kanalına bağladığım analog girişin (sensör bilgisi) sayısal karşılığını 12 bitin 8'ini görebiliyorum. tabi bu işlemi ADC'nin bir operation cycle için buton ile kontrol ediyorum, bastığım zaman güncel sinyali dönüştürmesi için...

ayrı bir top module olarak zamanlayıcı devrenin kontrolünü state machine ile yaptım aslında deneme olarak, simülasyonu ile. doğru bir şekilde sayıyor ve doğru zamanı hesaplayabiliyorum. hatta yazdığım kod burda, tabi FPGA içine gömdüğümde simülasyondaki gibi çalışır mı bilmiyorum şu an. ilk fırsatta uygulamasını da yapacağım.

module FSM_TRY
(
	input 	Clock,
	input 	Reset,
	input 	Start_timer,
	input	Stop_timer,
	
	output	reg CountEnable,
	output	reg ResetCount
);

parameter 	IDLE 	= 2'b00;
parameter	COUNT	= 2'b01;
parameter	DONE	= 2'b10;

reg [1:0] state, next;

always@(posedge Clock)
	if(Reset)	state <= IDLE;
	else		state <= next;

always@(state or Start_timer or Stop_timer)
begin
	next = 'bx;
	case(state)
		IDLE: 	if(Start_timer)	next = COUNT;
				else	next = IDLE;
		
		COUNT:	if(Stop_timer)	next = DONE;
				else	next = COUNT;
		
		DONE:			next = IDLE;
	endcase
end

always@(posedge Clock)
	if(Reset)		CountEnable <= 1'b0;
	else
	begin
		ResetCount <= 1'b0;
		CountEnable <= 1'b0;
		case(next)
			IDLE	: ResetCount <= 1'b1;
			COUNT 	: CountEnable <= 1'b1;
			DONE  	: CountEnable <= 1'b0;
		endcase
	end
endmodule


sadece burda kullandığım Start_timer ve Stop_timer sinyallerini ilk gönderi de anlattığım şekilde yapıp yapamayacağımdan emin değildim. bu arada bir sorum da buradaki state machine hakkında, ilk tasarımım olduğu için tutarlı olup olmadığından emin olamıyorum, sizce geliştirebileceğim bölümler var mı bu kısımda, ya da senkronizasyon sorunu vs çıkar mı?

cevaplarınız için teşekkürler.

pic365

Merhaba,

İlk iki always bloğunda herhangi bir sıkıntı gözükmüyor, FSM'ler zaten çoğunlukla bu şekilde kodlanır. Yalnız en alttaki blok kodlama stili açısından pek ideal değil, ikinci blok ile birleştirilebilir. Tabii aynı işlevi görmesi için bazı sinyallerin çıkışına flip-flop koymak gerekecek. Bunu yapmak belki yazılacak kod miktarını artırır ama yine de FSM daha anlaşılır olur.