реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> мультиплексор шины в SV
L47
сообщение Dec 14 2017, 04:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 28-05-14
Пользователь №: 81 793



Здравствуйте,
Прошу помочь:
Правильно ли утверждение: если создать одну шину данных,направленную в сторону мастера, и адресную шину, далее соединить шину данных слейвов с мастером напрямую (без применения явного описания мультиплексора по адресам), то компилятор сам формирует мультиплексор?

допустим:
создаем модуль мастера, перебирающий адреса,создаем слейв, комбинационной логикой мультиплексируем по адресу выходную шину, но если реализовывать слейв следующими способами результаты получаются разными:

реализация слейва через интерфейс:
1.мультиплексирование данных по адресу:
modelsim - ошибка
Цитата
driven in a combinatorial block, may not be driven by any other process.

quartus - полная компиляция выполненяется
2.с отдельным процессом мультиплексирования шины по адресу внутри слейва:
modelsim - ошибка
Цитата
driven in a combinatorial block, may not be driven by any other process.

quartus - полная компиляция выполненяется


реализация слева без интерфейса - портами:
1.мультиплексирование данных по адресу:
modelsim - моделирование выполняется с ошибкой передачи шины по одному адресу из четырех
Прикрепленное изображение

quartus - полная компиляция выполненяется
2.с отдельным процессом мультиплексирования шины по адресу внутри слейва:
modelsim - моделирование выполняется без ошибок
quartus - полная компиляция выполненяется



С чем связаны различные варианты результатов?
Как правильно реализовать чтение из множества ведомых модулей по адресу?
Код
`timescale 1ns / 1ps

`define COMB;//COMB or REG

module tb();
    //===========================================/
    //GEN
    //===========================================/
    logic clk = 'b0;
    logic [31:0] data;
    always #10 clk <= ~clk;
    multi_slave multi_slave_inst(
        .*
        );
endmodule


module multi_slave
        (
        input logic clk,
        output logic [31:0] data
        );
    logic [31:0] readdata;
    logic [7:0] addr;
    
            
    master master_inst(
        .*
        );

    slave_1 slave_1_inst(
        .*
        );
    slave_2 slave_2_inst(
        .*
        );
    


endmodule

module master
        (
        input logic [31:0] readdata,
        input logic clk,
        output logic [7:0] addr,
        output logic [31:0] data
        );
    enum int unsigned {
        ONE,
        TWO,
        THREE,
        FOUR
        } st;
    logic delay = 'b0;
    always_ff@(posedge clk)
        begin
        case (st)
            ONE:
                begin
                addr <= 1;
                st <= TWO;
                end
            TWO:
                begin
                addr <= 2;
                st <= THREE;
                end
            THREE:
                begin
                addr <= 3;
                st <= FOUR;
                end
            FOUR:
                begin
                addr <= 4;
                st <= ONE;
                end                
            default:
                begin
                st <= ONE;
                delay <= 1'b0;
                addr <= 1;
                end
            endcase
        end
        
    logic [64:0] sreg = 'b0;
    
    always_ff@(posedge clk) sreg <= {sreg[31:0],readdata};
    assign data[31:0] = sreg[63:32];
endmodule
/*****************COMB*******************/
`ifdef COMB
module slave_1
        (
        input logic clk,
        input logic [7:0] addr,
        output logic [31:0] readdata
        );
    logic [31:0] readdata_s1;
    always_comb
        begin
        case(addr)
            8'd1: readdata = readdata_s1;
            8'd2: readdata = readdata_s1;
            default: readdata = 'bZ;
            endcase
        end
    always_comb
        begin
        case(addr)
            8'd1: readdata_s1 = "S1_1";
            8'd2: readdata_s1 = "S1_2";
             default: readdata_s1 = 'bZ;
            endcase
        end
endmodule

module slave_2
        (
        input logic clk,
        input logic [7:0] addr,
        output logic [31:0] readdata
        );
    logic [31:0] readdata_s2;
    always_comb
        begin
        case(addr)
            8'd3: readdata = readdata_s2;
            8'd4: readdata = readdata_s2;
             default: readdata = 'bZ;
            endcase
        end
    always_comb
        begin
        case(addr)
            8'd3: readdata_s2 = "S2_3";
            8'd4: readdata_s2 = "S2_4";
             default: readdata_s2 = 'bZ;
            endcase
        end
endmodule


Go to the top of the page
 
+Quote Post
Tausinov
сообщение Dec 14 2017, 10:49
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 19-10-13
Пользователь №: 78 795



'z'-состояние везде настоятельно рекомендуют использовать только для внешних ног, к которым подключены двунаправленные буферы. Внутри же самой ПЛИС никаких z-состояний быть не может.
Если совсем не заморачиваться, то можно вместо 'z' выставить все '0', а на вход мастера подавать результат ОРа всех шин. Другой вариант - описать мультиплексор самому.
Go to the top of the page
 
+Quote Post
Koluchiy
сообщение Dec 15 2017, 14:55
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 935
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



Моделсим более строго, чем компиляторы, соблюдает стандарт Верилога.
Поэтому некорректные, но понятные сердцем конструкции могут нормально компилироваться и работать в железе, но симулироваться неправильно.

В Вашем случае, да и во всех других, нужно не лениться описать поведение блоков подробно, не оставляя детали на откуп понимания симулятора/компилятора.
Убережете себя от многих внезапных открытий.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd January 2018 - 09:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01229 секунд с 7
ELECTRONIX ©2004-2016