1. 程式人生 > >HDB3 譯碼器

HDB3 譯碼器

系統 緩存 原理 width begin 基礎 log 賦值 原理圖

一、HDB3譯碼方案一:

插入V/B的情況是有兩種,兩個或三個零兩端同極性,也就是要把代碼二進制表示的“+1 0 0 0 +1”或“-1 0 0 0 -1”變成“1 0 0 0”,把“+1 0 0 +1”或“-1 0 0 -1”變成“0 0 0 0”,最後再把兩位二進制表示的+1和-1都變成‘1’,兩位二進制表示的0都變成一位二進制表示的‘0’就可以了。

技術分享圖片

方案一代碼:

--hdb3譯碼
--譯碼對應的是兩位二進制表示的hdb3編碼,10表示-1;01表示+1;00表示0
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY hdb3_decoder   IS
PORT( clk : IN STD_LOGIC; h : INOUT STD_LOGIC_VECTOR(1 downto 0) ; coderout : out STD_LOGIC ); END ENTITY hdb3_decoder ; ARCHITECTURE decoder OF hdb3_decoder IS SIGNAL reg0 : STD_LOGIC_VECTOR(4 downto 0); --兩個五位寄存器 SIGNAL reg1 : STD_LOGIC_VECTOR
(4 downto 0); BEGIN process (clk,h,reg0,reg1) BEGIN if(clkEVENT AND clk = 1) then reg0 <= h(0) & reg0(4 downto 1); reg1 <= h(1) & reg1(4 downto 1); if (h(0)=1 and h(1)=0 and reg0(4 downto 1)="0001"and reg1(4 downto 1)="0000") -- +1000+1 譯碼10000 then reg0 <= "00001"; reg1 <= "00000"
; elsif (h(0)=0 and h(1)=1 and reg0(4 downto 1)="0000"and reg1(4 downto 1)="0001") -- -1000-1 譯碼10000 then reg0 <= "00001"; reg1 <= "00000"; elsif (h(0)=0 and h(1)=1 and reg0(4 downto 2)="000"and reg1(4 downto 2)="001") -- -100-1 譯碼0000 then reg0 <= "0000" & reg0(1); reg1 <= "0000" & reg1(1); elsif ( h(0)=1 and h(1)=0 and reg0(4 downto 2)="001" and reg1(4 downto 2)="000") -- +00+1 譯碼0000 then reg0 <= "0000" & reg0(1); reg1 <= "0000" & reg1(1); end if; end if; end process; process(clk) begin if (clkEVENT AND clk = 1) then if reg0(0)=1 or reg1(0)=1 then --把+101)、11(-1)譯碼成一位 1 coderout<=1; --elsif reg0(0)=1 and reg1(0)=0 -- then coderout<=1; else coderout<=0; -- 00 譯碼為 0 end if; end if; end process;


二、HDB3譯碼方案二:

對輸入的H+和H-分別設立一個五級緩存移位寄存器,每一拍都判斷是否存在10001,或1001X;若存在分別改成00001,或0000X。再將H+和H-相或輸出。

方案二代碼:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY hdb3_decoder   IS
PORT(     clk       : inout STD_LOGIC;
        --h    : in STD_LOGIC_VECTOR(1 downto 0);
        hp  : in STD_LOGIC;
        hn : in STD_LOGIC;
        clkout :out STD_LOGIC;
        outcoder : out STD_LOGIC );        
END  ENTITY hdb3_decoder ;

ARCHITECTURE decoder OF hdb3_decoder  IS
SIGNAL reg0 : STD_LOGIC_VECTOR(4 downto 0);  --兩個五位寄存器
SIGNAL reg1 : STD_LOGIC_VECTOR(4 downto 0);
SIGNAL hh : STD_LOGIC_VECTOR(4 downto 0);  --兩個五位寄存器
SIGNAL hl : STD_LOGIC_VECTOR(4 downto 0);
BEGIN
clkout <= clk;
PROCESS (clk,reg0,reg1) 
BEGIN
if(clkEVENT AND clk = 1) then    --上升沿
    reg0 <= hn & reg0(4 downto 1); reg1 <= hp & reg1(4 downto 1); 
    if(reg0 = "10001") then
        reg0 <= "10000";
    elsif (reg0 = "10010" or reg0 = "10011") then
        reg0 <= "0000" & hn;
    end if;    
    
    if(reg1 = "10001") then
        reg1 <= "10000";
    elsif (reg1 = "10010" or reg1 = "10011") then
        reg1 <= "0000" & hp;
    end if;    
end if;
hl <= reg0;
hh <= reg1;
end PROCESS;
outcoder <= (hh(4) or hl(4));
end decoder;


說明:譯碼因為仿真時需要每個符號需要賦值兩位比較麻煩,我在確認HDB3編碼沒問題的基礎之下,把編碼和譯碼在Quartus II 中封裝起來,用原理圖連接起來,若輸入和輸出是一樣的,則譯碼沒有問題。我已調試過,上面兩個程序都可以,在最終時分多路數字電話基帶傳輸系統的設計中譯碼選用的是方案一。

電路原理連接如下:

技術分享圖片

仿真圖:

1、輸入隨機數碼

技術分享圖片

2、 輸入全0碼

技術分享圖片

3、輸入全1碼

技術分享圖片


感悟:

以前寫的大多是順序語句,這次利用VHDL語言完成課程設計的過程中,進一步熟悉和利用VHDL裏的並行語句,例如進程等進件層次的使用。VHDL是一種硬件描述語言,用來描述硬件系統。硬件系統中的電路是由很多元器件構成的,從上電那一時刻起,硬件系統中所有的電路模塊(元器件)將會同時開始工作,沒有先後順序,可以用VHDL中的並行語句實現。因此,結構體中的所有語句都須是“並行語句”,每個並行語句描述一個電路模塊。並行語句之間沒有先後順序,可按任意順序書寫。這就像畫電路圖,先畫哪個電路模塊是沒有關系的,只要最終畫完的硬件系統電路圖是正確的就行。然而,人們描述一個系統的“行為”卻是按照“因果”關系來描述的,例如,“因為...所以...”(IF...THEN...)。這種描述方式稱之為”行為描述“,描述行為的語句是順序語句。順序語句不符合硬件的並行工作狀態,因此不能直接置於結構體中。為了遵循結構體中的語句都是並行語句這一語法規則,將一系列順序語句構成的行為描述看成是一個電路模塊,將其包裝成一個並行語句“PROCESS BEGIN....END PROCESS;”,相當於在c語言中給這段行為描述加了一對括號,左括號是PROCESS BEGIN,右括號是END PROCESS。任意兩個PROCESS語句之間也是並行關系,書寫的先後順序可以任意,與其他並行語句的書寫順序也可以任意。如果用順序語句來描述硬件,就要給順序語句加上“外包裝“——”PROCESS BEGIN....END PROCESS;”。

HDB3 譯碼器