nexys3練手 USB UART初探秘

2021-06-26 05:48:38 字數 3233 閱讀 6562

因為要用到串列埠方面的模組,對此一無所知,網上搜到乙個最初級的入門demo,照著做了一下,對串列埠有了初步的認識,下面是實驗內容。

首先我們要知道,nexys3上面是-用usb介面來實現非同步序列通訊協議,我們來看一下參考手冊中的介紹:

連線介面跟fpga的是一塊ft232,而文字描述第一句話的意思就是這塊ft232允許pc與開發板之間通過標準的windows com埠進行通訊。原來如此,就是這麼一塊小小的晶元幫助我們完成了序列通訊協議到usb協議之間的轉換。這塊晶元具體的工作原理我們暫且不去深究,對於我們這個開發來說,我們只需要搞清楚怎麼使用它。那到底接下來怎麼繼續呢?似乎不太有頭緒,那就先連線上電腦再說吧!將j13跟電腦的usb口連線上去,會發現這時電腦正在安裝乙個驅動,就像一般的u盤這些usb裝置第一次連線電腦一樣,開啟裝置管理器,可以看到多了乙個com4埠!

連線介面跟fpga的是一塊ft232,而文字描述第一句話的意思就是這塊ft232允許pc與開發板之間通過標準的windows com埠進行通訊。原來如此,就是這麼一塊小小的晶元幫助我們完成了序列通訊協議到usb協議之間的轉換。這塊晶元具體的工作原理我們暫且不去深究,對於我們這個開發來說,我們只需要搞清楚怎麼使用它。那到底接下來怎麼繼續呢?似乎不太有頭緒,那就先連線上電腦再說吧!將j13跟電腦的usb口連線上去,會發現這時電腦正在安裝乙個驅動,就像一般的u盤這些usb裝置第一次連線電腦一樣

實際上我們操作的只是乙個「偽」usb協議,我們真正需要完成的收發機遵循的協議應該是非同步序列通訊協議。這個協議對於大家來說應該是再熟悉不過了,在這裡我就不多廢話了。需要說明的是,我在這個demo裡採用的資料幀格式是:8bits資料位,1bits停止位,無奇偶校驗,波特率為9600。

首先我們要實現乙個單純的傳送機,要求它能接收輸入口上的7位ascii編碼,然後將它不停的傳送出去。它可以由下面這個狀態機完成:

狀態1----空閒狀態,等待並復位,當傳送標誌置位時轉到狀態2;

狀態2----準備,並轉到狀態3;

狀態3----一幀資料匯入,將輸入口的資料讀入,並前後加上起始位和停止位,轉入狀態4;

狀態4----資料傳送,將一幀10bits的資料按9600波特率序列傳送出去,當完成10bits資料傳送後,回到狀態1。

按照這個狀態機,我設計出下面這個模組:

`timescale 1ns / 1ps

//// company:

// engineer:

// // create date: 23:24:03 11/11/2013

// design name:

// module name: usb_uart

// project name:

// target devices:

// tool versions:

// description:

//// dependencies:

//// revision:

// revision 0.01 - file created

// additional comments:

////

module usb_uart(

clk,

data,

send,

tx,busy,

led);

input clk,send;

input [7:0] data;

output reg tx,busy;

output [7:0] led;

assign led = data;

//狀態機狀態定義

parameter idel = 2'b00,//空閒狀態

rdy = 2'b01,//資料準備完成

loadbyte = 2'b10,//資料傳入

sendbit = 2'b11;//資料傳送

reg [13:0] bspclkreg;//波特率分頻計數

reg bspclk;//波特率時鐘

reg [9:0] tx_data;//傳送的資料,加上起始位和停止位

reg [3:0] tx_byte_count;//傳送位數計數

reg [1:0] state;//,next_state;//狀態暫存器

//波特率分頻模組,100m/10416

always@(posedge clk)

begin

bspclkreg <= bspclkreg + 1;

if(bspclkreg == 5208)

begin

bspclkreg <= 0;

bspclk <= ~bspclk;

endendalways@(posedge bspclk)

begin

case(state)

idel : begin

tx <= 1;

busy <= 0;

tx_byte_count <= 0;

if(~send) state <= rdy;

endrdy : begin

tx_byte_count <= 0;

tx <= 1;

busy <= 1;

state <= loadbyte;

endloadbyte : begin

tx_data <= ;

tx <= 1;

busy <= 1;

state <= sendbit;

endsendbit : begin

tx <= tx_data[0];

busy <= 1;

tx_data <= tx_data >> 1;

tx_byte_count <= tx_byte_count + 1;

if(tx_byte_count == 9)

state <= idel;

else

state <= sendbit;

endendcase

endendmodule

寫好約束檔案,data對應撥碼開關,led對應led燈,這裡對網上這個**有點疑問send 和  busy我也不太清楚 ,繼續往下學習應該可以解決。

然後我將輸入資料口接到板子上的8個撥碼開關上,即當要傳送字元「a」的時候,撥碼開關撥為01000001(65),這個時候電腦上的超級終端能接收到板子上連續發來的字元「a」!(注意設定asc碼的屬性)

NEXYS 3開發板練手 USB UART 一

我們知道,當我們的微處理器 微控制器 fpga dsp等 要和電腦進行通訊的時候一般會採用序列通訊方式,而最常用的序列通訊協議的物理層介面是rs232序列口,這時候為滿足rs232序列通訊協議,常常需要乙個電平轉換晶元,比如max232 233等。但是這些年隨著計算機技術的發展,rs232序列介面在...

nexys3使用筆記1

20134年3月19日,我收到了心儀已久的nexys3。首先說明一下板子是從 淘來的,對方聲稱沒有用過,650元成交。回到家開啟包裹,發現真的是包裝好好的,果然沒有拆封裝,賣家贊乙個。不去管賣家是怎麼得到這塊板子的,能夠以半價淘到一塊新板子還是很開心的。盒子外面有乙份 digilent nexys3...

python3 練手 爬百度貼吧

貼吧 實現 usr bin env python encoding utf 8 import urllib import urllib.request import re import time 文字處理類 class tools removeimg re.compile removea re.co...