UART 软核 测试

2019-07-15 21:38发布

我用verilog 写了UART Tx 的代码。

到目前为止,我先想测试UART传输,但我不太确定如何测试它。
我应该测试什么呢?

我不是要求测试代码。 我需要一些有关测试UART软核的指导。
谢谢!

  1. module Tx_top(clk, reset, start, i_data, serial_out)   // UART transmitter :  parallel input, serial output

  2. input clk;  // 48MHz
  3. input reset;
  4. input start;     // i_data is valid, so start transmission
  5. input[7:0] i_data;
  6. output serial_out;

  7. wire baud_out;  // 9600bps baudrate clock
  8. wire serial_data;  // output from serializer (TxUART)

  9. TxUART tx (.clk(baud_out), .reset(reset), .start_tx(start), .i_data(i_data), .o_data(serial_data));

  10. baud_generator bg (.clk(clk), .baud_out(baud_out));

  11. shift_register sreg (.clk(baud_out), .reset(reset), .data_in(serial_data), .data_out(serial_out));

  12. // FIFO tx_fifo (clk, reset, enqueue, dequeue, flush, i_value, almost_full, almost_empty, o_value);

  13. endmodule
复制代码
  1. `define Tx_IDLE_BIT 0
  2. `define Tx_START_BIT 1
  3. `define Tx_DATA_BITS < `Tx_PARITY_BIT
  4. `define Tx_PARITY_BIT 10
  5. `define Tx_STOP_BIT 11

  6. module TxUART(clk, reset, start_tx, i_data, o_data)

  7. input clk, reset, start_tx;
  8. input[7:0] i_data;
  9. output reg o_data;

  10. reg[3:0] state, next_state;
  11. wire parity_bit;

  12. always @(posedge clk)
  13. begin
  14.     if (reset)
  15.         state <= `Tx_IDLE_BIT;
  16.     else
  17.         state <= next_state;
  18. end

  19. always @(*)
  20. begin : tx_fsm
  21.     case(state)
  22.         `Tx_IDLE_BIT         : next_state = (start_tx == 1) ?  Tx_START_BIT : `Tx_IDLE_BIT;
  23.                           o_data = 1;

  24.         `Tx_START_BIT        : next_state = `Tx_DATA_BITS;
  25.                           o_data = 0;

  26.         `Tx_DATA_BITS         : next_state = state + 1;
  27.                           o_data = i_data[state-2];

  28.         `Tx_PARITY_BIT         : next_state = `Tx_STOP_BIT;
  29.                           o_data = parity_bit;

  30.         `Tx_STOP_BIT         : next_state = `Tx_IDLE_BIT;
  31.                           o_data = 1;

  32.         default              : next_state = `Tx_IDLE_BIT;
  33.                           o_data = 1;
  34.     endcase
  35. end

  36. assign parity_bit = ^i_data; // even parity http://www.asic-world.com/examples/verilog/parity.html

  37. endmodule
复制代码
  1. // credit: Adapted from http://zipcpu.com/blog/2017/06/02/generating-timing.html

  2. module baud_generator(clk, baud_out)     // we are obtaining baud_out = 9600bps = clk/5000 where clk = 48MHz

  3. input clk;
  4. output baud_out;

  5. wire ck_stb;
  6. reg[15:0] counter = 0;

  7. always @(posedge clk)
  8.     {ck_stb, counter} <= counter + 13;  // (2^16)/5000 = 13.1

  9. assign baud_out = ck_stb;

  10. endmodule
复制代码
  1. // Credit: Adapted from http://www.referencedesigner.com/tutorials/verilog/verilog_32.php

  2. module shift_register(clk, reset, data_in, data_out)   // cascade of 10 registers

  3. parameter N=10;

  4. input wire clk, reset;
  5. input wire data_in;
  6. output wire data_out;

  7. reg [N-1:0] r_reg;
  8. wire [N-1:0] r_next;

  9. always @(posedge clk)
  10. begin
  11.     if (reset)
  12.         r_reg <= 0;
  13.     else
  14.         r_reg <= r_next;
  15. end        

  16. assign r_next = {data_in, r_reg[N-1:1]};
  17. assign data_out = r_reg[0];                // Transmit LSB first

  18. endmodule
复制代码
  1. // Adapted from https://github.com/jbush001/NyuziProcessor/blob/master/hardware/core/sync_fifo.sv

  2. module FIFO (clk, reset, enqueue, dequeue, flush, i_value, almost_full, almost_empty, o_value)

  3. input clk, reset, enqueue, dequeue, flush, i_value;
  4. output almost_full, almost_empty, o_value;

  5. parameter SIZE = 22;
  6. parameter ALMOST_FULL_THRESHOLD = SIZE;
  7. parameter ALMOST_EMPTY_THRESHOLD = 1);

  8. reg[4:0] head, tail, count;

  9. assign almost_full = count >= ALMOST_FULL_THRESHOLD;
  10. assign almost_empty = count <= ALMOST_EMPTY_THRESHOLD;
  11. assign o_value = data[head];

  12. always @(posedge clk)
  13. begin
  14.     if (reset) begin
  15.         head <= 0;
  16.         tail <= 0;
  17.         count <= 0;
  18.     end

  19.     else begin
  20.         if (flush) begin
  21.             head <= 0;
  22.             tail <= 0;
  23.             count <= 0;
  24.         end

  25.         else begin
  26.             if (enqueue) begin
  27.                 tail <= tail + 1;
  28.                 data[tail] <= i_value;
  29.             end

  30.             if (dequeue) begin
  31.                     head <= head + 1;
  32.             end

  33.             if (enqueue && !dequeue)
  34.                     count <= count + 1;
  35.             else if (dequeue && !enqueue)
  36.                     count <= count - 1;
  37.         end
  38.     end
  39. end

  40. endmodule
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。