verilog實現串列埠

2021-06-27 15:02:48 字數 3977 閱讀 1496

實現串列埠的時候一些簡單的介紹和遇到問題和思考。備忘

實現時可以把這兩部分分開。也就是兩個

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 檢測是否有資料來...