① 學習異步並行接口的讀寫時序操作,掌握異步並口的時序描述方法;
② 復習inout雙向端口的Verilog HDL描述方法及仿真方法;
③ 掌握收/發雙向通訊方式的仿真方法。
(1)異步並口的應用及優缺點
並口的最大缺陷:擁有多路數據總線和地址總線,因為走線長度、用線材料存在差異,所以,當信號的頻率提高后,會存在線路延遲不同的現象,從而造成各路信號到達目標端口的時間不同,導致信號出現大量的毛刺和不穩定。
其次,並口占用的I/O口多,且難以滿足高頻信號的傳輸要求。
因此,當信號頻率很高的時候,往往從用的是串行傳輸的方式,而當頻率較低時(只有數十兆赫茲時),可采用並口的傳輸方式。
(2)寫操作的時序圖
圖1 寫操作時序圖
異步並口的異步是指主機不輸出時鍾信號給從機用作它們之間的通訊,異步並口的並口是指主-從機之間的數據線(此例為16根)和地址線有多根(此例為8根),且主-從機之間的數據交互是並行的。
如圖1所示,cs_n為異步並口的片選信號,低電平有效;rd_n為讀使能信號,低電平有效;we_n為寫使能信號,低電平有效;data為數據總線,位寬為16bit;addr為地址總線,位寬為8bit。
如圖1所示,當cs_n為低電平時,FPGA被主機片選中,當FPGA檢測到we_n信號被拉低時,即進入到異步並口的寫狀態,數據通過data數據總線送入FPGA,並按照addr地址總線上的地址值將數據存放到指定存儲空間上(如:RAM、FIFO等)。
(3)讀操作的時序圖
圖2 讀操作時序圖
圖2為異步並口的讀操作時序,當cs_n為低電平時,FPGA被主機片選中,當FPGA檢測到rd_n信號被拉低時,即進入到異步並口的讀狀態,FPGA按照addr地址總線上的地址值從指定存儲位置上將數據讀出並送到data數據總線上,以供主機設備讀走。
【代碼實現】
異步並口雖然沒有同步時鍾信號,但是,也不能全用組合邏輯的方式來描述,因為時序邏輯具有更高的穩定性,能給數據采集留以充分的建立時間和保持時間,從而使得讀/寫操作能在數據穩定后穩定進行。而組合邏輯電路的輸出是隨輸入信號的變化而實時變化的,若主-從機之間的信號稍不穩定,即會導致讀/寫操作的錯誤。
因此,本例依然采用時序邏輯電路為主的描述方式,將cs_n、rd_n、wr_n等輸入信號采到sclk系統時鍾域來,然后在系統時鍾sclk的控制下有序地工作。當然,像這種異步時鍾域會存在亞穩態的現象,因此,為了降低亞穩態發生的概率,我們采用“打節拍”的方式穩定輸入的信號,統一用sclk系統時鍾給輸入信號多打兩拍(延遲兩個時鍾周期)。
綜合以上分析可知,本例要設計的代碼應包含以下三個部分:
(1) 用系統時鍾sclk給輸入信號多打兩拍,穩定輸入信號;
(2) 異步並口的寫操作模塊(從外部寫入FPGA內部);
(3) 異步並口的讀操作模塊(包含inout端口的輸出操作)。
【關於inout雙向端口的描述與測試】
圖3 inout雙向端口測試模型
如圖3所示,展示了本例所采用的測試模型,對於FPGA芯片來說,異步並口的讀操作就是數據輸出,寫操作就是數據的輸入;而對於測試激勵端來說,異步並口的寫操作就是數據輸出,讀操作就是數據的輸入。
因此,應將FPGA端的程序設計如下:
inout tri [15:0] data, //雙向數據總線
assign data = (cs_n_r[2]==1'b0 && wr_n_r[2]==1'b1 && rd_n_r[2]==1'b0)? read_data: 16'hzzzz;//讀操作輸出數據
對於寫操作輸入數據,則直接將data數據總線上的數據送入給FPGA的寄存器。
而應將測試激勵端的程序設計如下:
tri [15:0] data;
reg [15:0] data_reg;
assign data = (wr_n==1'b0) ? data_reg : 16'hzzzz;//寫操作輸出數據
對於讀操作輸入數據,則直接讀取data數據總線上的數據即可。
【Testbench搭建】
(1)聲明建立時間、保持時間、數據采樣時間以及讀等待時間等延時任務,以便模擬異步並口的讀寫時序;
(2)讀數據任務
(3)寫數據任務
(4)仿真流程控制
【實驗結果】
圖4 打節拍延時60ns
圖5 建立時間、數據采集時間、保持時間
圖6 讀等待時間
圖7 Transcript窗口信息
圖8 仿真波形整體圖