本章具體介紹誤位元速率測試儀的基本功能的設計方法以及各部分的具體電路設計。主要包括 fpga 內部的碼型發生單元,誤碼插入單元、誤碼檢測單元,同步單元,誤碼計數單元,模擬通道單元和顯示單元組成。
本節將介紹各個功能模組的功能和實現的核心**等。
碼型發生單元主要描述的是偽隨機序列產生模組,偽隨機序列產生有兩種方式:序列和並行。本節主要研究序列偽隨機序列的產生方法,編寫偽隨機序列的產生**。
(1)序列 m 序列生成模組
序列方式生成的m序列可以用於低速測試,在低速測試時,將測試資料通過介面直接傳送到被測裝置,不需要經過高速收發器進行轉換。本設計採用線性反饋移位暫存器的方式設計m序列生成電路。在設計m序列時,關鍵是首先要確定暫存器的反饋方式,根據m序列本原多項式確定本設計的不同長度偽隨機序列。移位暫存器的連線方式見表3-1。
表3-1 移位暫存器連線方式
以27-1偽隨機序列為例,介紹序列m序列的生成方法。由表3-1可知,27-1偽隨機序列的本原多項式為f ( x)=1+x6+x7,表示暫存器的第七級和第六級參與反饋,其vhdl核心**如下:
誤碼插入單元主要實現在傳送碼中插入一定的誤碼,可以實現單一誤碼插入或者是插入一定比例的誤碼,插入乙個誤碼的原理主要是對乙個正確的碼元取反,就是在隨機序列產生模組的輸出端設計乙個取反電路,當選擇插入乙個誤碼時,取反電路開始工作,插入乙個誤碼。 也可以在發從的碼中插入一定比例的誤碼,其vhdl核心**如下:
process(clk)
begin
if rising_edge(clk)then
case cnt_m is-----取反12位
when 11 =>m_o<=not m_i;
when 33 =>m_o<=not m_i
when 55=>m_o<=not m_i;
when 88 =>m_o<=not m_i;
when 111 =>m_o<=not m_i;
when 133 =>m_o<=not m_i;
when 155 =>m_o<=not m_i;
when 166 =>m_o<=not m_i;
when 199 =>m_o<=not m_i;
when 211 =>m_o<=not m_i;
when 233 =>m_o<=not m_i;
when 245 =>m_o<=not m_i;
when others=>m_o<=m_i;
end case;
end if;
end process;
誤碼檢測單元及誤碼統計模組整合在乙個模組裡。同步訊號提取及狀態檢測是誤碼統計的前提,該部分將在接下來進行介紹。誤碼統計模組統計誤碼個數。本節主要設計誤碼檢測單元的各部分邏輯模組。下面是本模組的核心**。
process(clk,rst,start)
begin
if rst='0'then
m<=0;
cnt<=1;
elsif rising_edge(clk)then
if start='0' then
m<=0;
cnt<=1;
else--同步成功使能有效時
if cnt>=255 then--迴圈255個時鐘週期內,對比接收和本地m序列,統計誤碼數
err_cnt<=m;
cnt<=1;
m<=0;
else
cnt<=cnt+1;
end if;
if m_1 /= m_loc then--對比不相同,誤碼數+1
m<=m+1;
end if;
end if;
end if;
end process;
在接收端,要產生與傳送端相同的 m 序列,然後進行兩列資料的對比統計,這就要求兩列資料具有相同的時鐘控制,以保證資料相位的一致性和狀態的一致性。在序列測試時,採用數字鎖相環的方式提取出同步訊號,同步訊號同時控制本地 m 序列生成模組以及誤碼檢測的其他模組工作。本模組採用了狀態機進行功能實現,其狀態轉移圖如下
圖3-1 狀態關係轉移圖
在該模組中,st0為初始狀態,對收到的一串碼和本地產生的偽隨機碼進行比對,如果連續的7個碼中誤碼數不超過3個就認為本地的碼和接受到的碼已經同步,可以進行誤碼計數。st1的功能是比對本地和接收到的碼,對其進行計數,用於st2判斷誤碼的個數,st3是本地碼和接收碼未同步,對本地碼進行暫停乙個週期,加快對同步的檢測。
該顯示模組是對255個時鐘週期內的誤碼個數進行顯示,通過部分使用的是8段數碼管,顯示的有效值是誤碼的個數。該核心**包括數碼管的掃瞄,有效位數的提取等核心程式。其**如下
process(clk)
variable m: integer range 0 to 24999;
begin
if rising_edge(clk)then--產生數碼管顯示使能跳轉時鐘
if m=24999 then
m:=0;
clk_1k<=not clk_1k;
else
m:=m+1;
end if;
end if;
end process;
process(clk,rst,err_cnt)
begin
if rst='0'then
d3<=0;
d2<=0;
d1<=0;
err<=err_cnt;--載入誤碼數
elsif rising_edge(clk)then--提取各位顯示資料
if err>=100 then
err<=err-100;
d3<=d3+1;
else
if err>=10 then
err<=err-10;
d2<=d2+1;
else
--err<=err_cnt;
d1<=err;
end if;
end if;
end if;
end process;
process(clk_1k)
begin
if rising_edge(clk_1k)then
if cnt=3 then
cnt<=1;
else
cnt<=cnt+1;
end if;
end if;
end process;
process(clk)
begin
if rising_edge(clk)then
case cnt is
when 3=> scan<="011";
data<=d3;
when 2=> scan<="101";
data<=d2;
when 1=> scan<="110";
data<=d1;
when others=>
null;
end case;
end if;
end process;
process(data)
begin
case data is
when 0=>seg<="11000000";
when 1=>seg<="11111001";
when 2=>seg<="10100100";
when 3=>seg<="10110000";
when 4=>seg<="10011001";
when 5=>seg<="10010010";
when 6=>seg<="10000010";
when 7=>seg<="11111000";
when 8=>seg<="10000000";
when 9=>seg<="10011000";
when others =>null;
end case;
end process;
本模組是為了驗證設計的誤碼測試儀的正確性而設計的驗證單元,其主要功能是模仿實際通道,對傳輸的碼中加入一定的誤碼,然後將生成的序列傳送給接收部分。其誤碼的加入呼叫了前面的誤碼產生模組。其核心**如下
component sim_channel
port ( clk : in std_logic;
-- rst : in std_logic;
m_i : in std_logic;--模擬通道m序列輸入
cnt_m : in integer;
m_o : out std_logic--模擬通道m序列輸出
end component;
begin
sim_cha : sim_channel port map ( clk,m_i,cnt_m,m_o);
你圖3-2誤碼檢測頂層模組
軟體功能設計
軟體功能設計 針對軟體中某一具體的功能,所進行的設計。包括 這個功能的實現方式,實現的基本結構,類的組成,職責劃分等,是軟體設計中最最重要的基本功。功能設計在整個軟體設計中的層次 軟體設計的層次很多,不同的軟體設計過程有不同的劃分層次,大致可分為 架構設計,api spi設計,資料庫設計,功能設計,...
產品之功能設計
讓每乙個設計師,產品經理頭痛的是,你精心設計的乙個功能,上線後發現很少人使用然後反饋很差。好吧,雖然可能在思考需要設計這乙個功能的時候,你們可能是經過討論的或者分析吧,但是真的分析到了重點和了解到了使用者的需要了嗎?下面將梳理一下,我關於功能點設計的一些經驗吧。1.需求程度 這個功能被需求的程度大還...
關於退出按鈕的功能設計
一般在乙個b s系統中都會存在乙個退出按鈕,但是這個按鈕進行了哪些事情呢?首先,退出系統的話你必須銷毀回話跟蹤,也就是你登陸之後的所有資訊都要刪除掉,在這裡,我們使用的是session的銷毀方法 session.invalidate 銷毀session的回話跟蹤 然後,我們不單單只是銷毀sessio...