Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Описание стека на Verilog
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Consigliere
Идея в том, чтоб описать 8-битный стек, запись и чтение производится с помощью управляющего сигнала "wr"
Код
module stack(out_stack, in_stack);
    output [7:0] out_stack;
    input [7:0] in_stack;
    wire st0 [7:0],
    st1 [7:0],
    st2 [7:0],
    st3 [7:0],
    st4 [7:0],
    st5 [7:0],
    st6 [7:0],
    st7 [7:0];
    wire wr;
    
        
    always in_stack
        
    if (wr)
        st7 = st6;
        st6 = st5;
        st5 = st4;
        st4 = st3;
        st3 = st2;
        st2 = st1;
        st1 = st0;
        st0 = in_stack;
        
endmodule

при компиляции выдает данное сообщение
Цитата
# Pass 1. Scanning modules hierarchy.
# Error: VCP2000 stack.v : (20, 8): Syntax error. Unexpected token: =. Expected tokens: '#' , '(' , ':' , 'delay' , ',' ... .
# Error: VCP2000 stack.v : (21, 8): Syntax error. Unexpected token: =. Expected tokens: '#' , '(' , ':' , 'delay' , ',' ... .
# Error: VCP2000 stack.v : (22, 8): Syntax error. Unexpected token: =. Expected tokens: '#' , '(' , ':' , 'delay' , ',' ... .
# Error: VCP2000 stack.v : (23, 8): Syntax error. Unexpected token: =. Expected tokens: '#' , '(' , ':' , 'delay' , ',' ... .
# Error: VCP2000 stack.v : (24, 8): Syntax error. Unexpected token: =. Expected tokens: '#' , '(' , ':' , 'delay' , ',' ... .
# Error: VCP2000 stack.v : (25, 8): Syntax error. Unexpected token: =. Expected tokens: '#' , '(' , ':' , 'delay' , ',' ... .
# Error: VCP2000 stack.v : (26, 8): Syntax error. Unexpected token: =. Expected tokens: '#' , '(' , ':' , 'delay' , ',' ... .
# Warning: VCP2515 stack.v : (21, 1): Undefined module: st4 was used. Port connection rules will not be checked at such instantiations.
# Warning: VCP2515 stack.v : (20, 1): Undefined module: st5 was used. Port connection rules will not be checked at such instantiations.
# Warning: VCP2515 stack.v : (23, 1): Undefined module: st2 was used. Port connection rules will not be checked at such instantiations.
# Warning: VCP2515 stack.v : (22, 1): Undefined module: st3 was used. Port connection rules will not be checked at such instantiations.
# Warning: VCP2515 stack.v : (26, 1): Undefined module: in_stack was used. Port connection rules will not be checked at such instantiations.
# Warning: VCP2515 stack.v : (25, 1): Undefined module: st0 was used. Port connection rules will not be checked at such instantiations.
# Warning: VCP2515 stack.v : (24, 1): Undefined module: st1 was used. Port connection rules will not be checked at such instantiations.
# Compile failure 7 Errors 7 Warnings Analysis time : 0[s].
# done

не могу понять что я делаю не так...
Заранее спасибо за помощь.)

если не туда разместил тему перенесите пожалуйста в нужный раздел форума
yuri_d
1) при работе со стеком подразумевается, что есть сигналы для записи и для чтения. И те и другие должны присутствовать в описании интерфейса модуля.

2) в always блоке нельзя присваивать значения сигналам типа wire. Используйте регистры.

3) для группировки операторов следует использовать begin end. У Вас if(wr) применяется только для первого оператора.

4) wire xx [7:0] описывает массив из восьми однобитовых элементов. Для описания 8-битной шины нужно писать wire [7:0] yy
XVR
Цитата(Consigliere @ Mar 13 2008, 10:27) *
Идея в том, чтоб описать 8-битный стек, запись и чтение производится с помощью управляющего сигнала "wr"

не могу понять что я делаю не так...




Мда, все не так sad.gif


Код


module stack(output [7:0] out_stack, input [7:0] in_stack, input wr);
    reg [7:0] st0,  st1,  st2,  st3, st4, st5, st6,  st7;
            
    always @(posedge wr) begin
        st7 <= st6;
        st6 <= st5;
        st5 <= st4;
        st4 <= st3;
        st3 <= st2;
        st2 <= st1;
        st1 <= st0;
        st0 <= in_stack;
     end



    assign out_stack = st7;


endmodule
iosifk
Цитата(Consigliere @ Mar 13 2008, 10:27) *
Идея в том, чтоб описать 8-битный стек, запись и чтение производится с помощью управляющего не могу понять что я делаю не так...


