?? uart_top.v
字號:
/******************************************************************************* File: uart_tb.v* Version: V0.0* Author: minjingguo <jingguo.min@shhic.com>* Date: 20070816* Company: SHHIC Co., Ltd.******************************************************************************* Description:* ******************************************************************************** Version: V0.1* Modifier: name <email>* Date:* Description:******************************************************************************/
// *************************
// INCLUDES
// *************************
// *************************
// MODULE DEFINTION
//**************************
module uart
(
//INPUTS
wr ,
rst ,
clk ,
rd ,
rxd ,
data_in ,
parity_def,
//OUTPUTS
int_uart_tr ,
int_uart_re ,
txd ,
dat_rdy ,
tbre ,
framing_error,
parity_error,
data_out
);
// *************************
// INPUTS
// *************************
input clk ;
input rst ;
input rxd ;
input wr,rd ;
input parity_def ;
input [7:0] data_in ;
// *************************
// OUTPUTS
// *************************
output int_uart_tr ;
output int_uart_re ;
output txd ;
output dat_rdy ;
output tbre ;
output framing_error;
output parity_error ;
output [7:0] data_out ;
// *************************
// INTERNAL SIGNALS
// *************************
reg [8:0] clkdiv_cnt ;
reg clk16x ;
wire int_uart_tr;
wire int_uart_re;
// **************************************************
//---------------setup baud rate---------------------
// **************************************************
always @(posedge clk or negedge rst)
begin
if (rst== 1'h0)
clkdiv_cnt <= #1 9'b0;
else if (clkdiv_cnt==8) //baud rate=115.75 k and pc's baud rate=115.2k
// if (clkdiv_cnt==325);
clkdiv_cnt <= #1 9'b0;
else
clkdiv_cnt <= #1 clkdiv_cnt+1;
end
always @(posedge clk or negedge rst)
begin
if (rst== 1'h0)
clk16x <= #1 1'b0;
else if (clkdiv_cnt==4) //clk16x ~ 1852k
clk16x <= #1 1'b1;
else if (clkdiv_cnt==8)
clk16x <= #1 1'b0;
end
reg clk16x_b1;
reg [1:0] wr_pls,rd_pls;
always @(posedge clk) clk16x_b1 <= #1 clk16x;
wire clk16x_nege = ~clk16x & clk16x_b1;
// **************************************************
//--------------------receive---------------------
// **************************************************
always @(posedge clk or negedge rst)
begin
if (rst== 1'h0)
rd_pls <= #1 2'h0;
else if (rd)
rd_pls <= #1 2'h1;
else if (rd_pls==2'h1 && clk16x_nege)
rd_pls <= #1 2'h3;
else if (rd_pls==2'h3 && clk16x_nege)
rd_pls <= #1 2'h0;
end
always @(posedge clk or negedge rst)
begin
if (rst== 1'h0)
wr_pls <= #1 2'h0;
else if (wr)
wr_pls <= #1 2'h1;
else if (wr_pls==2'h1 && clk16x_nege)
wr_pls <= #1 2'h3;
else if (wr_pls==2'h3 && clk16x_nege)
wr_pls <= #1 2'h0;
end
//Assert interrupt if transmitting or rcving complete
reg tbre_b1, dat_rdy_b1;
always @(posedge clk) begin
tbre_b1 <= #1 tbre;
dat_rdy_b1 <= #1 dat_rdy;
end
assign int_uart_tr = ~tbre & tbre_b1;
assign int_uart_re = ~dat_rdy_b1 & dat_rdy;
// *************************
// SUBMODULE INSTANTIATION
// *************************
uart_tx U_TX
(
//INPUT
.rst (rst ),
.clk16x (clk16x ),
.din (data_in ),
.wr (wr_pls[1] ),
.parity_def(parity_def),
//OUTPUT
.tbre (tbre ),
.sdo (txd )
);
uart_rx U_RX
(
//INPUTS
.rst (rst ),
.clk16x (clk16x ),
.rd (rd_pls[1] ),
.rxd (rxd ),
.parity_def(parity_def),
//OUTPUT
.dout (data_out ),
.dat_rdy (dat_rdy ),
.framing_error(framing_error),
.parity_error (parity_error )
);
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -