原创 Testbench仿真串口自收发通信

2008-9-7 12:11 9838 17 28 分类: FPGA/CPLD

Testbench仿真串口自收发通信<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


    以前仿真用的都是ISE自带的Test Bench Waveform。图形化界面,只要点点添加把信号拉高或者拉低进行激励添加,可谓方便快捷。但是所有的仿真激励都用TBW里做恐怕在大一些的项目模块仿真时就会遇到困难了,之前的IIC收发通信用TBW里添加仿真激励就显得有些为难了,所以在对RTL级的verilog设计有了一定程度的掌握后,下一步就该加强自己编写verilog testbench的能力了。


    今天就以一个简单的串口自收发通信开始吧,这个RTL级代码在前面的日志里。


Verilog test fixture:


 


`timescale 1ns / 1ps


 


module testbench;


 


// DATE:     Sat Aug 11 10:03:33 2007


// TITLE:   


// MODULE:   my_uart_top


// DESIGN:   my_uart_top


// FILENAME: my_uart_top


// PROJECT:  test


// VERSION:  Version


 


// Inputs


    reg clk;


    reg rst_n;


    reg rs232_rx;


 


// Outputs


    wire rs232_tx;


 


// Bidirs


 


// Instantiate the UUT


    my_uart_top d (


        .clk(clk),


        .rst_n(rst_n),


        .rs232_rx(rs232_rx),


        .rs232_tx(rs232_tx)


        );


 


// Initialize Inputs


 


    parameter  RESET_TIME = 1000;


   initial begin


      rst_n = 1'b0;  // RESET pulse


       # RESET_TIME rst_n = 1'b1;  //after 1us,RESET over


    end


 


    parameter CLOCK_20NS = 20;


    initial begin


       clk = 1'b0;


       forever


           # (CLOCK_20NS/2) clk = ~clk;    // 20ns CLOCK


    end


 


    parameter BPS_9600 = 104140,


                  SEND_DATA = 8'b1010_0011;


    integer i;


    initial begin


      rs232_rx = 1'b1;   //RESET rs232_rx


       # BPS_9600 rs232_rx = 1'b0; // transmit START bit


 


       for (i=0;i<8;i=i+1)      //transmit DATA byte


           # BPS_9600 rs232_rx = SEND_DATA;


 


       # BPS_9600 rs232_rx = 1'b0; // transmit STOP bit


       # BPS_9600 rs232_rx = 1'b1; // bus IDLE


    end


//


    reg[7:0] tran_data;  // receive transmit data byte


    always @ (negedge rs232_tx) begin


       # (BPS_9600/2)


 


       for (i=0;i<8;i=i+1)


           # BPS_9600 tran_data = rs232_tx;    //receive data byte


 


       # BPS_9600


       # (BPS_9600/2);


    end


   


endmodule


 


仿真后的波形如下:(明显比单纯用TBW来得方便)


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图


rs232_rx信号为仿真PC发送数据到FPGA里,上图可以看到rs232_rx线的变化。



点击看大图


rs232_txFPGA发送数据给PC,数据正是PC发送过来的原数据,tran_data是模拟PC接收到来自FPGA的数据,可以看到最终PC接收FPGA发送回来的数据和PC发送给FPGA的数据是一致的。自此,这个仿真说明了源代码设计是正确的。


 


前面的testbench只是比较简单的,因为就做了一次的数据收发。然而在实际中要验证一个设计的正确与否,往往应该是要经受住无数次的考验才算满足要求。基于此,下面的testbench的任务就是从0开始一直发到255一共就是256此验证。这么多此的测试光看波形可不成,尤其定位错误的时候非累死你不可,所以就应该采用$display这个命令,在modulsim的命令窗口里观察就可以了:



0896f558-fb7d-443d-8241-ae1dce15ea5a.jpg


    上面这个截图会将写入的数据和读出的数据实时的显示出来,而且监视着当前是否错误。这样的仿真验证就比较容易差错了。


    Testbench代码如下:


module vtf_uart_top_v;


 


// DATE:     Sat Aug 11 10:03:33 2007


// TITLE:   


// MODULE:   my_uart_top


// DESIGN:   my_uart_top


// FILENAME: my_uart_top


// PROJECT:  test


// VERSION:  Version


 


// Inputs


    reg clk;


    reg rst_n;


    reg rs232_rx;


 


// Outputs


    wire rs232_tx;


 


// Bidirs


 


// Instantiate the UUT


    my_uart_top d (


        .clk(clk),


        .rst_n(rst_n),


        .rs232_rx(rs232_rx),


        .rs232_tx(rs232_tx)


        );


 


// Initialize Inputs


 


    parameter  RESET_TIME = 1000;


   initial begin


      rst_n = 1'b0;  // RESET pulse


       # RESET_TIME rst_n = 1'b1;  //after 1us,RESET over


    end


 


    parameter CLOCK_20NS = 20;


    initial begin


       clk = 1'b0;


       forever


           # (CLOCK_20NS/2) clk = ~clk;    // 20ns CLOCK


    end


 


    parameter BPS_9600 = 104140;


    integer i;


    reg[7:0] test_data;


    initial begin


       rs232_rx = 1'b1;


       test_data = 0;


       repeat (256) begin


           transmit_data(test_data);


           # (BPS_9600*15);  //delay 1 unit transmit time          


           test_data = test_data+1;


       end


    end


 


    task transmit_data;


       input[7:0] SEND_DATA;


       begin


          rs232_rx = 1'b1;   //RESET rs232_rx


           # BPS_9600 rs232_rx = 1'b0; // transmit START bit


           $display ("write data: %d\n",SEND_DATA);


           for (i=0;i<8;i=i+1)      //transmit DATA byte


              # BPS_9600 rs232_rx = SEND_DATA;


   


           # BPS_9600 rs232_rx = 1'b0; // transmit STOP bit


           # BPS_9600 rs232_rx = 1'b1; // bus IDLE


       end


    endtask


 


//


    reg[7:0] tran_data;  // receive transmit data byte


    integer error_counter;   // error times per 256 times transmit


 


    initial begin


       error_counter = 0;


    end


 


    always @ (negedge rs232_tx) begin


       # (BPS_9600/2)


 


       for (i=0;i<8;i=i+1)


           # BPS_9600 tran_data = rs232_tx;    //receive data byte


 


       # BPS_9600


       $display ("read data: %d\n",tran_data);


       if(tran_data != test_data) error_counter = error_counter + 1;


       # (BPS_9600/2);


       $display ("%d errors occur current transmit\n",error_counter);


    end


   


endmodule


 

PARTNER CONTENT

文章评论11条评论)

登录后参与讨论

用户1855852 2015-11-7 18:15

你用的是文本发送把 一般的串口助手只能发送单字节 aisc码没有88的

用户1845570 2015-10-8 11:34

问一下,这里为什么是104140,怎么算出来的

用户1600440 2011-5-30 15:22

特权同学,用你的串口例程和这里的testbench,为什么modelsim调试正常的,但下到板子里面串口调试助手做上位机发送数据出问题,比如发送88,接收只有8,只有第一位呀!?不知道和我用的串口转USB线是不是有问题。

ilove314_323192455 2010-11-23 20:42

通常什么都别接

用户1083553 2010-11-23 16:15

特权兄 你好 请教一个问题:我现在使用Cyclone3 FPGA ,采用JTAG+AS配置方式,在线对EPCS芯片进行配置,只使用一个下载头插座,那么下载头插座上的pin6引脚该如何接?查看Altera的文档,该引脚接VIO,VIO必须与器件的VCCA一致,那是不是接到2.5V就可以了呢?

ilove314_323192455 2010-11-22 12:01

后续尽力吧

用户239459 2010-11-18 16:35

写得好,如果能把文章所涉及的 参考文档资料也列出来,就好拉。加油。

用户234619 2010-6-7 13:13

9600bps对应的时钟周期算下来是104167ns(四舍五入到个位),为什么用了104160? 3Q!

用户234619 2010-6-7 11:42

停止位应该为高电平吧?

ilove314_323192455 2008-9-10 18:30

你再看看pcf8591的时钟延时方面是不是和我的程序有出入,耐心点总会把问题解决的,加油啊
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
EE直播间
更多
我要评论
11
17
关闭 站长推荐上一条 /3 下一条