在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1741|回复: 1

[讨论] UART 软核 测试

[复制链接]
发表于 2017-6-7 21:52:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我用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


复制代码
发表于 2017-6-26 16:45:09 | 显示全部楼层
仿真收发自对接,正确之后上板用计算机串口测试回环。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 23:13 , Processed in 0.017108 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表