實現串列埠的時候一些簡單的介紹和遇到問題和思考。備忘
實現時可以把這兩部分分開。也就是兩個
fifo
配套收和發的
.v檔案,可以實現乙個串列埠。一般人實現串列埠的都是這麼想的吧。下面是檔案的層級結構:
2、當然是coding
了。寫串列埠的**。主要貼一下收和發的狀態機(用一段來實現的):
(1)這是收的部分:
case(state_rxd)
state_rxd_idle : //0
begin
finished_rxd <= 1'b0;
rxd_error <= 1'b0;
if((!rxd_write_full) && (==3'b100))
begin
state_rxd <= state_rxd_head;
time_rxd <= 1'd0;
endelse
state_rxd <= state_rxd_idle;
endstate_rxd_head : //1
begin
if((time_rxd == rxd_half_band_rate) && (==3'b000))
begin
time_rxd <= 15'd0;
state_rxd <= state_rxd_rxd;
data_rxd_d1 <= 8'd0;
endelse if((time_rxd == rxd_half_band_rate) && (!=3'b000))
begin
time_rxd <= 15'd0;
state_rxd <= state_rxd_idle;
endelse
time_rxd <= time_rxd + 1;
endstate_rxd_rxd : //2
begin
if((time_rxd == rxd_band_rate))
begin
time_rxd <= 15'd0;
if(count_rxd_bit == 3'd7)
begin
count_rxd_bit <= 3'd0;
state_rxd <= state_rxd_tail;
data_rxd_d1 <= ;
endelse
begin
count_rxd_bit <= count_rxd_bit + 1;
data_rxd_d1 <= ;
endend
else
begin
time_rxd <= time_rxd + 1;
endend
state_rxd_tail : //3
begin
if((time_rxd == rxd_band_rate) && (==3'b111))
begin
rxd_error <= 1'd0;
finished_rxd <= 1'b1;
state_rxd <= state_rxd_idle;
endelse if((time_rxd == rxd_band_rate) && (!=3'b111))
begin
rxd_error <= 1'd1;
finished_rxd <= 1'b0;
state_rxd <= state_rxd_idle;
endelse
begin
finished_rxd <= 1'b0;
rxd_error <= 1'b0;
time_rxd <= time_rxd + 1;
endend
default : state_rxd <= state_rxd_idle;
endcase
(2)這是發的部分:
case(state_txd)
state_txd_idle : //0
begin
time_txd <= 15'd0;
finished_send <= 1'b0;
if(load_data_tag_d1 == 1'b1)
begin
state_txd <= state_txd_head;
data_txd_reg1 <= data_txd_reg;
endelse
state_txd <= state_txd;
endstate_txd_head : //1
begin
port_txd_reg <= 1'b0;
if(time_txd == txd_band_rate)
begin
time_txd <= 15'd0;
state_txd <= state_txd_txd;
endelse
time_txd <= time_txd + 1;
endstate_txd_txd : //2
begin
port_txd_reg <= data_txd_reg1[0];
if(time_txd == txd_band_rate)
begin
time_txd <= 15'd0;
if(count_bit_send == 3'd7)
begin
count_bit_send <= 3'd0;
state_txd <= state_txd_tail;
endelse
begin
count_bit_send <= count_bit_send + 1;
data_txd_reg1 <= ;
end
endelse
time_txd <= time_txd + 1;
endstate_txd_tail : //3
begin
port_txd_reg <= 1'b1;
if(time_txd == txd_band_rate)
begin
state_txd <= state_txd_idle;
finished_send <= 1'b1;
endelse
begin
finished_send <= 1'b0;
time_txd <= time_txd + 1;
endend
default:
begin
port_txd_reg <= 1'b1;
finished_send <= 1'b0;
time_txd <= 15'd0;
data_txd_reg1 <= 8'd0;
endendcase
3、測試串列埠:
測試方法主要是通過自己把fifo
寫成迴路來測試,相當於上位機發資料給
fpga
,然後fpga
自己把資料通過串列埠傳給上位機,對比傳入和傳出的資料是否一樣來驗證。這樣測試對於一般串列埠的應用是應該夠了。
4,除錯過程中遇到問題:
(1)fifo裡面的
wrfull
和rdempty
訊號,並不是延遲乙個時鐘出來的,而是延遲兩個;
(2)fifo裡面的
wrusedw
或者rdusedw
,要等它反映過來,貌似是延遲
4個時鐘。而且這兩個訊號是可以用最高位來看
fifo
是否滿半來做一些其它的操作的。
(3)fifo的
aclr
是高有效而產生復位
暫時就想到這麼多,先寫這麼多,其實實現起來也很簡單,主要寫這個主要是為了以後多閱讀英文文獻,先從fifo user guide
來入手研究一下容易點。
verilog簡單實現串列埠
uart 2017.10.7 傳送接收到的資料 波特率9600 乙個停止位 無奇偶校驗 de2板子 rx gpio k25 0 left tx tx gpio k26 1 right rx gnd 右邊第6 或者倒數第6 復位不成功 復位按鍵有問題 靠右按即可復位 特別注意 如果乙個條件中同時給乙個...
用verilog實現的串列埠通訊模組
串列埠功能 1 8個資料位 1個停止為 無校驗位 2 空閒時資料線為高電平,從高電平跳向低電平表示啟動訊號 3 波特率可以通過parameter引數實現可調 有兩個檔案 uart.v 串列埠模組 module uart 全域性時鐘復位訊號 iclk,irst n,序列資料線 irx,序列接收 otx...
verilog簡單實現串列埠(精簡版)
uart 2017.10.9 傳送接收到的資料 波特率9600 8個資料位 乙個停止位 無奇偶校驗 module uart clk,50mhz rst n,reset rx,input tx ouptut input clk,rst n input rx output reg tx 檢測是否有資料來...