因為要用到串列埠方面的模組,對此一無所知,網上搜到乙個最初級的入門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...