verilog簡單實現串列埠(精簡版)

2021-08-09 03:22:28 字數 2867 閱讀 2219

//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;

//-----------------檢測是否有資料來--------

//邊沿檢測

wire rx_start;

reg rx1;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n) rx1<=1'b0;

else rx1<=rx;

endassign rx_start = ~rx & rx1;

//-------------------波特率控制------------

wire bps_start;

reg bps_start_rx,bps_start_tx;

reg [3:0] rx_num,tx_num; // 2^4-1=15

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

bps_start_rx<=1'b0;

bps_start_tx<=1'b0;

endelse if(rx_start) bps_start_rx<=1'b1;

//接收完資料後 開始傳送資料

else if(rx_num==10)

begin

bps_start_rx<=1'b0;

bps_start_tx<=1'b1;

end//傳送完資料後 無需產生波特率

else if(tx_num==10)

bps_start_tx<=1'b0;

endassign bps_start = bps_start_rx|bps_start_tx;

//------------------產生波特率--------------

//9600

parameter bps_cnt=5208; //50mhz / 9600 = 5208.3......

parameter bps_cnt_half=2604;

reg [12:0] cnt;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n) cnt<=13'b0;

else if(cnt==bps_cnt) cnt<=13'b0;

else if(bps_start) cnt<=cnt+1'b1;

else cnt<=13'b0;

end

//--------接收暫存器 傳送暫存器------------

reg [7:0] rx_data,tx_data;

//---------------------接收資料--------------

//receive

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

rx_num<=4'b0;

rx_data<=8'b0;

endelse if(cnt==bps_cnt_half)

begin

if(bps_start_rx)

begin

rx_num<=rx_num+1'b1;

case(rx_num)

1:rx_data[0]<=rx;

2:rx_data[1]<=rx;

3:rx_data[2]<=rx;

4:rx_data[3]<=rx;

5:rx_data[4]<=rx;

6:rx_data[5]<=rx;

7:rx_data[6]<=rx;

8:rx_data[7]<=rx;

9:tx_data<=rx_data;

endcase

endend

else if(rx_num==10) rx_num<=4'b0;

end//---------------------傳送資料--------------

//transport

always@(posedge clk or negedge rst_n)

begin

if(!rst_n) tx_num<=4'b0;

else if(cnt==bps_cnt_half)

begin

if(bps_start_tx)

begin

tx_num<=tx_num+1'b1;

case(tx_num)

0:tx<=1'b0;

1:tx<=tx_data[0];

2:tx<=tx_data[1];

3:tx<=tx_data[2];

4:tx<=tx_data[3];

5:tx<=tx_data[4];

6:tx<=tx_data[5];

7:tx<=tx_data[6];

8:tx<=tx_data[7];

9:tx<=1'b1;

endcase

endelse tx<=1'b1;

endelse if(tx_num==10) tx_num<=4'b0;

endendmodule

verilog簡單實現串列埠

uart 2017.10.7 傳送接收到的資料 波特率9600 乙個停止位 無奇偶校驗 de2板子 rx gpio k25 0 left tx tx gpio k26 1 right rx gnd 右邊第6 或者倒數第6 復位不成功 復位按鍵有問題 靠右按即可復位 特別注意 如果乙個條件中同時給乙個...

verilog實現串列埠

實現串列埠的時候一些簡單的介紹和遇到問題和思考。備忘 實現時可以把這兩部分分開。也就是兩個 fifo 配套收和發的 v檔案,可以實現乙個串列埠。一般人實現串列埠的都是這麼想的吧。下面是檔案的層級結構 2 當然是coding 了。寫串列埠的 主要貼一下收和發的狀態機 用一段來實現的 1 這是收的部分 ...

用verilog實現的串列埠通訊模組

串列埠功能 1 8個資料位 1個停止為 無校驗位 2 空閒時資料線為高電平,從高電平跳向低電平表示啟動訊號 3 波特率可以通過parameter引數實現可調 有兩個檔案 uart.v 串列埠模組 module uart 全域性時鐘復位訊號 iclk,irst n,序列資料線 irx,序列接收 otx...