У меня на сайте есть статья "микропроцессор своими руками" и к ней есть простой проект. Правда там AHDL, но все же лучше, чем ничего...
Стек можно сделать на триггерах, можно на памяти...
Удачи!
Consigliere
спасибо, всем за помощьsmile.gif
а можно еще один вопрос
Цитата
assign out_stack = st7;

у нас когда в стек записываются данные, он автоматически считывает?
У меня вообще сомнение верно ли я написал что у него вход и выход, у меня данные в него будут подаваться с шины I2C. Или нужно использовать вход как выход, одновременно же все равно не смогут данные записываться и считываться из стека.
XVR
Цитата(Consigliere @ Mar 13 2008, 13:07) *
спасибо, всем за помощь smile.gif
а можно еще один вопрос


assign out_stack = st7;


у нас когда в стек записываются данные, он автоматически считывает?
Он всегда возвращает значение последнего элемента стека.

На самом деле у тебя описан не стек а линия задержки на 8 тактов wr.


Цитата
У меня вообще сомнение верно ли я написал что у него вход и выход, у меня данные в него будут подаваться с шины I2C. Или нужно использовать вход как выход, одновременно же все равно не смогут данные записываться и считываться из стека.


Ты уж определись стек у тебя или что, и что и как должно в него записываться и читаться. Что касается I2C то вообще не понятно что из нее и куда должно подаваться и читаться.
Consigliere
Ну смотри, это не реальное задание, а так, просто выдуманное для практики, мне преподаватель посоветовал стек описать таким образом как я привел выше.
А суть в том, что есть у нас шина, она передает данные, когда надо записывает в этот "стек", когда надо считывает из данного "стека" и все. Запись и чтение "стека" управляется отдельным устройством, с которого и приходит сигнал wr. По крайней мере мое понимание такое.
Consigliere
Цитата(CaPpuCcino @ Mar 13 2008, 21:58) *

спасибо, но уже читал ранее.)
CaPpuCcino
писал находу без верификации. так что могут быть и ошибки
Код
module stack #(
                                parameter word_width=8,
                                parameter stack_depth=16
                            )
                        (
                            input bit clk,
                            input bit reset_n,
                            input bit stack_pop,
                            input bit stack_push,
                            output bit stack_full,
                            output bit stack_empty,
                            input bit [word_width-1:0] data_in,
                            output bit [word_width-1:0] data_out
                        );

function int log2(input int number);
    int temp;
     temp  = 1;
     log2 = 0;
     while (temp<number)
       begin
          log2 = log2+1;
          temp  = temp*2;
       end
endfunction

