⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_pc_top.v

📁 内含有完整的UART代码
💻 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_pc
    (
    //INPUTS
    wr  ,
    rst     ,
    clk     ,
    rd      ,
    rxd     ,       
    data_in ,
    parity_def,   
    //OUTPUTS
    int     ,   
    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          ;
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       ;


// **************************************************
//---------------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 = ((~tbre & tbre_b1) || (~dat_rdy_b1 & dat_rdy));

// *************************
// SUBMODULE INSTANTIATION
// *************************
uart_pc_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_pc_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 + -