Перейти к содержанию
    

Описание стека на Verilog

Идея в том, чтоб описать 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.

# done

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

Заранее спасибо за помощь.)

 

если не туда разместил тему перенесите пожалуйста в нужный раздел форума

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

4) wire xx [7:0] описывает массив из восьми однобитовых элементов. Для описания 8-битной шины нужно писать wire [7:0] yy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Идея в том, чтоб описать 8-битный стек, запись и чтение производится с помощью управляющего сигнала "wr"

 

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

 

 

 

Мда, все не так :(

 

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Идея в том, чтоб описать 8-битный стек, запись и чтение производится с помощью управляющего не могу понять что я делаю не так...

 

У меня на сайте есть статья "микропроцессор своими руками" и к ней есть простой проект. Правда там AHDL, но все же лучше, чем ничего...

Стек можно сделать на триггерах, можно на памяти...

Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо, всем за помощь:)

а можно еще один вопрос

assign out_stack = st7;

у нас когда в стек записываются данные, он автоматически считывает?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо, всем за помощь :)

а можно еще один вопрос

 

 

assign out_stack = st7;

 

 

у нас когда в стек записываются данные, он автоматически считывает?

Он всегда возвращает значение последнего элемента стека.

 

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

 

 

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

 

Ты уж определись стек у тебя или что, и что и как должно в него записываться и читаться. Что касается I2C то вообще не понятно что из нее и куда должно подаваться и читаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну смотри, это не реальное задание, а так, просто выдуманное для практики, мне преподаватель посоветовал стек описать таким образом как я привел выше.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

писал находу без верификации. так что могут быть и ошибки

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну смотри, это не реальное задание, а так, просто выдуманное для практики,

 

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

 

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

 

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

 

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

 

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

 

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

 

Советую сначала определится с протоколами, потом с обшей структурой системы, интерфейсами и соединениями между модулями, и только потом писать содержимое B)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для поведеньческой модели:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

XVR, не то чтоб, совсем до лампочки, но рассматривается только отдельная часть возможностей. Модель упрощена по сравнению с реальной моделью.

Я уже понял что это грубо можно назвать стеком.

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

А надо тогда, когда к нему приходят данные...

 

Мне бы хотелось определиться с общей структурой и интерфейсом, но я мало что понимаю в этом, поэтому выполняю те указания, которые мне дают :05:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

XVR, не то чтоб, совсем до лампочки, но рассматривается только отдельная часть возможностей. Модель упрощена по сравнению с реальной моделью.
Даже упрощенная модель должна чему то соотвествовать :)

 

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

 

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

 

А надо тогда, когда к нему приходят данные...
Допустим данные приходят из 2го байта данных по I2C, тогда куда должны уходить данные, прочитанные из стека?

Мне бы хотелось определиться с общей структурой и интерфейсом, но я мало что понимаю в этом, поэтому выполняю те указания, которые мне дают :05:
Давай попробуем наоборот - определиться с протоколом, а потом спросить у препа - это то, что он хотел, или нет :)

 

Итак:

  1. Адрес в обменах по I2C игнорируется, направление обмена определяется битом R/W в первом байте
  2. Размер стека - 8 байт
  3. Обмен со стеком поддерживается только побайтовый (1 байт за один цикл шины I2C)
  4. Запись в стек производится только при наличие в нем свободного места, данные для записи берутся из байта данных (2й байт цикла записи шины I2C)
  5. Запрос записи подтверждается ACK в адресном цикле шины I2C только при наличии свободного места в стеке
  6. Чтение из стека производится только в случае непустого стека в первом байте ответа цикла чтения по I2C
  7. Запрос чтения подтверждается ACK в адресном цикле шины I2C только при наличии данных в стеке
Так сойдет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

писал находу без верификации. так что могут быть и ошибки

module stack #(
    parameter word_width=8,
    parameter stack_depth=16
)
(
    input bit clk,
    input bit reset_n,
.....

 

для поведеньческой модели:

class stack #(type Element_Type = int);
......

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...