《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > 利用計(jì)算機(jī)打印口調(diào)試FPGA

利用計(jì)算機(jī)打印口調(diào)試FPGA

2009-03-06
作者:蔡英武 許 晏

  摘? 要: 介紹一種利用計(jì)算機(jī)打印口調(diào)試ALTERA的FLEX10K系列FPGA的方法。對(duì)于沒(méi)有ALTERA的Quartus軟件的設(shè)計(jì)者,該方法可以在一定程度上彌補(bǔ)MAX+PLUSIIl軟件沒(méi)有SignalTap邏輯分析功能的不足。

????關(guān)鍵詞: 并行口? MAX+PLUSII? FPGA? 硬件調(diào)試

?

  隨著FPGA實(shí)現(xiàn)的功能越來(lái)越復(fù)雜,其調(diào)試也越來(lái)越困難。尤其對(duì)于輸入/輸出較少、內(nèi)部運(yùn)算復(fù)雜的FPGA設(shè)計(jì)來(lái)說(shuō),其內(nèi)部操作就象一個(gè)“黑箱”,數(shù)據(jù)進(jìn)入這個(gè)“黑箱”后,它如何被操作、傳輸,設(shè)計(jì)者很難知道。僅憑很少的輸入/輸出信號(hào),很難判斷設(shè)計(jì)是否有問(wèn)題以及問(wèn)題的癥結(jié)所在。因此,在硬件調(diào)試中非常有必要深入FPGA內(nèi)部去了解數(shù)據(jù)的運(yùn)算、存儲(chǔ)、流動(dòng)是否正常。

  目前FPGA的調(diào)試手段很不理想。以ALTERA的器件為例,雖然它的大多數(shù)EPLD、FPGA芯片都帶有JTAG接口,但MAX+PLUSII系列軟件不支持真正的邊界掃描功能,而只是把JTAG接口作為器件配置接口。這就迫使設(shè)計(jì)者必須把芯片內(nèi)部的信號(hào)引到外部引腳上,通過(guò)示波器進(jìn)行測(cè)量和調(diào)試。但問(wèn)題是:當(dāng)需要引出的內(nèi)部信號(hào)很多時(shí),一是有可能芯片管腳不夠分配,二是必須使用昂貴的邏輯分析儀來(lái)同時(shí)測(cè)量這些引出的信號(hào),調(diào)試的代價(jià)非常高昂。

  ALTERA最新的Quartus軟件中有一個(gè)SignalTap 邏輯分析功能,配以專(zhuān)用的硬件,可以使FPGA的調(diào)試變得輕松簡(jiǎn)單。SignalTap的操作原理是:用戶(hù)在自己的設(shè)計(jì)中插入一個(gè)具有SignalTap功能的特定宏模塊,并定義需記錄的節(jié)點(diǎn)名、數(shù)據(jù)長(zhǎng)度、記錄用時(shí)鐘信號(hào)、觸發(fā)記錄的條件等,然后啟動(dòng)硬件運(yùn)行。當(dāng)記錄完成后,器件內(nèi)部指定節(jié)點(diǎn)的數(shù)據(jù)序列便通過(guò)器件的JTAG口傳入計(jì)算機(jī),以波形的方式顯示到屏幕上,設(shè)計(jì)者就可以進(jìn)行高效率的調(diào)試了。

  不過(guò),對(duì)于那些仍在使用MAX+PLUSII的用戶(hù),就享受不到這種方便了。為此,本人設(shè)計(jì)了一種利用計(jì)算機(jī)并行口調(diào)試FPGA的方法,同樣可以用于讀出FPGA內(nèi)部數(shù)據(jù),提高調(diào)試效率。仍在使用MAX+PLUS II軟件的朋友不妨一試。

1 FPGA的并行口調(diào)試方法

