<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > EDA/PCB > 設(shè)計(jì)應(yīng)用 > 基于串口通訊的Verilog設(shè)計(jì)

          基于串口通訊的Verilog設(shè)計(jì)

          作者: 時(shí)間:2012-09-03 來源:網(wǎng)絡(luò) 收藏

          FPGA串口模塊是將由RS-485發(fā)送過來的數(shù)據(jù)進(jìn)行處理,提取出8位有效數(shù)據(jù),并按異步的格式要求輸出到MAX3223的12腳。FPGA選用Xilinx公司的Spartan II系列xc2s50。此部分為該設(shè)計(jì)的主體。如上所述,輸入數(shù)據(jù)的傳輸速率為700k波特率。為了使FPGA能夠正確地對輸入數(shù)據(jù)進(jìn)行采樣,提高分辨率能力和抗干擾能力,采樣時(shí)鐘必須選用比波特率更高的時(shí)鐘,理論上至少是波特率時(shí)鐘的2倍。在本設(shè)計(jì)中選用4倍于波特率的時(shí)鐘,利用這種4倍于波特率的接收時(shí)鐘對串行數(shù)據(jù)流進(jìn)行檢測和定位采樣,接收器能在一個(gè)位周期內(nèi)采樣4次。如果沒有這種倍頻關(guān)系,定位采樣頻率和傳送波特率相同,則在一個(gè)位周期中,只能采樣一次,分辨率會(huì)差。比如,為了檢測起始位下降沿的出現(xiàn),在起始位的前夕采樣一次之后,下次采樣要到起始位結(jié)束前夕才進(jìn)行。而假若在這個(gè)周期期間,因某種原因恰恰使接收時(shí)鐘往后偏移了一點(diǎn)點(diǎn),就會(huì)錯(cuò)過起始位。造成整個(gè)后面位的檢測和識(shí)別錯(cuò)誤。針對本設(shè)計(jì),F(xiàn)PGA的軟件共分了三個(gè)模塊:

          1.時(shí)鐘分頻模塊。模塊的功能是用來產(chǎn)生所需要的數(shù)據(jù)采集時(shí)鐘和數(shù)據(jù)傳輸時(shí)鐘。系統(tǒng)主頻是40M的。數(shù)據(jù)采集時(shí)鐘是2.8M的,發(fā)送時(shí)鐘是11.2k。

          2.提取數(shù)據(jù)模塊。由RS485發(fā)送過來的數(shù)據(jù)共有25位,其中只有8位是有效數(shù)據(jù)。為了發(fā)送這8位有效數(shù)據(jù)。必須先將其提取出來。提取的辦法是這樣的:通過連續(xù)檢測到的16個(gè)高電平和一個(gè)低電平。判斷8位有效數(shù)據(jù)的到來。然后按照串行數(shù)據(jù)傳輸?shù)母袷?,在加上起始位和停止位后,將其存?chǔ)于輸出緩沖寄存器中。在這里,我們的串行數(shù)據(jù)輸出格式是這樣規(guī)定的,一位起始位,八位數(shù)據(jù)位,一位停止位,無校驗(yàn)位。

          3.串行數(shù)據(jù)輸出模塊。這一模塊相對比較簡單,波特率選為11.2k,模塊的功能是在移位輸出脈沖的作用下,將輸出緩沖寄存器中的數(shù)據(jù)移位輸出。

          MAX3223是實(shí)現(xiàn)電平轉(zhuǎn)換的芯片。由于RS-232c是用正負(fù)電壓來表示邏輯狀態(tài)。與TTL以高低電平表示邏輯狀態(tài)的規(guī)定不同。因此,為了能夠同計(jì)算機(jī)接口或終端的TTL器件連接,必須在RS-232與TTL電路之間進(jìn)行電平和邏輯關(guān)系的變換。實(shí)現(xiàn)這種變換的方法可用分立元件,也可用集成電路芯片。MAXIM公司的MAX3223是為滿足RS-232c的標(biāo)準(zhǔn)而設(shè)計(jì)的具有功耗低、波特率高、價(jià)格低等優(yōu)點(diǎn),外接電容僅為0.1uF或1uF,為雙組RS232收發(fā)器。由MAX3223的12腳輸入的數(shù)據(jù),經(jīng)過電平轉(zhuǎn)換后由8腳輸出,再經(jīng)過DB9的TxD端輸出,由PC機(jī)接收并做后續(xù)處理。

          3 系統(tǒng)軟件設(shè)計(jì)

          FPGA模塊是本設(shè)計(jì)的主體,使用硬件描述語言進(jìn)行編寫,本段代碼共有兩個(gè)子模塊,分別實(shí)現(xiàn)提取八位數(shù)據(jù)和串行數(shù)據(jù)發(fā)送的功能。

          下面是verilog源代碼

          module SIMO(din,clk,rst,dout_ser);

          input din; //串行輸入數(shù)據(jù)

          input clk; //時(shí)鐘信號(hào)

          input vat; 復(fù)位信號(hào)

          reg[7:0] indata_buf; //輸入緩沖寄存器,存提取的有效位

          reg[9:0] dout_buf; //輸出緩沖寄存器,加了起停位

          output reg dout_ser; //串行數(shù)據(jù)輸出

          reg nclk; //提取八位有效數(shù)據(jù)的采樣時(shí)鐘.是4倍于波特率的時(shí)鐘

          reg txclk; //發(fā)送數(shù)據(jù)時(shí)鐘。發(fā)數(shù)據(jù)取11.2k的波特率

          integer bitpos=7; //當(dāng)前位

          parameter s0=0,s1=1,s2=2,s3=3;

          reg[2:0]state;

          reg[4:0]counter; //用來計(jì)算報(bào)頭報(bào)尾中1的個(gè)數(shù)

          reg tag,tag1;

          reg[2:0]cnt3;

          reg txdone=1'b1;//一個(gè)字節(jié)數(shù)據(jù)傳輸完畢標(biāo)志

          *********提取有效數(shù)據(jù)位并按串行通訊格式裝載數(shù)據(jù)********

          always@ (posedge nclk or posedge rst) begin

          if(rst)

          begin

          state=0;

          counter=0;

          tag1=0;

          tag=0;

          indata_buf=8'bz;

          dout_buf=10'bz;

          bitpos=7;

          cnt3=0;

          end

          else case(state)

          s0:begin

          tag=0;//表示數(shù)據(jù)沒有裝好

          if(din)

          begin

          counter=counter+1;

          state=s0;

          if(counter==15)//如果檢測到16個(gè)1則轉(zhuǎn)入s1狀態(tài)檢測接下來的是不是0

          begin

          state=s1;

          counter=0;

          end

          end



          關(guān)鍵詞: Verilog 串口通訊

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();