【文章內(nèi)容簡(jiǎn)介】
測(cè)試模塊搭建 micro module: 微處理器部分可以采用 ZYE1502D 實(shí)驗(yàn)箱上有的 AT89C51 單片機(jī),或者編寫(xiě) Testbench 實(shí)現(xiàn)。為了仿真方便,在仿真時(shí)采用 Testbench 搭建。該micro 模型給出了微處理器與 IIC接口通訊的仿真程序。該模型能產(chǎn)生相應(yīng)的讀寫(xiě)信號(hào),地址信號(hào),并行數(shù)據(jù)信號(hào),并能接收從器件的應(yīng)答信號(hào),來(lái)調(diào)節(jié)發(fā)送或接收數(shù)據(jù)的速度。在這個(gè)程序中,為了保證 IIC接口的正確性,可以進(jìn)行完整的測(cè)試,寫(xiě)操作 時(shí)輸入的地址信號(hào)和數(shù)據(jù)信號(hào)的數(shù)據(jù)由于較少,直接寫(xiě)入程序中。讀操作時(shí),將讀數(shù)對(duì)比可以驗(yàn)證程序的正確性。該程序通過(guò)調(diào)用四個(gè)任務(wù)實(shí)現(xiàn)上述功能, write,monitor_iic_rdy, read_data, kill_time。 iic_slave module: 該 iic_slave 模型提供了一個(gè) IIC 存儲(chǔ)器。該從模型能夠偵測(cè)起始和終止命令,在地址控制字時(shí)序后產(chǎn)生 ACK,在數(shù)據(jù)讀之后置 IIC總線三態(tài)。另外它通過(guò)比較“ Slave Data Receive on Write”和“ Slave Data Transmitted on Read”的信息,實(shí)現(xiàn)仿真時(shí)數(shù)據(jù)正確性的檢查。 clk_rst module:clk_rst 模塊給測(cè)試平臺(tái)提供時(shí)鐘和復(fù)位信號(hào) 。編輯clk_period參數(shù)更改時(shí)鐘頻率,改變 reset_time參數(shù)就能改變復(fù)位信號(hào)的有效時(shí)間。 iic_tb, iic_tb 是測(cè)試臺(tái)的頂層文件。它將 IIC 接口模型 iic 和測(cè)試程序的模型 clk_rst、 micro、 iic_slave 實(shí)例化,并連接起來(lái)。其主要程序: i2c I2C(.data(data),.addr(addr),.rst_l(rst_l),.clock(clock),.cs_l(cs_l), .ack_l(ack_l),.rd_wr_l(rd_wr_l),.scl_pin(scl_pin),.sda_pin(sda_pin))。 clk_rst CLK(.clk(clock),.rst_l(rst_l))。 micro MICRO(.clk(clock),.rst_l(rst_l),.data(data),.addr(addr),.cs_l(cs_l), .ack_l(ack_l),.rd_wr_l(rd_wr_l))。 i2c_slave SEP(.sda(sda_pin),.scl(scl_pin))。 時(shí)序仿真 做功能仿真時(shí),在 Modelsim 中建立工程,把 IIC 的所有 verilog hdl 文件,以及 Testbench 用到的 verilog 文件加入到工程中,然后編譯仿真。仿真波形如圖 , 所示。 圖 iic_rst 仿真圖 圖 功能仿真波形 由輸出結(jié)果可只,微處理器發(fā)送寫(xiě)地址 10100000,響應(yīng)后寫(xiě)入數(shù)據(jù) 55H,響應(yīng)后重新發(fā)啟動(dòng)信號(hào),發(fā)送讀地址 10100001,響應(yīng)后讀出數(shù)據(jù),進(jìn)行 比較。同樣操作,寫(xiě)入數(shù)據(jù) AAH 并讀出比較,結(jié)果兩次數(shù)據(jù)讀回均正確無(wú)誤。 結(jié)束語(yǔ) 本課題設(shè)計(jì)了基于 FPGA 的 IIC 接口的數(shù)個(gè)模塊,時(shí)鐘模塊、接收模塊、發(fā)送模塊、時(shí)序控制模塊和輸出緩沖模塊,其中時(shí)序控制模塊是設(shè)計(jì)的重點(diǎn)和難點(diǎn)。每個(gè)模塊都通過(guò)了功能仿真和時(shí)序仿真,仿真結(jié)果表明,各個(gè)模塊均完成了相應(yīng)的邏輯功能。 整個(gè)設(shè)計(jì)都采用了同步方式,而且沒(méi)有使用特定公司的技術(shù)和 IP 核,這使得設(shè)計(jì)可以廣泛地重用,但也存在著可改進(jìn)之處: 需要提高 Verilog HDL 語(yǔ)言代碼的效率,要力求用最簡(jiǎn)潔,可綜合的描述方 式描述模塊的 結(jié)構(gòu)和功能,以使得芯片面積、功耗減小。 在基于 FPGA 的器件上,進(jìn)行邏輯綜合過(guò)程中,許多約束條件是相互矛盾的,這需要反復(fù)設(shè)定條件,以求電路結(jié)構(gòu)得到優(yōu)化。 基于 Verilog HDL 語(yǔ)言的可移植性,及不依賴器件的特性,設(shè)計(jì)者能在更抽象的層次上把握和描述系統(tǒng)結(jié)構(gòu)和功能特性,使設(shè)計(jì)更具靈活性。由于 FPGA 器件的快速發(fā)展,其容量可以將各種外圍器件的接口集成到 FPGA 內(nèi)部,這樣可以實(shí)現(xiàn)設(shè)計(jì)的小型化,低功耗,并且降低了設(shè)計(jì)的復(fù)雜度,而且利用 FPGA 在線可編程特點(diǎn),可以增加系統(tǒng)設(shè)計(jì)的靈活度,提高了設(shè)計(jì)效率。 在課題期間,通過(guò)不斷地學(xué)習(xí)、探索和實(shí)踐,掌握了 Verilog HDL 設(shè)計(jì)技術(shù)及其FPGA 的應(yīng)用,提高了實(shí)際的工作能力和創(chuàng)新能力。 最后感謝我的老師和同學(xué)們,在他們的監(jiān)督和幫助下讓我順利完成了本次的課程設(shè)計(jì)。 參考文獻(xiàn) [1]蘇建志 ,王冰鋒 .IIC總線及其應(yīng)用 .現(xiàn)代電子技術(shù) ,2020,22. [2]趙輝 .IIC總線技術(shù)及其應(yīng)用實(shí)例 .微型電腦應(yīng)用 ,2020,31(4):61. [3]周立功 .IIC總線概要 .產(chǎn)品應(yīng)用手冊(cè) ,2020,3. [4]石宗義 .總線的時(shí)序分析及其模擬 [J].太原理工大學(xué)學(xué)報(bào) ,2020,35(1):53. [5]朱明程 ,黃強(qiáng) .FPGA 動(dòng)態(tài)可重構(gòu)邏輯設(shè)計(jì)初探 .半導(dǎo)體技術(shù) ,2020,25(4):19. [6]褚振勇 .FPGA 設(shè)計(jì)及應(yīng)用 [M].西安 :西安電子科技大學(xué)出版社 ,2020. [7]王毓銀 .數(shù)字電路邏輯設(shè)計(jì) [M].北京 :高等教育出版社 ,1999. [8]李洪偉 .基于 QuartusII 的 FPGA/CPLD 設(shè)計(jì) [M].北京 :電子工業(yè)出版社 ,2020. 附錄 1 時(shí)鐘分頻器程序 c l kr e s e ts c l _ c n t _ e n11111010 DE N AQP R EC L Rc l o c krs t _ ls c l _ c n t _ e ns c l _ t i c ks c l _ t i c k ~ re g 0c n t r module iic_clk(clock,rst_l,scl_t_en,scl_tick)。 //端口列表 input clock。//外部系統(tǒng)處理器時(shí)鐘 input rst_l。//外部復(fù)位信號(hào) ,低有效 input scl_t_en。//來(lái)自時(shí)序控制器的計(jì)數(shù)使能信號(hào) output scl_tick。//狀態(tài)機(jī)的工作時(shí)鐘 //registersamp。wires reg scl_tick。 reg [7:0] tr。//分頻計(jì)數(shù)值 //分頻 always@(posedge clock or negedge rst_l) if(!rst_l) tr= 1 839。b0。 else if(scl_t_en) tr= 1 839。b0。 else tr=839。b0。 always@(posedge clock or negedge rst_l) if(!rst_l) scl_tick= 1 139。b0。 else if(tr= =839。hFA) cl_tick= 1 139。b1。 else scl_tick= 1 139。b0。 endmodule 附錄 2 數(shù)據(jù)接收模塊程序 DE N AQP R EC L R=A [ 1 . . 0 ]B [ 1 . . 0 ]E Q U A L010011DE N AQP R EC L RD QP R EE N AC L Ra c k _ l ~ re g 0a l w a y s 0 ~ 1Eq u a l 02 39。 h 0 i i c _ g o ~ 0 i i c _ g o ~ 1i i c _ g o ~ re g 0w rd _ a d d [ 7 . . 0 ] ~ re g 0rs t _ lc l o c ks c l _ c n t _ e nc s _ li i c _ g oa c k _ ld a t a [ 7 . . 0 ]a d d r[ 1 . . 0 ]w rd _ a d d [ 7 . . 0 ]rd _ w r_ l `timescale 1 ns/100 ps module iic_wreg(data, addr, rst_l, clock, scl_t_en, rd_wr_l, cs_l, wrd_add,iic_go, ack_l)。 //端口列表 input [7:0] data。//處理器輸出的數(shù)據(jù)碼 input [1:0] addr。//處理器輸出的地址碼 input rst_l。//復(fù)位信號(hào) input clock。//系統(tǒng)時(shí)鐘 input cs_l, scl_t_en。//系統(tǒng)使能信號(hào) input rd_wr_l。//命令信號(hào) output [7:0] wrd_add。//字地址 output iic_go。//iic 總線啟動(dòng)信號(hào) output ack_l。//反饋給處理器的響應(yīng)信號(hào) //寄存器型 reg [7:0] wrd_add。 reg iic_go。 reg ack_l。 //寄存器參數(shù) parameter w_add=239。b00。//地址寄存器 parameter d_add=239。b01。//數(shù)據(jù)寄存器 parameter s_add=239。b10。//狀態(tài)寄存器 always@(posedge clock or negedge rst_l) if(!rst_l) wrd_add = 1 839。b0。 else if(cs_lamp。amp。!rd_wr_lamp。amp。(addr= =w_add)) wrd_add = 1 data。 always@(posedge clock or negedge rst_l) if(!rst_l) iic_go= 1 139。b0。 else if(cs_lamp。amp。!rd_wr_lamp。amp。(addr= =w_add)) iic_go= 1 139。b1。//iic 總線的啟動(dòng)信號(hào) else if(scl_t_en) iic_go= 1 139。b0。 //反饋?lái)憫?yīng)信號(hào) always@(posedge clock or negedge rst_l) if(!rst_l) ack_l= 1 139。b1。 else if(cs_l) ack_l= 1 139。b0。 else ack_l= 1 139。b1。 endmodule 附錄 3 發(fā)送寄存器程序 `timescale 1 ns/100 ps module iic_rreg(wrd_add,iic_rdata,iic_rdy,iic_act,ack_err,addr,data_o)。 input [7:0] wrd_add。//iic word address input [7:0] iic_rdata。//iic read data input iic_rdy。//iic status bit input iic_act。//iic cycle active input ack_err。//ack error input [1:0] addr。//cpu address output [7:0] data_o。//muxed cpu data output //寄存器型 reg[7:0] data_o。//muxed cpu data output //參數(shù) Parameter w_add=239。b00。//字地址寄存器 parameter d_add=239。b01。//數(shù)據(jù)寄存器 parameter s_add=239。b10。//狀態(tài)寄存器 //數(shù)據(jù)多用輸出 always@(addr or wrd_add or ack_err or iic_rdata or iic_rdy) case(addr) w_add::data_o= 1 wrd_add。 d_add::data_o= 1 iic_rdata。 s_add:data_o= 1{iic_rdy,ack_err,539。b0,iic_act}。 default:data_o= 1{iic_rdy,ack_err,539。b0,iic_act}。 endcase endmodule