????調(diào)試用硬件平臺(tái)示意圖如圖1所示。本方法具有以下特點(diǎn):

  1. 由于采用VHDL語(yǔ)言編程,因此其跨工藝的通用性較強(qiáng)。在A(yíng)LTERA的FPGA上可用的功能,可以較方便地移植到其它廠(chǎng)家的FPGA上使用(而ALTERA或XILINX的JTAG調(diào)試功能必須在設(shè)計(jì)中調(diào)用特定的宏模塊);

  2. 設(shè)計(jì)者必須根據(jù)要記錄的數(shù)據(jù)源的不同來(lái)修

改VHDL設(shè)計(jì),因此靈活性稍差;

  3. 沒(méi)有使用器件的邊界掃描功能和JTAG口,而是從器件上任意選擇6個(gè)可用引腳作為接口,自己定義邏輯把片內(nèi)RAM塊中的數(shù)據(jù)讀出;

  4. 需要2臺(tái)計(jì)算機(jī)協(xié)同工作(當(dāng)然,如果不怕配置和調(diào)試時(shí)頻繁拔插接頭的麻煩,也可以采用一臺(tái)計(jì)算機(jī));

  5. 考慮到與底層硬件打交道的方便性及維持較高傳送速度的需要,采用C語(yǔ)言程序與FPGA通訊,進(jìn)行數(shù)據(jù)傳送;數(shù)據(jù)格式變換及顯示采用MATLAB程序。

?

  PC機(jī)與打印口之間的信號(hào)有三種:

  一是8位數(shù)據(jù)輸出信號(hào),占據(jù)25針打印機(jī)接口的2~9腳,其I/O地址為378H,本設(shè)計(jì)中未用到;

  二是打印機(jī)的控制輸出寄存器,其I/O地址為37AH。本設(shè)計(jì)使用了該寄存器的最低位STROBE(1腳)作為計(jì)算機(jī)輸出信號(hào)Cpu_answer,其為高時(shí)表示計(jì)算機(jī)收到數(shù)據(jù),通知FPGA可以傳送下一組數(shù)據(jù);

  三是打印機(jī)的狀態(tài)讀入寄存器,其I/O地址為379H。本設(shè)計(jì)將其最高位BUSY用來(lái)接收FPGA發(fā)出的“數(shù)據(jù)有效”信號(hào)Send_data_avi,將其第3至第6位用來(lái)接收FPGA送出的4位數(shù)據(jù)。具體的信號(hào)名稱(chēng)與其在25芯接口上的引腳號(hào)見(jiàn)表1。

?

?

2 VHDL源程序的編寫(xiě)

  本設(shè)計(jì)用FPGA片內(nèi)的RAM塊記錄感興趣的數(shù)據(jù)。為了增強(qiáng)跨工藝的通用性,可以用VHDL描述一個(gè)通用的RAM塊,然后用FPGA Express或Leonardo Spectrum等綜合工具來(lái)針對(duì)不同廠(chǎng)家的器件進(jìn)行工藝相關(guān)的映射。為了方便起見(jiàn),本設(shè)計(jì)采用了MAX+PLUSII中的雙口RAM模塊LPM_RAM_DQ。

2.1 數(shù)據(jù)記錄部分的設(shè)計(jì)

  對(duì)數(shù)據(jù)記錄部分的VHDL程序編寫(xiě)分兩種情況。如果設(shè)計(jì)內(nèi)有RAM塊,而且正好需要把這個(gè)RAM塊中的數(shù)據(jù)讀出時(shí),就不必對(duì)這部分邏輯做改動(dòng),直接參考1.2.2節(jié)關(guān)于數(shù)據(jù)傳送的描述。

  當(dāng)需記錄的數(shù)據(jù)源有多個(gè)時(shí),則需建立一個(gè)新的記錄專(zhuān)用RAM塊。在設(shè)計(jì)記錄功能時(shí)最常用的是并發(fā)條件多路語(yǔ)句,把感興趣的數(shù)據(jù)接到RAM塊的輸入端口。例如:

  ram_in??? <=?? conv_std_logic_vector(0,16) when ((FSM=

?????????????????? idle)or(FSM=clr_ram)) else

?????????????????? conv_std_logic_vector(detect_num,16) when

?????????????????? (FSM=judge) else

?????????????????? conv_std_logic_vector(find_out,16) when

