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