Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fpga AXI IIC总线:SDA上无数据波形_Fpga_Vivado - Fatal编程技术网

Fpga AXI IIC总线:SDA上无数据波形

Fpga AXI IIC总线:SDA上无数据波形,fpga,vivado,Fpga,Vivado,我在vivado上使用AXI IIC总线IP核。即使我将相应的数据写入寄存器,sda数据线也没有变化。 这是ip核心的寄存器。 编程顺序如下所示。 似乎我只需要完成第一步和第二步,就可以在SDA上看到波形图的变化 这是一个top.v(不是我的原创,参考自) 模块i2c\u通道#( 参数通道输出宽度=16 )( 输入时钟, 输入复位, //奴隶的地址; 输入[6:0]从机地址, //指定地址处从机预期的消息宽度; 输入[127:0]从站\u消息\u宽度, 在sda之外, 在没有scl的情况下,

我在vivado上使用AXI IIC总线IP核。即使我将相应的数据写入寄存器,sda数据线也没有变化。 这是ip核心的寄存器。

编程顺序如下所示。

似乎我只需要完成第一步和第二步,就可以在SDA上看到波形图的变化 这是一个top.v(不是我的原创,参考自)

模块i2c\u通道#(
参数通道输出宽度=16
)(
输入时钟,
输入复位,
//奴隶的地址;
输入[6:0]从机地址,
//指定地址处从机预期的消息宽度;
输入[127:0]从站\u消息\u宽度,
在sda之外,
在没有scl的情况下,
输出[通道输出宽度-1:0]通道输出
);
导线iic2intc_irpt;
//AXI全球系统信号
电线s_axi_aclk;
分配s_axi_aclk=clk;
注册s_axi_aresetn;
//AXI写入地址通道信号
reg[31:0]s_axi_awaddr;
注册s_axi_awvalid;
电线s_axi_awready;
//AXI写入数据通道信号
reg[31:0]s_axi_wdata;
reg[3:0]s_axi_wstrb;
注册s_axi_wvalid;
电线s_轴_环;
//AXI写入响应通道信号
电线[1:0]s_axi_bresp;
电线s_axi_bvalid;
reg s_axi_bready;
//AXI读地址通道信号
reg[31:0]s_axi_araddr;
注册s_axi_arvalid;
电线s_axi_arready;
//AXI读取数据通道信号
导线[31:0]s_axi_rdata;
导线[1:0]s_axi_rresp;
电线s_axi_rvalid;
注册s_axi_rready;
//IIC信号
reg sda_i;
电线sda_o;
电线sda_t;
reg scl_i;
电线scl_o;
电线接头;
注册gpo;
注册状态完成;
//i2C态
`定义SET_TX_FIFO 4'b0000
`定义设置接收FIFO PIRQ 4'b0001
`定义SET_CR_MSMS_TX 4'b0010
`定义集合\u CR\u TXAK 4'b0011
reg[3:0]状态;
初始开始

状态一个明显的错误是,您的SDA和SCL应该在初始状态下拉起

您的波形显示sda_o、sda_i、scl_o和scl_i在任何给定时间都不会被拉起。所以也许你需要检查一下。(要么是要检查的硬件原理图,要么是要设置的IO约束。)

module i2c_channel #(
    parameter                               CHANNEL_OUTPUT_WIDTH    =   16
)(
    input                                   clk,
    input                                   reset,
    //the address of the slave;
    input   [6:0]                           slave_address,

    //The width of the message expected from the slave at the specified address;
    input   [127:0]                         slave_message_width,
    inout                                   sda,
    inout                                   scl,
    output  [CHANNEL_OUTPUT_WIDTH - 1:0]    channel_output   
);
    wire                                       iic2intc_irpt  ;

    //AXI Global System Signals
    wire s_axi_aclk;
   assign        s_axi_aclk      =   clk;
    reg                                       s_axi_aresetn     ;

    //AXI Write Address Channel Signals
    reg       [31:0]                          s_axi_awaddr    ;
    reg                                       s_axi_awvalid   ;
    wire                                       s_axi_awready;

    //AXI Write Data Channel Signals
    reg       [31:0]                          s_axi_wdata     ;
    reg       [3:0]                           s_axi_wstrb     ;
    reg                                       s_axi_wvalid    ;
   wire                                       s_axi_wready;

    //AXI Write Response Channel Signals
    wire       [1:0]                           s_axi_bresp;
    wire                                      s_axi_bvalid;
    reg                                       s_axi_bready    ;

    //AXI Read Address Channel Signals
    reg       [31:0]                          s_axi_araddr       ;
    reg                                       s_axi_arvalid  ;
    wire                                       s_axi_arready;

    //AXI Read Data Channel Signals
    wire       [31:0]                          s_axi_rdata;
    wire       [1:0]                           s_axi_rresp;
    wire                                       s_axi_rvalid;
    reg                                       s_axi_rready  ;

    //IIC signals
    reg                                    sda_i          ;
    wire                                       sda_o;
    wire                                     sda_t;
    reg                                       scl_i           ;
    wire                                       scl_o;
    wire                                       scl_t;
    reg                                       gpo           ;

    reg                                       state_done;
    //i2C state
    `define  SET_TX_FIFO 4'b0000
       `define  SET_RX_FIFO_PIRQ 4'b0001
        `define SET_CR_MSMS_TX 4'b0010
        `define  SET_CR_TXAK 4'b0011
   reg[3:0]state;
   initial begin
   state<=4'b0000;

   end


    //tri-state open-collector buffers to convert the iic signals to bi-directional inouts.
    assign sda = sda_t ? sda_o : sda_i;
    assign sda = scl_t ? scl_o : scl_i;

