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

📄 signal.txt

📁 用verilog实现了IIC接口与EEPROM存储器的接口设计
💻 TXT
字号:
`timescale 1ns/1ns
`define timeslice 200
module Signal(RESET,CLK,RD,WR,ADDR,ACK,DATA);
    output RESET;     //复位信号
    output CLK;       //时钟信号
    output RD,WR;      //读写信号
    output[10:0] ADDR;     // 11位地址信号
    input ACK;         //读写周期的应答信号
    input[7:0] DATA;  // 数据线
    reg RESET;
    reg CLK;
    reg RD,WR;
    reg W_R;         //低位:写操作;高位:读操作
    reg[10:0] ADDR;
    reg[7:0] data_to_eeprom;
    reg[10:0] addr_mem[0:255];
    reg[7:0] data_mem[0:255];
    reg[7:0] ROM[0:2047];
    integer i,j;
    integer OUTFILE;
    assign DATA=(W_R)?8'bz:data_to_eeprom;
    
    //-----------时钟信号输入---------------------
    always #(`timeslice/2)
    CLK=~CLK;
    
    
    //-----------读写信号输入---------------------
    initial
       begin
           RESET=1;
           i=0;
           j=0;
           W_R=0;
           CLK=0;
           RD=0;
           WR=0;
           #1000;
           RESET=0;
           repeat(15)   //连续些15次数据,调试成功后可以增加到全部地址覆盖测试
           begin
               #(5*`timeslice);
               WR=1;
               #(`timeslice);
               WR=0;
               @(posedge ACK);   //EEPROM_WR转换模块请求写数据
           end
           #(10*`timeslice)
           W_R=1;         //开始读操作
           repeat(15)      //连续读15次数据
           begin
               #(5*`timeslice);
               RD=1;
               #(`timeslice);
               RD=0;
               @(posedge ACK);      //EEPROM_WR转换模块请求读数据
           end
       end
  
       
        
    
    //----------写操作--------------------------
    initial
    begin
        $display("writing----writing----writing----writing");
        #(2*`timeslice);
        for(i=0;i<=15;i=i+1)
           begin
               ADDR=addr_mem[i];            //输出写操作的地址
               data_to_eeprom=data_mem[i];   //输出需要转换的并行数据
               $fdisplay(OUTFILE,"@%0h   %0h",ADDR,data_to_eeprom);
               //把输出的地址和数据记录在已经打开的eeprom.dat文件中
               @(posedge ACK)  ;    //EEPROM_WR转换模块请求写数据
           end
       end
       
    
    //----------读操作---------------------------
    initial
    @(posedge W_R)
    begin
        ADDR=addr_mem[0];
        $fclose(OUTFILE);      //关闭已经打开的eeprom.dat文件
        $readmemh("./eeprom.dat",ROM);      //把数据文件的数据读到ROM中
        $display("Begin READING----READING----READING----READING----");
        for(j=0;j<=15;j=j+1)
        begin
            ADDR=addr_mem[j];
            @(posedge ACK);
            if(DATA==ROM[ADDR])      //比较并显示发送的数据和接收到的数据是否一致
            $display("DATA%0h==ROM[%0h]---read right",DATA,ADDR);
            else
            $display("DATA%0h!=ROM[%0h]---read wrong",DATA,ADDR);
        end
    end
    
    initial
    begin
        OUTFILE=$fopen("./eeprom.dat");      //打开一个名为eeprom.dat的文件备用
        $readmemh("./addr.dat",addr_mem);      //把地址数据存入到地址存储器
        $readmemh("./data.dat",data_mem);      //吧准备写入EEPROM的数据存入数据存储器
    end
    
endmodule
            

⌨️ 快捷键说明

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