
下面是FPGA編/解碼器編碼部分的代碼:
process(CLK2M,C64K)
begin
if C64K=′1′ then QQ1 <=(others=>′0′);else if CLK2M′
event and CLK=′1′ then if DATA_SR=′1′ then
QQ1 <=QQ1+1;end if;end if;
end process;
Q1 <=QQ1;
process(CLK2M,C64K)
begin
if C64K=′1′ then QQ <=(others =>′0′);else if CLK2M′
event and CLK2M=′1′ then if DATA_SR_N=′1′ then
QQ2 <=QQ2+1;end if;end if;
end process;
Q2 <=QQ2;
Q1_compare_Q2<=′1′ when Q1(7 downto 0)>Q2(7 downto 0)
else ′0′;
process(CLK2M)
begin
if CLK2M′ event and CLK2M=′1′ then if C64K_1n=′1′ then
Q<=Q1_compare_Q2;end if;end if;
end process;
以下為FPGA編/解碼器解碼部分的代碼:
process(CLK2M,F(xiàn)8K)
begin
if CLK2M′event and CLK2M=′1′ then if F8K=′0′ then
p<=(others =>′0′);else p<=p+1;end if;end if;
count<=p;
end process;
process(count(7 downto 5)) --msb comes out first;
begin
case count(7 downto 5) is
when ″000″=>Dout <=locked_ts(7);--locked_ts存儲(chǔ)的數(shù)據(jù)為解碼前的串口數(shù)據(jù)
when ″001″=>Dout<=locked_ts(6);
when ″010″=>Dout<=locked_ts(5);
when ″011″=>Dout<=locked_ts(4);
when ″100″=>Dout<=locked_ts(3);
when ″101″=>Dout<=locked_ts(2);
when ″110″=>Dout<=locked_ts(1);
when ″111″=>Dout<=locked_ts(0);
when others=>Dout<=′Z′;
end case;
end process;
asyn_out<=′0′ or Dout;
2.2 數(shù)字交換網(wǎng)絡(luò)功能的實(shí)現(xiàn)
數(shù)字交換網(wǎng)絡(luò)是通信卡實(shí)現(xiàn)數(shù)據(jù)交換的核心部分,其基本功能是在兩個(gè)不同時(shí)隙間進(jìn)行交換(每個(gè)時(shí)隙對(duì)應(yīng)一個(gè)用戶)。數(shù)字交換網(wǎng)絡(luò)由數(shù)據(jù)存儲(chǔ)器和控制存儲(chǔ)器兩部分組成。數(shù)據(jù)存儲(chǔ)器的工作方式是“順序?qū)懭耄刂谱x出”,即由定時(shí)脈沖控制,按順序?qū)⒉煌瑫r(shí)隙的數(shù)據(jù)寫入相應(yīng)的單元中,寫入的單元號(hào)和時(shí)隙號(hào)一一對(duì)應(yīng),讀出時(shí)則要根據(jù)控制存儲(chǔ)器的控制信息(讀出數(shù)據(jù))進(jìn)行;控制存儲(chǔ)器是“控制寫入,順序讀出”,即數(shù)據(jù)寫入由CPU控制進(jìn)行,而數(shù)據(jù)讀出由定時(shí)脈沖控制,按照時(shí)隙號(hào)讀出相對(duì)應(yīng)單元內(nèi)容[5]。
本設(shè)計(jì)的交換網(wǎng)容量為128(條)×128(條),假設(shè)基地址為BASE_ADDR,按單字節(jié)尋址,每個(gè)地址代表接收時(shí)隙號(hào)(目的時(shí)隙號(hào)),該地址對(duì)應(yīng)的內(nèi)容字節(jié)最高位指示是否做交換,“0”代表不交換,“1”代表做交換,低7位數(shù)據(jù)表示發(fā)送時(shí)隙號(hào)(源時(shí)隙號(hào))。例如:要將N時(shí)隙發(fā)送到M時(shí)隙,使用如下等式:BASE_ADDR[M]=N|0X80,其中BASE_ADDR[M]為(BASE_ADDR+M)的地址;BASE_ADDR[M]=N|0X80表示將N與0X80相或后的值賦予(BASE_ADDR+M)的地址空間。
通信卡FPGA數(shù)字交換網(wǎng)絡(luò)的VHDL語言實(shí)現(xiàn)代碼如下所示。其中CLK2M為2MHz時(shí)鐘信號(hào),F(xiàn)8K_1D為與CLK2M上升沿對(duì)齊的同步信號(hào)。
process(CLK2M) --產(chǎn)生讀CM的地址
begin
if CLK2M′event and CLK2M=′0′ then if F8K_1D=′0′ then
sm_ram_addr(6 downto 0)<=″0000001″;
else sm_ram_addr(6 downto 0)<=sm_ram_addr(6 downto 0)+1;
end if;end if;end if;
end process;
cm_ram_addr(6 downto 0)<=sm_ram_addr(6 downto 0)–′1′;
DRAM_SM:dual_ram_8_128 --數(shù)據(jù)存儲(chǔ)器
PORT MAP( addra =>sm_ram_addr(6 downto 0),
addrb =>cm_to_sm_addr(6 downto 0),
clka =>CLK2M,
clkb =>not CLK2M,
dina =>sm_in_data(7 downto 0), --數(shù)據(jù)存儲(chǔ)器輸入數(shù)據(jù)
doutb =>sm_out_data(7 downto 0),--數(shù)據(jù)存儲(chǔ)器讀出數(shù)據(jù)
ena =>′1′,
enb =>cm_to_sm_addr(7),--是否允許數(shù)據(jù)輸出
wea =>′1′);
DRAM_CM:dual_ram_8_128 --控制存儲(chǔ)器
PORT MAP( addra =>cpu_a(6 downto 0), --cpu地址
addrb =>cm_ram_addr(6 downto 0),
clka =>cpu_clk, --cpu時(shí)鐘信號(hào)
clkb =>CLK2M,
dina =>cpu_din(7 downto 0),--cpu輸入數(shù)據(jù)
doutb =>cm_to_sm_addr(7 downto 0),
ena =>not cs,--cs為FPGA的片選信號(hào)
enb =>′1′,
wea =>not cpu_rw);--cpu_rw為cpu的讀寫信號(hào)
基于FPGA設(shè)計(jì)的通信卡具有靈活性強(qiáng)、可控性好、硬件構(gòu)架簡(jiǎn)單等優(yōu)點(diǎn)。通信卡在實(shí)際應(yīng)用中,很好地實(shí)現(xiàn)了各接口間的數(shù)據(jù)通信且其性能非常穩(wěn)定。另外,通信卡能根據(jù)需要對(duì)一些功能進(jìn)行刪除和添加,方便了系統(tǒng)功能的調(diào)試,滿足了用戶的不同需求。
參考文獻(xiàn)
[1] 王俊雄,黃鉉,劉正義.基于FPGA的嵌入式系統(tǒng)設(shè)計(jì).電子工程師,2006,(10).
[2] 陳曉竹,道克剛.PowerPC860嵌入式系統(tǒng)及應(yīng)用.北京:機(jī)械工業(yè)出版社,2006.
[3] 錢志軍,鄧志宏.MC145572 ISDN U接口收發(fā)器與MC145574 ISDN S/T接口收發(fā)器用戶手冊(cè).北京:人民郵電出版社,1998.
[4] 樊昌信,張甫翊.通信原理(第5版).國(guó)防工業(yè)出版社,2002.
[5] 葉敏.程控?cái)?shù)字交換與現(xiàn)代通信網(wǎng).北京:北京郵電大學(xué)出版社,1997.





