原创 TestBench的IIC从机设计

2008-9-9 18:43 8450 16 17 分类: FPGA/CPLD

TestBenchIIC从机设计<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


    这个testbench的编写是基于之前日志里的基于FPGAIIC通信而做的,原来只是做了简单的主机写随机地址EEPROM,然后主机读随机地址EEPROM,都是只有一个字节的,做的是最简单的通信。所以这次testbench设计IIC从机也是和前面的相对应的。


    Testbench代码:


 


`timescale 1ns/1ns


module testbench();


 


// DATE:     Wed Aug 15 08:35:56 2007


// TITLE:    


// MODULE:   iic_top09


// DESIGN:   iic_top09


// FILENAME: iic_top09


// PROJECT:  top_dram


// VERSION:  Version


 


 


// Inputs


    reg clk;


    reg rst_n;


    reg sw1;


    reg sw2;


 


 


// Outputs


    wire scl;


    wire led_d2;


    wire led_d3;


    wire led_d4;


    wire led_d5;


 


 


// Bidirs


    wire sda;


 


 


// Instantiate the UUT


    iic_top09 d (


        .clk(clk),


        .rst_n(rst_n),


        .sw1(sw1),


        .sw2(sw2),


        .scl(scl),


        .sda(sda),


        .led_d2(led_d2),


        .led_d3(led_d3),


        .led_d4(led_d4),


        .led_d5(led_d5)


        );


 


    initial begin


        clk = 0;


        forever #10 clk = ~clk; //产生50MHz的时钟


    end


 


    initial begin


        rst_n = 0;  //复位


        #2000 rst_n = 1;    //复位持续2us后结束


    end


 


    initial begin


        sw1 = 1;


        sw2 = 1;


        #20000000   sw1 = 0;    //delay 20ms,iic write


        #20000000 sw1 = 1;  //delay 20ms,iic idle


        #20000000 sw2 = 0;  //delay 20ms,iic read


        #20000000 sw2 = 1;  //delay 20ms,iic idle


    end


 


    reg start;  //start=1:通信中,start=0:通信结束


    initial start = 0;


    always @ (sda)  begin


        if(scl && !sda) start = 1;  //接收到起始位


        if(scl && sda) start = 0;   //接收到结束位


    end


 


    reg sda_link;   //sda控制位


    reg sda_out;    //


    reg[7:0] device_addr;   //器件地址


    reg[7:0] eeprom_addr;   //数据地址


    reg[7:0] eeprom_data;   //数据


    reg[7:0] addr0_data,addr1_data; //0地址和1地址数据存储器


    reg lsb_data;   //


    initial begin


        device_addr = 8'd0;


        sda_link = 1'b0;


//      lsb_data = 1'b0;


    end


    always @ (posedge start) begin  //数据通信中


        repeat (8) begin    //接收器件地址


            @ (posedge scl);


            #10 device_addr = device_addr << 1;


            device_addr[0] = sda;


        end


        if(device_addr != 8'b10100000) begin


            $display ("device address ERROR!");


            $stop;


        end


        @ (posedge scl);


        sda_out = 0;    //ack      


        sda_link = 1;


        @ (negedge scl);


        sda_link = 0;


        repeat (8) begin    //接收数据地址


            @ (posedge scl);


            #10 eeprom_addr = eeprom_addr << 1;


            eeprom_addr[0] = sda;


        end


        @ (posedge scl);


        sda_out = 0;    //ack      


        sda_link = 1;


        @ (negedge scl);


        sda_link = 0;


        @ (posedge scl);


        lsb_data = sda;


        @ (negedge scl);


        if(lsb_data == sda) write_eeprom;


        else read_eeprom;              


    end


 


    task write_eeprom;


        begin


        eeprom_data[0] = lsb_data;


        repeat (7) begin


            @ (posedge scl);


            #10 eeprom_data = eeprom_data << 1;


            eeprom_data[0] = sda;


        end


        # 10;


        case (eeprom_addr) //存储数据到相应地址,本测试只仿真0地址和1地址


            0:  addr0_data = eeprom_data;


            1: addr1_data = eeprom_data;


            default:    ;


            endcase


        @ (posedge scl);


        sda_out = 0;    //ack


        sda_link = 1;


        @ (negedge scl);


        sda_link = 0;


        end


    endtask


 


    reg[7:0] addr_data; //


    task read_eeprom;


        begin


    //      device_addr[0] = lsb_data;


            repeat (8) begin    //接收器件地址


                @ (posedge scl);


                #10 device_addr = device_addr << 1;


                device_addr[0] = sda;


            end


            if(device_addr != 8'b10100001) begin


                $display ("device address ERROR!");


                $stop;


            end


            @ (posedge scl);


            sda_out = 0;    //ack      


            sda_link = 1;      


            case (eeprom_addr)


                0: addr_data = addr0_data;


                1: addr_data = addr1_data;


                default: ;


                endcase


            repeat (8) begin


                @ (posedge scl);


                sda_out = addr_data[7];


                #10 addr_data = addr_data << 1;


            end


            @ (posedge scl);


            sda_out = 0;    //ack


            @ (negedge scl);


            sda_link = 0;  


        end


    endtask


 


    assign sda = sda_link ? sda_out : 1'bz;


 


endmodule


 


仿真波形:


    前面是主机写,后面是主机收,重点可以看应答位以及byte_data1。(byte_data1是主机写入EEPROM的数据,byte_data2是主机读出的写入数据)。


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


点击看大图 


    这个图是放大了的写入数据过程(观察sda的变化):


 



点击看大图 


    这个图是放大了的读出数据的过程:


 



点击看大图 


 


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户427279 2013-4-18 10:45

initial begin sw1 = 1; sw2 = 1; #20000000 sw1 = 0; //delay 20ms,iic write #20000000 sw1 = 1; //delay 20ms,iic idle #20000000 sw2 = 0; //delay 20ms,iic read #20000000 sw2 = 1; //delay 20ms,iic idle 为什么在同一时间 SW1或SW2可以赋两个值??? end

用户122571 2010-11-24 15:31

支持特权

用户239459 2010-11-24 12:04

相关推荐阅读
特权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直播间
更多
我要评论
1
16
关闭 站长推荐上一条 /3 下一条