axi_iic_1 iic (
    .iic2intc_irpt(),
    .s_axi_aclk(s_axi_aclk),
    .s_axi_aresetn(s_axi_aresetn),
    .s_axi_awaddr(s_axi_awaddr[8:0]),
    .s_axi_awvalid(s_axi_awvalid),
    .s_axi_awready(s_axi_awready),
    .s_axi_wdata(s_axi_wdata),
    .s_axi_wstrb(s_axi_wstrb),
    .s_axi_wvalid(s_axi_wvalid),
    .s_axi_wready(s_axi_wready),
    .s_axi_bresp(s_axi_bresp),
    .s_axi_bready(s_axi_bready),
    .s_axi_bvalid(s_axi_bvalid),
    .s_axi_araddr(s_axi_araddr),
    .s_axi_arvalid(s_axi_arvalid),
    .s_axi_arready(s_axi_arready),
    .s_axi_rdata(s_axi_rdata),
    .s_axi_rvalid(s_axi_rvalid),
    .s_axi_rresp(s_axi_rresp),
    .sda_i(sda_i),
    .sda_o(sda_o),
    .sda_t(sda_t),
    .scl_i(scl_i),
    .scl_o(scl_o),
    .scl_t(scl_t) 
);



always @(clk)  begin
    s_axi_aresetn   <=  ~reset;
end

//Sets an axi data write operation.
task set_a_axi_w ;
input [31:0] awaddr;
input [31:0] wdata;
begin
    s_axi_awaddr   =  awaddr;
    s_axi_wdata     =  wdata;
    s_axi_awvalid   =  1'b1; 
    s_axi_bready    =  1'b1;
    s_axi_wvalid    =  1'b1;  
    end 
endtask

//set the state of the operation. 
task set_state ;

input[3:0] new_state;
    if(s_axi_awready) begin
        state           =  new_state; 
    end
endtask

//when the module is initialized, write the i2c address of the target slave to the TX_FIFO register.
//Write the IIC peripheral device addresses for the first slave device to the TX_FIFO.
always @(posedge clk)  begin

    case (state)
        `SET_TX_FIFO : begin
            set_a_axi_w(32'h108, slave_address);
            set_state(`SET_RX_FIFO_PIRQ);
        end 
        `SET_RX_FIFO_PIRQ : begin
            set_a_axi_w(32'h120, slave_message_width - 2);
            set_state(`SET_CR_MSMS_TX); 
        end
        `SET_CR_MSMS_TX : begin
            set_a_axi_w(32'h100, 8'b00000101);
            set_state(`SET_CR_TXAK);
        end
    endcase

    if(s_axi_awready) begin
        //s_axi_awaddr    <=  '0;
        s_axi_awvalid   <=  1'b0;
    end

    if(s_axi_wready)  begin
        //s_axi_wdata    <=  '0;
        s_axi_wvalid   <=  1'b0;    
    end

    if (s_axi_bvalid)  begin
        s_axi_bready   <=  1'b0;    
    end/**
    else begin
        s_axi_bready <=1'b0;
    end**/
end

endmodule
    module i2c_channel_tb();

//Parameters
parameter CLK_PERIOD = 10;

reg           clk      =   1'b1;
reg          reset           =   1'b1;
reg   [6:0]   slave_address   =   6'b0;

wire           sda;
wire           scl;


i2c_channel i2c_channel_1 (
    .clk(clk),
    .reset(reset),
    .slave_address(slave_address),
    .slave_message_width(128'd16),
    .sda(sda),
    .scl(scl)
);
/*
i2c_channel_slave_model i2c_channel_slave_model_1 (
    .sda(sda),
    .scl(scl)
);**/

initial begin
    clk                 <=  1'b0;
    reset               <=  1'b0;
    slave_address       <=  7'b100_1011;
end

//psuedo-clock
always #10 begin
    clk <= ~clk;
end
endmodule