?????????????????? (FSM=clr_fil) else

????? ????????????? ram1_out;

????在上面的例子中,當(dāng)狀態(tài)機(jī)FSM為“空閑態(tài)”(idle)和“清RAM態(tài)”(clr_ram)時(shí),給RAM輸入16位二進(jìn)制數(shù)據(jù)0;在“判決態(tài)”(judge)時(shí),RAM輸入端接數(shù)據(jù)線(xiàn)detect_num;在clr_fil態(tài)時(shí),RAM輸入端接數(shù)據(jù)線(xiàn)find_out,等等。另外,配合以讀/寫(xiě)控制輸入和地址信號(hào)的相應(yīng)變化,就可以把感興趣的數(shù)據(jù)存儲(chǔ)到專(zhuān)用RAM塊中。

2.2? 數(shù)據(jù)傳送部分的設(shè)計(jì)

  數(shù)據(jù)存儲(chǔ)完成后,所要做的就是把記錄結(jié)果傳到計(jì)算機(jī)中去。為此需要在主狀態(tài)機(jī)中加入兩個(gè)與傳送有關(guān)的狀態(tài):prepare_send(傳送初始化)和sending(傳送)。在prepare_send態(tài)主要完成RAM塊的尋址、計(jì)數(shù)器清零等操作;sending態(tài)的操作是這樣:FPGA先把頭一組數(shù)據(jù)放到D3~D0上,并用Send_data_avi信號(hào)通知計(jì)算機(jī);等計(jì)算機(jī)讀走該組數(shù)據(jù)并用Cpu_answer信號(hào)(高有效脈沖)通知FPGA后,FPGA在Cpu_answer的下降沿將下一組數(shù)據(jù)送出,如此反復(fù),直到全部數(shù)據(jù)讀完為止。

  由于只有4根數(shù)據(jù)線(xiàn),因此當(dāng)一個(gè)完整的數(shù)據(jù)其長(zhǎng)度大于4位時(shí),需要拆為4位一組(加上Send_data_avi作最高位,共5位)的數(shù)據(jù)分別傳送。為防止傳送中發(fā)生數(shù)據(jù)丟失現(xiàn)象,每組數(shù)據(jù)重復(fù)傳送3次。

  Send_data_avi通常都處于低電平。當(dāng)進(jìn)入sending態(tài)開(kāi)始傳送有效數(shù)據(jù)時(shí),Send_data_avi變?yōu)楦唠娖?當(dāng)一個(gè)完整的數(shù)據(jù)傳送完成后,Send_data_avi=false(低電平)與D[3..0]=“0000”配合產(chǎn)生一個(gè)“完整數(shù)據(jù)傳送完”信號(hào)。由于計(jì)算機(jī)并行口對(duì)Send_data_avi是反相接收,因此,計(jì)算機(jī)接收到的有效數(shù)據(jù)是0XXXXb,而接收的“完整數(shù)據(jù)結(jié)束”標(biāo)志是10000b。由于這個(gè)標(biāo)志是獨(dú)一無(wú)二的,因此在C程序中可以判斷出這個(gè)標(biāo)志數(shù)據(jù)??傊?正確傳送的數(shù)據(jù)應(yīng)在0~16的范圍內(nèi)。圖2給出了一個(gè)數(shù)據(jù)傳送的時(shí)序示意圖。??

?

????????

??? 下面是一個(gè)傳送16位數(shù)據(jù)的VHDL例程。?????

??? PROCESS (reset,clk)

?????? BEGIN

?????? ... ...

????????????? if (FSM=sending) then?????????

?????? ? case send_ram_cnt? is

?????? ? when 0 | 1 | 2 => ???? D<=ram_out(3 downto 0);

???????????????? ?????????????????? Send_data_avi<=true;

?????? ? when 3 | 4 | 5 => ???? D<=ram_out(7 downto 4);

????????????????????????????????Send_data_avi<=true;

?????? ? when 6 | 7 | 8 => D<=ram_out(11? downto 8);

???????? when 9 | 10 | 11 => D<=ram_out(15 downto 12);

