Verilog ile Demultiplexer

Başlatan hsnhsyn, 16 Mayıs 2013, 00:05:28

hsnhsyn

Merhaba arkadaşlar,

ben verilog ile 1x2'lik basit bir demux kodu yazdım ve simüle ettim. öncelikle kodu ve simülasyon görüntüsünü göstereyim:

module Demux1to2
#(
	parameter	DataWidth = 16
)
(
	input	Clock,
	input	Select,
	input	[DataWidth-1:0]DataIn,
	
	output	[DataWidth-1:0]DataOut0,
	output	[DataWidth-1:0]DataOut1
);

	always@(posedge Clock)
	begin
		if (!Select)	DataOut0 <= DataIn;
		else			DataOut1 <= DataIn;
	end
endmodule


simülasyon çıktım da şu şekilde:



16 bitlik veriyi 0 veya 1'inci kanaldan göndermek istedim. simülasyon sonucunu görünce aklıma şu takıldı: simülasyonun son bölümüne doğru select girişi 0'da kaldığından tüm data girişi o kanala sürülüyor, seçili olmayan kanaldan da en son seçiliyken sürülen data devam ediyor. daha önce hiç demux uygulaması yapmadığım için (en azından bu şekilde) takıldım. bu normal bir durum mu, yoksa seçili olmayan çıkış high impedance durumunda mı olmalı?

pic365

Merhaba,

Select=0 iken DataOut1'in, Select=1 iken de DataOut0'ın nasıl davranacağıyla ilgili bir şey yazmadığınız için flip-floplar önceki değerini korur. Seçili olmayan çıkışın 'high impedance' olup olmaması o çıkışı kullanacak modüle bağlı ve tabii kullandığınız teknolojiye. Mutlaka 'high impedance' vermeniz gerekmiyorsa aşağıdaki gibi bir şey yapabilirsiniz.

always @(posedge Clock) begin
    if (!Select) begin
        DataOut0 <= DataIn;
        DataOut1 <= 0;
    end else begin
        DataOut1 <= DataIn;
        DataOut0 <= 0;
    end
end

hsnhsyn

DataIn olarak gösterilen veri, ADC moduülünün çıkışı. Ben iki kanal kullandığım için ADC'nin tek çıkışından gelen sinyali, sırayla kanal 0 ve kanal 1 verileri olarak farklı hatlardan göndereceğim. Dolayısıyla önceki değeri koruması aynı veriyi iki kez almama sebep olur. Bu yüzden yüksek empedans olarak kullanmam gerek diye düşünüyorum. Verdiğiniz kod parçası çok iyi açıkladı :) çok teşekkür ederim.