Не удается разрешить несколько постоянных драйверов для сети "sda_reg" - PullRequest
0 голосов
/ 26 ноября 2018

Я пытался сделать простого Мастера в Верилоге.На данный момент он должен просто отправить адрес раба.Кажется, есть проблема в моем процессе clock == 0.Потому что я получаю следующее сообщение об ошибке: Error (10028): Can't resolve multiple constant drivers for net "sda_reg" at Master.v(33) Я прочитал, что есть проблема, когда я изменяю значение (в данном случае sda_reg) одновременно, но из-за того, что sda_reg модифицируется в разных состоянияхЯ не заявляю о проблеме:

Код:

module Master
(button,clk,scl,sda);


    inout scl;
    inout sda;
    input clk;
    input button;



    reg ack_reg;
    reg[2:0] ack_counter;
    reg sda_reg;
    reg scl_reg;

    reg[7:0] i2c_adress;
    reg read_write;


    //states
    reg[1:0] state;
    parameter idle=0, start=1, send=2;

    initial begin
            ack_reg = 1'b0;
            ack_counter = 3'b0;
            sda_reg = 1'b0;
            i2c_adress = 8'b11011101;
    end


    always@(posedge clk) begin
            case(state)
                idle: begin
                    if(button) begin
                            state <= start;
                        end
                end
                start: begin
                    sda_reg <= 1'b0;
                    state <= send;
                end /*
                send: begin
                    if(ack_counter == 8 && sda) begin
                            state <= idle;
                        end
                end */

            endcase
        end

    always@(clk == 0) begin
            case(state)
                send: begin
                    //Counter for 8 bits
                    ack_counter <= ack_counter +1;
                    //Getting the Most Important bit
                    sda_reg <= i2c_adress[7];
                    //Shifting Adress for one bit 
                    i2c_adress <= i2c_adress << 1;
                end
            endcase
        end

    //Wire data to output       
    assign sda = sda_reg;
    assign scl = clk;



endmodule

1 Ответ

0 голосов
/ 15 декабря 2018
inout scl; // Why this bidirectional?
inout sda;

always@(clk == 0) // What does it mean?

Поскольку sda находится в состоянии inout, вы должны использовать выходной буфер с тремя состояниями.Когда вы читаете данные из sda, выход буфера в трех состояниях устанавливается в высокий-Z (направление == 0). Пример:

assign sda = (direction) ? sda_reg : 1'bZ;

Перед тем, как изменить код, пожалуйста, прочитайте о сигналах бинактиналя.

...