bit [log2(stack_depth)-1:0]stack_pointer;
bit [word_width-1:0]stack[stack_depth];


    always_ff @(posedge clk)
        begin
            if (reset_n==1'b0)
                begin
                    stack_pointer<=0;
                    stack_empty<=1'b1;
                    stack_full<=1'b0;
                end
            else
                begin
                    if(stack_pop==1'b1)
                        begin
                            if (stack_empty!=1'b1)stack_pointer<=stack_pointer-1;
                            data_out<=stack[stack_pointer-1];
                            if (stack_pointer==1)
                                stack_empty<=1'b1;
                            stack_full<=1'b0;
                        end
                    if(stack_push==1'b1)
                        begin
                            if (stack_full!=1'b1)
                                begin
                                    stack_pointer<=stack_pointer+1;
                                    stack[stack_pointer]<=data_in;
                                    data_out<=data_in;
                                end
                            if (stack_pointer==stack_depth-2)
                                stack_full<=1'b1;
                            stack_empty<=1'b0;
                        end
                end
        end

endmodule
XVR
Цитата(Consigliere @ Mar 13 2008, 21:36) *
Ну смотри, это не реальное задание, а так, просто выдуманное для практики,


Т.е. что оно реально делает до лампочки ?

Цитата
мне преподаватель посоветовал стек описать таким образом как я привел выше.
То, что описано выше - вообще не стек а недоделанное FIFO.

Цитата
А суть в том, что есть у нас шина, она передает данные,


По I2C передаются не только данные, там еще передаются адреса и комманды.

Цитата
когда надо записывает в этот "стек", когда надо считывает из данного "стека" и все.
'Когда надо' - это когда?

Цитата
Запись и чтение "стека" управляется отдельным устройством, с которого и приходит сигнал wr. По крайней мере мое понимание такое.
Запись и чтение из стека это взаимно обратные операции, они не могут управлятся одним сигналом.

Советую сначала определится с протоколами, потом с обшей структурой системы, интерфейсами и соединениями между модулями, и только потом писать содержимое cool.gif
CaPpuCcino
для поведеньческой модели:
Код
class stack #(type Element_Type = int);
    local Element_Type storage[$];
    local semaphore read_semaphore;
    local semaphore write_semaphore;

    function new(int size_limit = 0);
      read_semaphore = new(0);
      if (size_limit > 0)
        write_semaphore = new(size_limit);
      else if (size_limit < 0)
        $display("Warning: Negative stack size limit was detected as a constructor parameter. Unbounded stack will be constructed");
    endfunction

    function int num();
      return storage.size();
    endfunction

    task put(Element_Type element);
      if (write_semaphore!=null)
        write_semaphore.get(1);
      storage.push_front(element);
      read_semaphore.put(1);
    endtask

    function int try_put(Element_Type element);
      if (write_semaphore==null || write_semaphore.try_get(1) > 0) begin
        storage.push_front(element);
        read_semaphore.put(1);
        return 1;
      end
      return 0;
    endfunction

    task get(output /*ref*/ Element_Type element);
      read_semaphore.get(1);
      element = storage.pop_front();
      if (write_semaphore!=null)
        write_semaphore.put(1);
    endtask

    function int try_get(output /*ref*/ Element_Type element);
      if (read_semaphore.try_get(1) > 0) begin
        element = storage.pop_front();
        if (write_semaphore!=null)
          write_semaphore.put(1);
        return 1;
      end
      return 0;
    endfunction

    task peek(output /*ref*/ Element_Type element);
      read_semaphore.get(1);
      element = storage[0];
      read_semaphore.put(1);
    endtask

    function int try_peek(output /*ref*/ Element_Type element);
      if (read_semaphore.try_get(1) > 0) begin
        element = storage[0];
        read_semaphore.put(1);
        return 1;
      end
      return 0;
    endfunction
endclass
Consigliere
XVR, не то чтоб, совсем до лампочки, но рассматривается только отдельная часть возможностей. Модель упрощена по сравнению с реальной моделью.
Я уже понял что это грубо можно назвать стеком.
Я читал принцип работы шины I2C, что Вы теперь будете к каждому слову сказанному мной придираться?
А надо тогда, когда к нему приходят данные...

Мне бы хотелось определиться с общей структурой и интерфейсом, но я мало что понимаю в этом, поэтому выполняю те указания, которые мне дают 05.gif
XVR
Цитата(Consigliere @ Mar 14 2008, 07:31) *
XVR, не то чтоб, совсем до лампочки, но рассматривается только отдельная часть возможностей. Модель упрощена по сравнению с реальной моделью.
Даже упрощенная модель должна чему то соотвествовать smile.gif

Цитата
Я уже понял что это грубо можно назвать стеком.
Я вот и пытаюсь понять - нужен стек или линия задержки? Это разные вещи.

Цитата
Я читал принцип работы шины I2C, что Вы теперь будете к каждому слову сказанному мной придираться?
Я не придираюсь, я честно пытаюсь понять требования к дезайну, пока не очень получается 07.gif

Цитата
А надо тогда, когда к нему приходят данные...
Допустим данные приходят из 2го байта данных по I2C, тогда куда должны уходить данные, прочитанные из стека?
Цитата
Мне бы хотелось определиться с общей структурой и интерфейсом, но я мало что понимаю в этом, поэтому выполняю те указания, которые мне дают 05.gif
Давай попробуем наоборот - определиться с протоколом, а потом спросить у препа - это то, что он хотел, или нет smile.gif

Итак:
  1. Адрес в обменах по I2C игнорируется, направление обмена определяется битом R/W в первом байте
  2. Размер стека - 8 байт
  3. Обмен со стеком поддерживается только побайтовый (1 байт за один цикл шины I2C)
  4. Запись в стек производится только при наличие в нем свободного места, данные для записи берутся из байта данных (2й байт цикла записи шины I2C)
  5. Запрос записи подтверждается ACK в адресном цикле шины I2C только при наличии свободного места в стеке
  6. Чтение из стека производится только в случае непустого стека в первом байте ответа цикла чтения по I2C
  7. Запрос чтения подтверждается ACK в адресном цикле шины I2C только при наличии данных в стеке
Так сойдет?
yuri_d
Цитата(CaPpuCcino @ Mar 13 2008, 22:43) *
писал находу без верификации. так что могут быть и ошибки
Код
module stack #(
    parameter word_width=8,
    parameter stack_depth=16
)
(
    input bit clk,
    input bit reset_n,
.....


Цитата(CaPpuCcino @ Mar 13 2008, 23:26) *
для поведеньческой модели:
Код
class stack #(type Element_Type = int);
......


Всё здорово, вот только не соответствует условиям задачи sad.gif Зачем использовать bit, class? Ведь это уже не Verilog (ни 1995, ни 2001), а System Verilog.

В результате у преподавателя может появиться подозрение и в результате такое решение выйдет боком автору темы.
CaPpuCcino
Цитата(yuri_d @ Mar 14 2008, 23:52) *
Всё здорово, вот только не соответствует условиям задачи sad.gif Зачем использовать bit, class? Ведь это уже не Verilog (ни 1995, ни 2001), а System Verilog.

В результате у преподавателя может появиться подозрение и в результате такое решение выйдет боком автору темы.

текущий стандарт верилог 1364-2005. bit легко заменяется на reg. ну, и потом, пока чуваки договорятся, что такое стэк, семестр подойдёт к концу
Consigliere
XVR, вобщем как выяснилось, смысл был не совсем тот.
Поправки:
1. Сама шина I2C со стеком не работает. Работает через устройство управления стеком.
2. Необходимо спроектировать это устройство. Взаимодействие с шиной и со стеком. Порядок такой: проверка адреса(берем из шины), совпадает -> проверка команды read/write -> соответственно действие если read то отправляем на стек сигнал rd, для получения информации и сдвига стека, если write, то берем информацию из шины, сдвигаем стек и записываем. Запись и чтение между устройством управления и стеком производятся через 2 буфера(в качестве них выбраны регистры), т.е. один на чтение, второй на запись (не совсем понятна конечно эта идея, зачем оно надо).
Описание стека было удовлетворительно, т.е. зачет. На данный момент поставлена задача разработать устройство управления. Я пока что не думал, идей нет. Планирую завтра заняться этим, соответственно сообщу.
По Вашему предложению: 1. Адрес в обменах по I2C игнорируется, направление обмена определяется битом R/W в первом байте - получается, что нетsmile.gif
2. Размер стека - 8 байт - да.
3. Обмен со стеком поддерживается только побайтовый (1 байт за один цикл шины I2C) - не совсем понятна идея, если смысл в том что за 1 такт только заполняется 1 ячейка стека, то да.
4. Запись в стек производится только при наличие в нем свободного места, данные для записи берутся из байта данных (2й байт цикла записи шины I2C) - изначально он пуст. Думаю просто переполнение не будет допускаться.
5. Запрос записи подтверждается ACK в адресном цикле шины I2C только при наличии свободного места в стеке - не до конца понимаю этот процессsad.gif
6. Чтение из стека производится только в случае непустого стека в первом байте ответа цикла чтения по I2C - естественно что пустую информацию брать не целесообразно.
7. Запрос чтения подтверждается ACK в адресном цикле шины I2C только при наличии данных в стеке - аналогично не понимаю, как при записиsad.gif
XVR
Цитата(Consigliere @ Mar 15 2008, 17:22) *
XVR, вобщем как выяснилось, смысл был не совсем тот.
Поправки:
1. Сама шина I2C со стеком не работает. Работает через устройство управления стеком.
Это устройство включает непосредственно стек, или сам стек это еще одно устройство?


Цитата
2. Необходимо спроектировать это устройство. Взаимодействие с шиной и со стеком. Порядок такой: проверка адреса(берем из шины), совпадает -> проверка команды read/write -> соответственно действие если read то отправляем на стек сигнал rd, для получения информации и сдвига стека, если write, то берем информацию из шины, сдвигаем стек и записываем.


Устройство (равно как и все остальные) рекомендуется делать синхронным, т.к. почти все современные схемы синхронные.

Цитата
Запись и чтение между устройством управления и стеком производятся через 2 буфера(в качестве них выбраны регистры), т.е. один на чтение, второй на запись (не совсем понятна конечно эта идея, зачем оно надо).
С этим как раз все просто - гораздо проще сделать 2 раздельные однонаправленные шины, чем одну двунаправленную, к которой понадобятся дополнительные сигналы для управления направлением передачи данных. Кроме того, во многих FPGA просто нет внутренних шин с 3мя состояниями.



Цитата
По Вашему предложению: 1. Адрес в обменах по I2C игнорируется, направление обмена определяется битом R/W в первом байте - получается, что нет smile.gif
Это не существенно, добавится один компаратор на адрес.

Цитата
3. Обмен со стеком поддерживается только побайтовый (1 байт за один цикл шины I2C) - не совсем понятна идея, если смысл в том что за 1 такт только заполняется 1 ячейка стека, то да.
В смысле не поддерживается обмен пакетами данных по I2C - только побайтово (1 байт за один полный цикл обмена)

Цитата
4. Запись в стек производится только при наличие в нем свободного места, данные для записи берутся из байта данных (2й байт цикла записи шины I2C) - изначально он пуст. Думаю просто переполнение не будет допускаться.
Кем не будет допускаться? И что делать контроллеру стека, если оно все же произошло?

Цитата
5. Запрос записи подтверждается ACK в адресном цикле шины I2C только при наличии свободного места в стеке - не до конца понимаю этот процесс sad.gif
Обмен по шине I2C подтверждается адресуемым устройством в цикле передачи адреса. Имеется в виду, что данное устройство не будет подтверждать обмен (т.е. мастер I2C просто не увидит устройства на шине), если оно (устройство) не может обслужить запрос на чтение или запись.

Цитата
6. Чтение из стека производится только в случае непустого стека в первом байте ответа цикла чтения по I2C - естественно что пустую информацию брать не целесообразно.
Имеется в виду, что при попытке чтения из пустого стека устройство вообще ничего делать не будет, альтернативой может являться чтение нуля (например)



В общем вырисовываются такие сигналы в интерфейсе:
  1. input clk - Системный клок
  2. input enable - Обращение к контролеру стека
  3. input write - Цикл записи (1-запись, 0-чтение)
  4. output full - Признак заполненности стека
  5. output empty - Признак пустоты стека
  6. input [7:0] in_data - Шина записи
  7. output [7:0] out_data - Шина чтения
Consigliere
Цитата(XVR @ Mar 15 2008, 23:11) *
Это устройство включает непосредственно стек, или сам стек это еще одно устройство?
полагаю что это еще одно устройство
Цитата
Устройство (равно как и все остальные) рекомендуется делать синхронным, т.к. почти все современные схемы синхронные.
полностью согласен
Цитата
С этим как раз все просто - гораздо проще сделать 2 раздельные однонаправленные шины, чем одну двунаправленную, к которой понадобятся дополнительные сигналы для управления направлением передачи данных. Кроме того, во многих FPGA просто нет внутренних шин с 3мя состояниями.
так и задумывалось, дело в том что сигналы rd, wr, передаются не по шинам передачи данных, а по отдельными служебными сигналами, не знаю есть ли такое понятие, но смысл в этом.
Цитата
В смысле не поддерживается обмен пакетами данных по I2C - только побайтово (1 байт за один полный цикл обмена)

т.е. если у нас стек может хранить слова размером 8 байт, то необходимо будет 8 циклов? Расскажите почему Вы предпочли такой вариант, а не все сразу?
Цитата
Кем не будет допускаться? И что делать контроллеру стека, если оно все же произошло?

при моделировании не будет допускаться, если вдруг быть наверно не можетsmile.gif
Цитата
Обмен по шине I2C подтверждается адресуемым устройством в цикле передачи адреса. Имеется в виду, что данное устройство не будет подтверждать обмен (т.е. мастер I2C просто не увидит устройства на шине), если оно (устройство) не может обслужить запрос на чтение или запись.

И тогда у нас данный цикл не завершится никогда что ли? Непосредственно в шине I2C

Цитата
Имеется в виду, что при попытке чтения из пустого стека устройство вообще ничего делать не будет, альтернативой может являться чтение нуля (например)

предпочтительнее лучше чтение нуля


Цитата
В общем вырисовываются такие сигналы в интерфейсе:
  1. input clk - Системный клок
  2. input enable - Обращение к контролеру стека
  3. input write - Цикл записи (1-запись, 0-чтение)
  4. output full - Признак заполненности стека
  5. output empty - Признак пустоты стека
  6. input [7:0] in_data - Шина записи
  7. output [7:0] out_data - Шина чтения

Если на участке шина - контроллер, то согласен.


по поводу контроллера есть такая идея:
output [7:0] to_bus - данные передающиеся шине из стека
output [7:0] to_stack - данные из шины на запись в стек
output rd - сигнал управления стеком(на считывание)
output wr - сигнал управления (на запись)
input [7:0] from_bus - данные из шины
input [7:0] from_stack - данные из стека

впервую очередь проверяем from_bus, сверяем адрес, если подходит то начинаем считывать команду wr/rd и отправляем сигнал wr/rd, для подготовки стека к записи/чтению, затем непосредственно передача данных.
Так нормально, или не очень?smile.gif
XVR
Цитата(Consigliere @ Mar 16 2008, 11:35) *
полагаю что это еще одно устройство
Т.е. предполагается 3 устройства (I2C контролер, контролер стека, стек)? В таком случае одно из этих устройств лишнее - просто набор проводов
Цитата
полностью согласен
так и задумывалось, дело в том что сигналы rd, wr, передаются не по шинам передачи данных, а по отдельными служебными сигналами, не знаю есть ли такое понятие, но смысл в этом.
Не совсем понимаю, что такое 'шина передачи данных', но если под этим понимается 3х стабильная двунаправленная шина, то вне зависимости от того, как передаются сигналы rd & wr в данном дезайне такая шина будет лишним усложнением.


Цитата
т.е. если у нас стек может хранить слова размером 8 байт, то необходимо будет 8 циклов?
Да

Цитата
Расскажите почему Вы предпочли такой вариант, а не все сразу?
Это сложнее реализовать


Цитата
И тогда у нас данный цикл не завершится никогда что ли? Непосредственно в шине I2C
Завершится, но master, начавший цикл, получит ошибку обмена.

Цитата
предпочтительнее лучше чтение нуля
Ок, это даже проще


Цитата
по поводу контроллера есть такая идея:
output [7:0] to_bus - данные передающиеся шине из стека
output [7:0] to_stack - данные из шины на запись в стек
output rd - сигнал управления стеком(на считывание)
output wr - сигнал управления (на запись)
input [7:0] from_bus - данные из шины
input [7:0] from_stack - данные из стека
Похоже на набор проводов smile.gif Или это имеется в виду контролер I2C?


Цитата
впервую очередь проверяем from_bus, сверяем адрес, если подходит то начинаем считывать команду wr/rd и отправляем сигнал wr/rd, для подготовки стека к записи/чтению, затем непосредственно передача данных.
Слишком усложнено. Все сравнения адресов и машинерия с I2C шиной должна остаться внутри I2C контролера. Наружу нужно выдать уже голые команды чтения и записи в стек. Интерфейс будет один в один совпадать с интерфейсом стека (за исключением направления сигналов - оно будет противоположным)

Если сделать отдельно интерфейс к I2C и потом его пристыковывать к стеку, через еще один модуль, то придется реализовавать более-менее полноценную имплементацию протокола I2C со всеми ACK/NAK, подсчетом принятых и переданных байтов, т.к. цепи генерации ACK будут находится в другом модуле и придется всю эту логику протаскивать через интерфейсы 2х модулей. При этом реально это все будет не нужно, т.к. пользователь у шины I2C в вашем случае один, и набор требований у него фиксированный, т.ч. можно сделать под него урезанную имплементацию I2C



PS. Реализация стека здесь тривиальная, по сравнению с реализацией I2C контролера.
Consigliere
Цитата(XVR @ Mar 17 2008, 11:46) *
Т.е. предполагается 3 устройства (I2C контролер, контролер стека, стек)? В таком случае одно из этих устройств лишнее - просто набор проводов

3 устройства:шина I2C, контроллер стека, стекsmile.gif
Цитата
Не совсем понимаю, что такое 'шина передачи данных', но если под этим понимается 3х стабильная двунаправленная шина, то вне зависимости от того, как передаются сигналы rd & wr в данном дезайне такая шина будет лишним усложнением.

я тоже не понимаю что такое 3х стабильныя двунаправленная шинаsmile.gif хорошо попробую выразиться иначе. Эти сигналы wr/rd идут по 2м отдельным каналам(не каналы передачи данных которые по 8байт передают с шины в стек, а отдельные)

Цитата
Завершится, но master, начавший цикл, получит ошибку обмена.

ок
Цитата
Похоже на набор проводов smile.gif Или это имеется в виду контролер I2C?

скорее подразумевался как контролеер между стеком и шиной, не знаю как правильнее будет его назвать
Цитата
Слишком усложнено. Все сравнения адресов и машинерия с I2C шиной должна остаться внутри I2C контролера. Наружу нужно выдать уже голые команды чтения и записи в стек. Интерфейс будет один в один совпадать с интерфейсом стека (за исключением направления сигналов - оно будет противоположным)

хорошо, я просто еще не думал над реализацией шины, с этим у меня наиболее тяжко. Если при ее реализации возможно будет сделать все эти проверки, то согласен с Вашим вариантом.
Цитата
Если сделать отдельно интерфейс к I2C и потом его пристыковывать к стеку, через еще один модуль, то придется реализовавать более-менее полноценную имплементацию протокола I2C со всеми ACK/NAK, подсчетом принятых и переданных байтов, т.к. цепи генерации ACK будут находится в другом модуле и придется всю эту логику протаскивать через интерфейсы 2х модулей. При этом реально это все будет не нужно, т.к. пользователь у шины I2C в вашем случае один, и набор требований у него фиксированный, т.ч. можно сделать под него урезанную имплементацию I2C

если под пользователем подразумевается стек, то он не одинsmile.gif чтоб показать полноценную работу I2C с адресацией и прочим, будет несколько стеков.


Цитата
PS. Реализация стека здесь тривиальная, по сравнению с реализацией I2C контролера.

а он нам нужен? wacko.gif
XVR
Цитата(Consigliere @ Mar 17 2008, 13:25) *
3 устройства:шина I2C, контроллер стека, стек smile.gif
Предлагаю объединить контролер стека с самим стеком, ибо я не предсталяю их отдельной реализации. Они и вместе вряд ли займут более 10 строк кода
Цитата
я тоже не понимаю что такое 3х стабильныя двунаправленная шина smile.gif хорошо попробую выразиться иначе. Эти сигналы wr/rd идут по 2м отдельным каналам(не каналы передачи данных которые по 8байт передают с шины в стек, а отдельные)
Хм. До сих пор я считал, что это очевидно. Кроме того, я слабо представляю, как их можно сделать иначе 05.gif
Цитата
если под пользователем подразумевается стек, то он не один smile.gif чтоб показать полноценную работу I2C с адресацией и прочим, будет несколько стеков.
Этого в оригинальном задании не было. Других добавлений, кроме нескольких стеков, не предвидится? wacko.gif

Цитата
а он (контролер I2C) нам нужен? wacko.gif
А как вы собираетесь общаться с I2C шиной без контролера?
Consigliere
Цитата(XVR @ Mar 17 2008, 20:05) *
Предлагаю объединить контролер стека с самим стеком, ибо я не предсталяю их отдельной реализации. Они и вместе вряд ли займут более 10 строк кода

хорошо, попробовать можно.
Цитата
Хм. До сих пор я считал, что это очевидно. Кроме того, я слабо представляю, как их можно сделать иначе 05.gif

ну как иначе, это же не будет у нас в реальной плисине или другом физическом устройстве, это лишь код, так что предлагаю снять этот вопрос. можно описать хоть шиной, хоть двумя отдельными каналами мне кажется
Цитата
Этого в оригинальном задании не было. Других добавлений, кроме нескольких стеков, не предвидится? wacko.gif

я тоже не знал этого до пятницы, в пятницу виделся с преподавателем, забыл добавить в том посте, сорри. Вроде не предвидится
Цитата
А как вы собираетесь общаться с I2C шиной без контролера?

с шиной без контроллера, хм.. ну просто задаешь в тест-бенче воздействия и все, так не прокатит?


дело в том что из за малых знаний и опыта, у меня нет возможности полноценно дискутировать, а жальsad.gif
XVR
Цитата(Consigliere @ Mar 17 2008, 20:30) *
ну как иначе, это же не будет у нас в реальной плисине или другом физическом устройстве, это лишь код
Код предполагается синтезируемый или это чисто поведенческая модель? Если первое, то надо считать, что это может быть реальной плисиной smile.gif
Цитата
с шиной без контроллера, хм.. ну просто задаешь в тест-бенче воздействия и все, так не прокатит?
Я имел в виду контролер между физическими выводами I2C (SDC,SDA) и контролером стека. Или шину I2C тоже предполагается сделать на поведенческом уровне (т.е. без выводов вообще smile.gif )?
Цитата
дело в том что из за малых знаний и опыта, у меня нет возможности полноценно дискутировать, а жаль sad.gif
Опыт - дело наживное
Consigliere
все только на поведенческом уровнеsmile.gif просто описаниеsmile.gif и временные диаграммыsmile.gif
XVR
Цитата(Consigliere @ Mar 18 2008, 15:44) *
все только на поведенческом уровне smile.gif просто описание smile.gif и временные диаграммы smile.gif
Как предполагается задавать шину I2C - как ноги SDC/SDA или как абстрактый модуль с каким угодно интерфейсом не подключенный вообще ни к чему?
Consigliere
на счет этого не знаю, но предполагаю что абстрактный модуль, ну максимум на бумагеsmile.gif
XVR
Цитата(Consigliere @ Mar 18 2008, 17:26) *
на счет этого не знаю, но предполагаю что абстрактный модуль, ну максимум на бумаге smile.gif
Ну тогда вообще проблем никаких - подключить модуль стека прямо к проводам и формировать на них необходимые сигналы.
Consigliere
я пока что заболел, лежу с температурой, как только поправлюсь сразу сообщу:-(
Consigliere
вот и выздоровилsmile.gif

так как на счет такой реализации контроллера
output [7:0] to_bus - данные передающиеся шине из стека
output [7:0] to_stack - данные из шины на запись в стек
output rd - сигнал управления стеком(на считывание)
output wr - сигнал управления (на запись)
input [7:0] from_bus - данные из шины
input [7:0] from_stack - данные из стека

впервую очередь проверяем from_bus, сверяем адрес, если подходит то начинаем считывать команду wr/rd и отправляем сигнал wr/rd, для подготовки стека к записи/чтению, затем непосредственно передача данных.
И еще вопросик, у нас адрес будет идти по отдельному проводу или по шине from_bus?
XVR
Цитата(Consigliere @ Mar 27 2008, 11:24) *
вот и выздоровил smile.gif

так как на счет такой реализации контроллера
output [7:0] to_bus - данные передающиеся шине из стека
output [7:0] to_stack - данные из шины на запись в стек
output rd - сигнал управления стеком(на считывание)
output wr - сигнал управления (на запись)
input [7:0] from_bus - данные из шины
input [7:0] from_stack - данные из стека


4 шины для обмена со стеком слишком много, достаточно 2х - данные для записи и прочтенные данные

Цитата
впервую очередь проверяем from_bus, сверяем адрес,
Адрес лучше проверить снаружи, в сам контролер завести только cs

Цитата
если подходит то начинаем считывать команду wr/rd и отправляем сигнал wr/rd, для подготовки стека к записи/чтению, затем непосредственно передача данных.
Какие подготовки, какие передачи данных wacko.gif Такое впечатление, что у тебя в стеке конвеер стадий на 10, не меньше smile.gif Чтение и запись производятся НЕПОСРЕДСТВЕННО при выставлении сигналов rd/wr. Запись данных производится в этом же клоке (данные должны уже стоять на шине), чтение можно производить уже на следующем клоке (на данном клоке прочтенные данные фиксируются на выходной шине)

Цитата
И еще вопросик, у нас адрес будет идти по отдельному проводу или по шине from_bus?
Адреса на будет, будет один сигнал cs
Consigliere
там не 4 шины для обмена со стеком, 2 на стек и 2 на шину, все это проходит через контроллер, может поэтому возникло ощущение что на стек идет 4 шиныsmile.gif
cs - это что, clock?smile.gif
Ладно в течение дня попробую написать код для контроллера, покажу что получилосьsmile.gif
XVR
Цитата(Consigliere @ Mar 28 2008, 08:28) *
там не 4 шины для обмена со стеком, 2 на стек и 2 на шину, все это проходит через контроллер, может поэтому возникло ощущение что на стек идет 4 шины smile.gif
Сам стек должен быть внутри, иначе этот контролер вырождается в набор проводов
Цитата
cs - это что, clock? smile.gif
Это ChipSelect, выбор контролера, clock должен быть заведен отдельно
Consigliere
я не понимаю принцип действия контроллераsad.gif какую роль он должен играть и какие выполнять функции, или он просто открывает доступ к стеку? на верилоге это тупое присвоение данных с шины на стек что ли? и еще вопрос, как реализовать подачу клока контроллером стеку? или у нас синхроимпульс один на все: шину, контроллер и стек?
XVR
Цитата(Consigliere @ Mar 31 2008, 11:12) *
я не понимаю принцип действия контроллера sad.gif
Если его (контролер) расматривать отдельно от собственно стека - то я то же не понимаю smile.gif

Цитата
какую роль он должен играть и какие выполнять функции, или он просто открывает доступ к стеку? на верилоге это тупое присвоение данных с шины на стек что ли?
Именно. Я про это и говорил - весь модуль контроллера (без собственно стека) будет просто набором проводов.

Цитата
и еще вопрос, как реализовать подачу клока контроллером стеку? или у нас синхроимпульс один на все: шину, контроллер и стек?
Один на всех, всем подавать через пин в интерфейсе
Consigliere
а как его делать, вместе со стеком? и опять же он получается будет всего лишь разрешать передачу данных? Или в принцпе можно его сделать и как набор проводов, отдально от стека, да?
XVR
Цитата(Consigliere @ Mar 31 2008, 21:31) *
а как его делать, вместе со стеком?
Он собственно и будет стеком

Цитата
и опять же он получается будет всего лишь разрешать передачу данных?
Если вместе со стеком, то не только набор проводов, там еще будет память, на которой собственно и расположен стек и реверсивный счетчик - указатель верхушки стека (ну еще немного логики, что бы это все связать в кучку)

Цитата
Или в принцпе можно его сделать и как набор проводов, отдально от стека, да?
Можно, но смысла в таком модуле нет никакого.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.