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

📄 uart_test.v

📁 uart协议、实现、验证
💻 V
字号:
//////////////////////////////////////////////////////////////////////////                                                              ////////  uart_test.v                                                 ////////                                                              ////////                                                              ////////  This file is part of the "UART 16550 compatible" project    ////////  http://www.opencores.org/cores/uart16550/                   ////////                                                              ////////  Documentation related to this project:                      ////////  - http://www.opencores.org/cores/uart16550/                 ////////                                                              ////////  Projects compatibility:                                     ////////  - WISHBONE                                                  ////////  RS232 Protocol                                              ////////  16550D uart (mostly supported)                              ////////                                                              ////////  Overview (main Features):                                   ////////  UART core test bench                                        ////////                                                              ////////  Known problems (limits):                                    ////////  A very simple test bench. Creates two UARTS and sends       ////////  data on to the other.                                       ////////                                                              ////////  To Do:                                                      ////////  More complete testing should be done!!!                     ////////                                                              ////////  Author(s):                                                  ////////      - gorban@opencores.org                                  ////////      - Jacob Gorban                                          ////////                                                              ////////  Created:        2001/05/12                                  ////////  Last Updated:   2001/05/17                                  ////////                  (See log for the revision history)          ////////                                                              ////////                                                              //////////////////////////////////////////////////////////////////////////////                                                              //////// Copyright (C) 2000 Jacob Gorban, gorban@opencores.org        ////////                                                              //////// This source file may be used and distributed without         //////// restriction provided that this copyright statement is not    //////// removed from the file and that any derivative work contains  //////// the original copyright notice and the associated disclaimer. ////////                                                              //////// This source file is free software; you can redistribute it   //////// and/or modify it under the terms of the GNU Lesser General   //////// Public License as published by the Free Software Foundation; //////// either version 2.1 of the License, or (at your option) any   //////// later version.                                               ////////                                                              //////// This source is distributed in the hope that it will be       //////// useful, but WITHOUT ANY WARRANTY; without even the implied   //////// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //////// PURPOSE.  See the GNU Lesser General Public License for more //////// details.                                                     ////////                                                              //////// You should have received a copy of the GNU Lesser General    //////// Public License along with this source; if not, download it   //////// from http://www.opencores.org/lgpl.shtml                     ////////                                                              ////////////////////////////////////////////////////////////////////////////// CVS Revision History//// $Log: uart_test.v,v $// Revision 1.3  2001/05/31 20:08:01  gorban// FIFO changes and other corrections.//// Revision 1.2  2001/05/17 18:34:18  gorban// First 'stable' release. Should be sythesizable now. Also added new header.//// Revision 1.0  2001-05-17 21:27:12+02  jacob// Initial revision//////`define DATA_BUS_WIDTH_8`include "timescale.v"module uart_test ();`include "uart_defines.v"reg       clkr;reg       wb_rst_ir;wire  [`UART_ADDR_WIDTH-1:0]  wb_adr_i;wire  [31:0]  wb_dat_i;wire  [31:0]  wb_dat_o;wire [3:0]    wb_sel_i;wire        pad_stx_o;reg       pad_srx_ir;integer e;uart_top  uart_snd(  clk,     // Wishbone signals            wb_rst_i, wb_adr_i, wb_dat_i, wb_dat_o, wb_we_i, wb_stb_i, wb_cyc_i, wb_ack_o,  wb_sel_i,  int_o, // interrupt request  // UART signals  // serial input/output  pad_stx_o, pad_srx_i,  // modem signals  rts_o, cts_i, dtr_o, dsr_i, ri_i, dcd_i`ifdef UART_HAS_BAUDRATE_OUTPUT  , baud1_o`endif  );// All the signals and regs named with a 1 are receiver fifo signalswire  [`UART_ADDR_WIDTH-1:0]  wb1_adr_i;wire  [31:0]      wb1_dat_i;wire  [31:0]      wb1_dat_o;wire [3:0]    wb1_sel_i;wire        int1_o;wire        stx1_o;reg       srx1_ir;uart_top  uart_rcv(  clk,     // Wishbone signals  wb_rst_i, wb1_adr_i, wb1_dat_i, wb1_dat_o, wb1_we_i, wb1_stb_i, wb1_cyc_i, wb1_ack_o, wb1_sel_i,    int1_o, // interrupt request  // UART signals  // serial input/output  stx1_o, srx1_i,  // modem signals  rts1_o, cts1_i, dtr1_o, dsr1_i, ri1_i, dcd1_i`ifdef UART_HAS_BAUDRATE_OUTPUT  , baud2_o`endif  );assign clk = clkr;assign wb_rst_i = wb_rst_ir;assign pad_srx_i = pad_srx_ir;assign cts_i = 1; //cts_ir;assign dsr_i = 1; //dsr_ir;assign ri_i = 1; //ri_ir;assign dcd_i = 1; //dcd_ir;assign srx1_i = srx1_ir;assign cts1_i = 1; //cts1_ir;assign dsr1_i = 1; //dsr1_ir;assign ri1_i = 1; //ri1_ir;assign dcd1_i = 1; //dcd1_ir;reg [31:0] dat_o;/////////// CONNECT THE UARTSalways @(pad_stx_o)begin  srx1_ir = pad_stx_o;  endinitialbegin  clkr = 0;  #50000 $finish;endwb_mast wbm(// Outputs        .adr                 (wb_adr_i),        .dout                (wb_dat_i),        .cyc                 (wb_cyc_i),        .stb                 (wb_stb_i),        .sel                 (wb_sel_i),        .we                (wb_we_i),        // Inputs        .clk                 (clk),        .rst                 (wb_rst_i),        .din                 (wb_dat_o),        .ack                 (wb_ack_o),        .err                 (1'b0),        .rty                 (1'b0));wb_mast wbm1(// Outputs         .adr                (wb1_adr_i),         .dout               (wb1_dat_i),         .cyc                (wb1_cyc_i),         .stb                (wb1_stb_i),         .sel                (wb1_sel_i),         .we                 (wb1_we_i),         // Inputs         .clk                (clk),         .rst                (wb_rst_i),         .din                (wb1_dat_o),         .ack                (wb1_ack_o),         .err                (1'b0),         .rty                (1'b0));// The test sequenceinitialbegin  #1 wb_rst_ir = 1;  #10 wb_rst_ir = 0;      //write to lcr. set bit 7  //wb_cyc_ir = 1;  wbm.wb_wr1(`UART_REG_LC, 4'b1000, {8'b10011011, 24'b0});  // set dl to divide by 3  wbm.wb_wr1(`UART_REG_DL1,4'b0001, 32'd2);  @(posedge clk);  @(posedge clk);  // restore normal registers  wbm.wb_wr1(`UART_REG_LC, 4'b1000, {8'b00011011, 24'b0}); //00011011   fork  begin    $display("%m : %t : sending : %h", $time, 8'b10000001);    wbm.wb_wr1(0, 4'b1, 32'b10000001);    @(posedge clk);    @(posedge clk);    $display("%m : %t : sending : %h", $time, 8'b01000010);    wbm.wb_wr1(0, 4'b1, 32'b01000010);    @(posedge clk);    @(posedge clk);    $display("%m : %t : sending : %h", $time, 8'b11000011);    wbm.wb_wr1(0, 4'b1, 32'b11000011);    @(posedge clk);    @(posedge clk);    $display("%m : %t : sending : %h", $time, 8'b00100100);    wbm.wb_wr1(0, 4'b1, 32'b00100100);    @(posedge clk);    @(posedge clk);    $display("%m : %t : sending : %h", $time, 8'b10100101);    wbm.wb_wr1(0, 4'b1, 32'b10100101);    @(posedge clk);    @(posedge clk);    $display("%m : %t : sending : %h", $time, 8'b01100110);    wbm.wb_wr1(0, 4'b1, 32'b01100110);    @(posedge clk);    @(posedge clk);    $display("%m : %t : sending : %h", $time, 8'b11100111);    wbm.wb_wr1(0, 4'b1, 32'b11100111);    @(posedge clk);    @(posedge clk);    $display("%m : %t : sending : %h", $time, 8'b00011000);    wbm.wb_wr1(0, 4'b1, 32'b00011000);    wait (uart_snd.regs.tstate==0 && uart_snd.regs.transmitter.tf_count==0);//    disable check;  end//  begin: check//  end  joinendalways @(int1_o)  if (int1_o)    $display("INT_O high (%g)", $time);  else    $display("INT_O low (%g)", $time);    always @(int1_o)begin  if (int1_o) begin    wbm1.wb_rd1(2,4'b0100, dat_o);    $display("IIR : %h", dat_o);    wbm1.wb_rd1(5,4'b0010, dat_o);    $display("LSR : %h", dat_o);    wbm1.wb_rd1(0, 4'b1, dat_o);    $display("%m : %t : Data out: %h", $time, dat_o);  endend// receiver sideinitialbegin  #11;  //write to lcr. set bit 7  //wb_cyc_ir = 1;  wbm1.wb_wr1(`UART_REG_LC, 4'b1000, {8'b10011011, 24'b0});  // set dl to divide by 3  wbm1.wb_wr1(`UART_REG_DL1, 4'b1, 32'd2);  @(posedge clk);  @(posedge clk);  // restore normal registers  wbm1.wb_wr1(`UART_REG_LC, 4'b1000, {8'b00011011, 24'b0});  wbm1.wb_wr1(`UART_REG_IE, 4'b0010, {16'b0, 8'b00001111, 8'b0});  wait(uart_rcv.regs.receiver.rf_count == 2);    e = 800;  while (e > 0)  begin    @(posedge clk)    if (uart_rcv.regs.enable) e = e - 1;  end  wbm1.wb_rd1(0, 4'b1, dat_o);  $display("%m : %t : Data out: %h", $time, dat_o);  @(posedge clk);  wbm1.wb_rd1(0, 4'b1, dat_o);  $display("%m : %t : Data out: %h", $time, dat_o);  $display("%m : Finish");  e = 800;  while (e > 0)  begin    @(posedge clk)    if (uart_rcv.regs.enable) e = e - 1;  end  e = 800;  while (e > 0)  begin    @(posedge clk)    if (uart_rcv.regs.enable) e = e - 1;  end  $finish;end//always @(uart_rcv.regs.rstate)//begin//  $display($time,": Receiver state changed to: ", uart_rcv.regs.rstate);//endinitial  begin    `ifdef DATA_BUS_WIDTH_8$display("DATA BUS IS 8");`else$display("DATA BUS IS 32");`endif    $display("%d %d", `UART_ADDR_WIDTH, `UART_DATA_WIDTH);  endalwaysbegin  #5 clkr = ~clk;endendmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -