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

 
 
> Описание стека на Verilog, подскажите что не так
Consigliere
сообщение Mar 13 2008, 07:27
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-03-08
Пользователь №: 35 869



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

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

если не туда разместил тему перенесите пожалуйста в нужный раздел форума
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 14)
yuri_d
сообщение Mar 13 2008, 08:42
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 28-01-05
Из: МО, Мытищи
Пользователь №: 2 274



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

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

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

4) wire xx [7:0] описывает массив из восьми однобитовых элементов. Для описания 8-битной шины нужно писать wire [7:0] yy
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 13 2008, 08:47
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(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
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 13 2008, 09:00
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



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


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


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Consigliere
сообщение Mar 13 2008, 10:07
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-03-08
Пользователь №: 35 869



спасибо, всем за помощьsmile.gif
а можно еще один вопрос
Цитата
assign out_stack = st7;

у нас когда в стек записываются данные, он автоматически считывает?
У меня вообще сомнение верно ли я написал что у него вход и выход, у меня данные в него будут подаваться с шины I2C. Или нужно использовать вход как выход, одновременно же все равно не смогут данные записываться и считываться из стека.
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 13 2008, 17:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Consigliere @ Mar 13 2008, 13:07) *
спасибо, всем за помощь smile.gif
а можно еще один вопрос


assign out_stack = st7;


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

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


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


Ты уж определись стек у тебя или что, и что и как должно в него записываться и читаться. Что касается I2C то вообще не понятно что из нее и куда должно подаваться и читаться.
Go to the top of the page
 
+Quote Post
Consigliere
сообщение Mar 13 2008, 18:36
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-03-08
Пользователь №: 35 869



Ну смотри, это не реальное задание, а так, просто выдуманное для практики, мне преподаватель посоветовал стек описать таким образом как я привел выше.
А суть в том, что есть у нас шина, она передает данные, когда надо записывает в этот "стек", когда надо считывает из данного "стека" и все. Запись и чтение "стека" управляется отдельным устройством, с которого и приходит сигнал wr. По крайней мере мое понимание такое.
Go to the top of the page
 
+Quote Post
CaPpuCcino
сообщение Mar 13 2008, 18:58
Сообщение #8


тоже уже Гуру
******

Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973



http://en.wikipedia.org/wiki/Stack_(data_structure)


--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
Go to the top of the page
 
+Quote Post
Consigliere
сообщение Mar 13 2008, 19:13
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-03-08
Пользователь №: 35 869



Цитата(CaPpuCcino @ Mar 13 2008, 21:58) *

спасибо, но уже читал ранее.)
Go to the top of the page
 
+Quote Post
CaPpuCcino
сообщение Mar 13 2008, 19:43
Сообщение #10


тоже уже Гуру
******

Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973



писал находу без верификации. так что могут быть и ошибки
Код
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


--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 13 2008, 20:12
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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


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

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

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


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

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

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

Советую сначала определится с протоколами, потом с обшей структурой системы, интерфейсами и соединениями между модулями, и только потом писать содержимое cool.gif
Go to the top of the page
 
+Quote Post
CaPpuCcino
сообщение Mar 13 2008, 20:26
Сообщение #12


тоже уже Гуру
******

Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973



для поведеньческой модели:
Код
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


--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
Go to the top of the page
 
+Quote Post
Consigliere
сообщение Mar 14 2008, 04:31
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-03-08
Пользователь №: 35 869



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

Мне бы хотелось определиться с общей структурой и интерфейсом, но я мало что понимаю в этом, поэтому выполняю те указания, которые мне дают 05.gif
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 14 2008, 08:50
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(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 только при наличии данных в стеке
Так сойдет?
Go to the top of the page
 
+Quote Post
yuri_d
сообщение Mar 14 2008, 20:52
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 28-01-05
Из: МО, Мытищи
Пользователь №: 2 274



Цитата(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.

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

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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 15:27
Рейтинг@Mail.ru


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