????? ????????????????????????? Send_data_avi<=true;

? ?????? when others => ??? D<=″0000″;

????????? ????????????????????? Send_data_avi<=false;

?????? end case;

 ???? … …

??? END PROCESS;

??? 在上例中,send_ram_cnt作為傳送計(jì)數(shù)器,其計(jì)數(shù)范圍根據(jù)要傳送的數(shù)據(jù)位數(shù)和次數(shù)來(lái)確定。在本例中要傳送16位數(shù)據(jù),每組傳4位,一組數(shù)據(jù)重復(fù)3次,共傳3×(16÷4)=12次。加上還要傳送3次結(jié)束標(biāo)志,因此send_ram_cnt計(jì)數(shù)范圍為0~14。另外,RAM塊的讀/寫(xiě)控制輸入和地址信號(hào)也必須有相應(yīng)的配合。3 C語(yǔ)言程序的編寫(xiě)C程序的作用是與FPGA協(xié)同完成數(shù)據(jù)的正確接收,并存成文件備用。通過(guò)實(shí)驗(yàn)我們發(fā)現(xiàn):雖然傳輸數(shù)據(jù)率不是很高,但偶爾會(huì)有數(shù)據(jù)丟失的情況。為防止這種情況的發(fā)生,每組數(shù)據(jù)(4位二進(jìn)制)重復(fù)發(fā)送3次。因此在C程序的編寫(xiě)中,要加上消除重復(fù)數(shù)據(jù)的功能。

4 Matlab程序編寫(xiě)

??? 在數(shù)據(jù)文件生成后,出于編程方便快捷的考慮,這里采用Matlab軟件作為數(shù)據(jù)格式變換及顯示的工具。當(dāng)然,如果設(shè)計(jì)者覺(jué)得沒(méi)有必要的話(huà),也可以采用其它編程語(yǔ)言如C語(yǔ)言來(lái)做同樣的工作。

??? MATLAB是MathWorks公司推出的一種面向科學(xué)與工程計(jì)算的高級(jí)(語(yǔ)言)軟件。它功能強(qiáng)大、編程效率極高,而且還可以方便地進(jìn)行各種變換、計(jì)算、統(tǒng)計(jì)、繪圖。下面是一個(gè)進(jìn)行數(shù)據(jù)格式變換及作圖的例子,從中可以體會(huì)到Matlab的方便快捷。

load('c:ad.dat');???????? %讀入原始數(shù)據(jù)文件

x=ad;??? len=length(x);

res=[];? y=0;

for i=1:len,???????????????????????????

%以下把16位二進(jìn)制原始數(shù)據(jù)變換為無(wú)符號(hào)十進(jìn)制數(shù)據(jù)。

  if mod(i,5)==1,??????? tmpy=x(i);

????elseif mod(i,5)==2,?? tmpy=x(i)*16;

??? elseif mod(i,5)==3,?? tmpy=x(i)*16*16;

??? elseif mod(i,5)==4,?? tmpy=x(i)*16*16*16;

??? else,?tmpy=0;

????end;

????if mod(i,5)==1, y=tmpy;

????else y=y+tmpy;

????end;

????if (mod(i,5)==0) | (i==len),?%如果遇到一個(gè)完整數(shù)據(jù)的結(jié)束標(biāo)志,則存儲(chǔ)此次變換結(jié)果。

??? res=[res,y];

?? end;

end;

figure(1); plot(res);? %繪圖顯示十進(jìn)制數(shù)據(jù)

title('來(lái)自FPGA的真實(shí)數(shù)據(jù)');

?

參考文獻(xiàn)

1 Altera. DATA BOOK.1998

2 Altera. SigalTap Plus System Analyzer.2000

3 Altera. IEEE 1149.1(JTAG) Boundary_Scan Testing in Altera Device.2000

4 董浩斌. 基于打印機(jī)接口的A/D、D/A卡. 電子技術(shù)應(yīng)用,1996;22(2)

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀(guān)點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話(huà)通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話(huà):010-82306118;郵箱:aet@chinaaet.com。