Bu konuyu gördüğünüzde belki de çok basit olduğunu düşünüyorsunuz. Doğru tahmin ettin. Bununla birlikte, bu konuyu size tasarımı gerçekleştirebilecek yöntemleri ve birkaç nadir veya alışılmadık bilgi noktasını tanıtmak için kullanmak istiyorum.
Öncelikle tasarımımıza başlamadan önce tasarımda kullanılacak iki bilgi noktasını tanıtın.
< 1 > Tasarım parametreleştirilebilir olduğundan, "parametreleştirme" denen şey, giriş verilerinin bit genişliğini ayarlayarak karşılık gelen veri bit genişliğini gerçekleştirebilen bir kodlayıcıdır. Kodlayıcının giriş verisi bit genişliğinin A ve çıktı verisi bit genişliğinin B olduğunu varsayalım. Dijital elektronik bilgimize göre, ilişki B = log2 (A), burada log2 (x), 2 tabanının logaritmasıdır. işlevi. Verilog HDL'de buna karşılık gelen bir sistem işlevi vardır: $ clog2 (x). Parametre tanımında bunun bir örneği aşağıda gösterilmiştir:
parametre C_DIN_WIDTH = 8; parametre C_DOUT_WIDTH = $ clog2 (C_DIN_WIDTH);< 2 > Burada tanıtmak istediğim şey wor anahtar kelimesi, herkesin onu nadiren kullandığına inanıyorum. Birincisi, sentezlenebilir; ikincisi, line-veya fonksiyonuna sahiptir; son olarak, atama ile atanır. Örneğin, bir OR geçidinin işlevsel modülü aşağıdaki gibidir:
/ ***************************** Telif Hakkı Beyanı ***************** **************** ** Elektronik teknoloji uygulama web sitesi, CrazyBird ** ** * *----------------------------Dosya bilgisi------------------- --------------- ** Dosya adı: or_gate.v ** Oluşturan: CrazyBird ** Oluşturma tarihi: 2016-1-24 ** Sürüm numarası: v1.0 ** İşlev Açıklama: OR kapı işlevi ** ******************************************* **************************** / // synopsys translate_off `zaman ölçeği 1 ns / 1 ps // synopsys translate_on module or_gate (dina, dinb , dout); // ******************************************** ********************** // Bağlantı noktası tanımı // ********************** ******************************************** girdi dina; girdi dinb; çıktı sözcükleri; // ******************************************** ********************** // Veya geçit uygulaması // ********************* ********************************************* atama dout = dina; atama dout = dinb; endmoduleKarşılık gelen kapsamlı sonuç Şekil 1'de gösterilmektedir.
Şekil 1 Kapsamlı sonuçlar
Daha sonra, kodlayıcıyı uygulama yöntemini tanıtacağım: İki yol düşünüyorum: birincisi, veri bitlerinin üzerinden geçerek; ikincisi, formülleri türeterek.
< 1 > Her ikisi de bir for döngüsü yardımıyla uygulanan iki veri biti geçişi yöntemi vardır. İlk yöntem, giriş verilerinin düşük bitinden yüksek bitine geçiş yapmak ve çaprazlanan veri bitinin 1 olup olmadığını belirlemektir, eğer 1 ise karşılık gelen ikili kod, kodlayıcının çıkışıdır. İlgili Verilog HDL uygulaması aşağıdaki gibidir (aşağıdaki tüm tasarımlar doğrulanmıştır ve simülasyon sonuçları bu blog gönderisinde verilmemiştir):
/ ***************************** Telif Hakkı Beyanı ***************** **************** ** Elektronik teknoloji uygulama web sitesi, CrazyBird ** ** * *----------------------------Dosya bilgisi------------------- --------------- ** Dosya adı: öncelik_encode.v ** Oluşturan: CrazyBird ** Oluşturma tarihi: 2016-1-24 ** Sürüm numarası: v1.0 ** İşlev Açıklama: Geçiş yöntemine dayalı parametrik kodlayıcı ** ************************************** ********************************* / // synopsys translate_off `zaman ölçeği 1 ns / 1 ps // synopsys translate_on modülü öncelik kodu (din, dout); // ***************************************** ************************* // Parametre tanımı // ******************* *********************************************** C_DIN_WIDTH parametresi = 8; parametre C_DOUT_WIDTH = $ clog2 (C_DIN_WIDTH); // ************************************* ***************************** // Bağlantı noktası tanımı // *************** ************************************************** * giriş din; çıktı kaydı; // **************************************** ************************** // Dahili değişken tanımı // ****** ************************************************** ********** reg bit_cnt; reg dout_r; // ******************************** ********************************** // Kodlayıcı uygulaması // ********* ************************************************** ******* her zaman @ (*) begin dout_r = {(C_DOUT_WIDTH) {1'b0}}; for (bit_cnt = 0; bit_cnt < C_DIN_WIDTH; bit_cnt = bit_cnt + 1) başlar if (din == 1'b1) dout_r = bit_cnt; end dout = dout_r; end endmoduleDiğer bir yöntem, giriş verilerinin yüksek bitinden düşük bitine geçiş yapmak ve çaprazlanan veri bitinin 1 olup olmadığına karar vermektir, eğer 1 ise karşılık gelen ikili kod, kodlayıcının çıktısıdır.
< 2 > Formüller türeterek. Aşağıdakiler, 8-3 kodlayıcının giriş ve çıkış uygunluğudur:
din dout 0000_00000000000_00010000000_00100010000_01000100000_10000110001_00001000010_00001010100_00001101000_0000111Yukarıdaki ilişkiye dayanarak, aşağıdaki formül türetilebilir:
dout = din ^ din ^ din ^ din; dout = din ^ din ^ din ^ din; dout = din ^ din ^ din ^ din;Yukarıdaki formülü tekrar özetlemek gerekirse, enkoder çıktısının belirli bir biti, kodlayıcı girişinde ikili indeks numarası 0 olan tüm bitlerin OR işlemi gibi, bitin 1 olmasına neden olabilecek giriş bitinin OR işleminin sonucu ile belirlenebilir. , Enkoder çıktısının 0. bit dout'unu alın; enkoder giriş din'de ikili indeks numarası 1 olan tüm bitlerde OR işlemini gerçekleştirin, enkoder çıktısının 1. bit dout'unu alın ve bu şekilde devam edin.
Tasarımda, iki for döngüsü kullanılır, biri kodlayıcı tarafından girilen indeks numarasını saymak için kullanılır, diğeri ise kodlayıcı tarafından çıktı indeks numarasını saymak için kullanılır. Aynı zamanda, karşılık gelen OR işlemi için giriş ikili indeks numarasının karşılık gelen bitini belirlemek gerekir. Formüle dayalı parametreli kodlayıcının Verilog HDL uygulaması aşağıdaki gibidir:
/ ***************************** Telif Hakkı Beyanı ***************** **************** ** Elektronik teknoloji uygulama web sitesi, CrazyBird ** ** * *----------------------------Dosya bilgisi------------------- --------------- ** Dosya adı: öncelik_encode.v ** Oluşturan: CrazyBird ** Oluşturma tarihi: 2016-1-24 ** Sürüm numarası: v1.0 ** İşlev Açıklama: Formül yöntemine dayalı parametrik kodlayıcı ** ************************************** ********************************* / // synopsys translate_off `zaman ölçeği 1 ns / 1 ps // synopsys translate_on modülü öncelik kodu (din, dout); // ***************************************** ************************* // Parametre tanımı // ******************* *********************************************** C_DIN_WIDTH parametresi = 8; parametre C_DOUT_WIDTH = $ clog2 (C_DIN_WIDTH); // ************************************* ***************************** // Bağlantı noktası tanımı // *************** ************************************************** * input din; output wor dout; // **************************************** ************************** // Dahili değişken tanımı // ************ ************************************************** **** genvar i; genvar j; // ************************************** **************************** // Kodlayıcı uygulaması // *************** ************************************************** * için oluştur (i = 0; i < C_DIN_WIDTH; i = i + 1) begin: din_traversal için (j = 0; j < C_DOUT_WIDTH; j = j + 1) begin: dout_traversal eğer (i == 1'b1) atama dout = din ; end end endgenerate endmoduleİş teklifleri