Consigliere 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба Идея в том, чтоб описать 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 не могу понять что я делаю не так... Заранее спасибо за помощь.) если не туда разместил тему перенесите пожалуйста в нужный раздел форума Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yuri_d 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба 1) при работе со стеком подразумевается, что есть сигналы для записи и для чтения. И те и другие должны присутствовать в описании интерфейса модуля. 2) в always блоке нельзя присваивать значения сигналам типа wire. Используйте регистры. 3) для группировки операторов следует использовать begin end. У Вас if(wr) применяется только для первого оператора. 4) wire xx [7:0] описывает массив из восьми однобитовых элементов. Для описания 8-битной шины нужно писать wire [7:0] yy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба Идея в том, чтоб описать 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба Идея в том, чтоб описать 8-битный стек, запись и чтение производится с помощью управляющего не могу понять что я делаю не так... У меня на сайте есть статья "микропроцессор своими руками" и к ней есть простой проект. Правда там AHDL, но все же лучше, чем ничего... Стек можно сделать на триггерах, можно на памяти... Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Consigliere 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба спасибо, всем за помощь:) а можно еще один вопрос assign out_stack = st7; у нас когда в стек записываются данные, он автоматически считывает? У меня вообще сомнение верно ли я написал что у него вход и выход, у меня данные в него будут подаваться с шины I2C. Или нужно использовать вход как выход, одновременно же все равно не смогут данные записываться и считываться из стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба спасибо, всем за помощь :) а можно еще один вопрос assign out_stack = st7; у нас когда в стек записываются данные, он автоматически считывает? Он всегда возвращает значение последнего элемента стека. На самом деле у тебя описан не стек а линия задержки на 8 тактов wr. У меня вообще сомнение верно ли я написал что у него вход и выход, у меня данные в него будут подаваться с шины I2C. Или нужно использовать вход как выход, одновременно же все равно не смогут данные записываться и считываться из стека. Ты уж определись стек у тебя или что, и что и как должно в него записываться и читаться. Что касается I2C то вообще не понятно что из нее и куда должно подаваться и читаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Consigliere 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба Ну смотри, это не реальное задание, а так, просто выдуманное для практики, мне преподаватель посоветовал стек описать таким образом как я привел выше. А суть в том, что есть у нас шина, она передает данные, когда надо записывает в этот "стек", когда надо считывает из данного "стека" и все. Запись и чтение "стека" управляется отдельным устройством, с которого и приходит сигнал wr. По крайней мере мое понимание такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба http://en.wikipedia.org/wiki/Stack_(data_structure) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Consigliere 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба http://en.wikipedia.org/wiki/Stack_(data_structure) спасибо, но уже читал ранее.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба писал находу без верификации. так что могут быть и ошибки 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 12 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба Ну смотри, это не реальное задание, а так, просто выдуманное для практики, Т.е. что оно реально делает до лампочки ? мне преподаватель посоветовал стек описать таким образом как я привел выше.То, что описано выше - вообще не стек а недоделанное FIFO. А суть в том, что есть у нас шина, она передает данные, По I2C передаются не только данные, там еще передаются адреса и комманды. когда надо записывает в этот "стек", когда надо считывает из данного "стека" и все.'Когда надо' - это когда? Запись и чтение "стека" управляется отдельным устройством, с которого и приходит сигнал wr. По крайней мере мое понимание такое.Запись и чтение из стека это взаимно обратные операции, они не могут управлятся одним сигналом. Советую сначала определится с протоколами, потом с обшей структурой системы, интерфейсами и соединениями между модулями, и только потом писать содержимое B) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба для поведеньческой модели: 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 0 14 марта, 2008 Опубликовано 14 марта, 2008 · Жалоба XVR, не то чтоб, совсем до лампочки, но рассматривается только отдельная часть возможностей. Модель упрощена по сравнению с реальной моделью. Я уже понял что это грубо можно назвать стеком. Я читал принцип работы шины I2C, что Вы теперь будете к каждому слову сказанному мной придираться? А надо тогда, когда к нему приходят данные... Мне бы хотелось определиться с общей структурой и интерфейсом, но я мало что понимаю в этом, поэтому выполняю те указания, которые мне дают :05: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 марта, 2008 Опубликовано 14 марта, 2008 · Жалоба XVR, не то чтоб, совсем до лампочки, но рассматривается только отдельная часть возможностей. Модель упрощена по сравнению с реальной моделью.Даже упрощенная модель должна чему то соотвествовать :) Я уже понял что это грубо можно назвать стеком.Я вот и пытаюсь понять - нужен стек или линия задержки? Это разные вещи. Я читал принцип работы шины I2C, что Вы теперь будете к каждому слову сказанному мной придираться?Я не придираюсь, я честно пытаюсь понять требования к дезайну, пока не очень получается :07: А надо тогда, когда к нему приходят данные...Допустим данные приходят из 2го байта данных по I2C, тогда куда должны уходить данные, прочитанные из стека? Мне бы хотелось определиться с общей структурой и интерфейсом, но я мало что понимаю в этом, поэтому выполняю те указания, которые мне дают :05:Давай попробуем наоборот - определиться с протоколом, а потом спросить у препа - это то, что он хотел, или нет :) Итак: Адрес в обменах по I2C игнорируется, направление обмена определяется битом R/W в первом байте Размер стека - 8 байт Обмен со стеком поддерживается только побайтовый (1 байт за один цикл шины I2C) Запись в стек производится только при наличие в нем свободного места, данные для записи берутся из байта данных (2й байт цикла записи шины I2C) Запрос записи подтверждается ACK в адресном цикле шины I2C только при наличии свободного места в стеке Чтение из стека производится только в случае непустого стека в первом байте ответа цикла чтения по I2C Запрос чтения подтверждается ACK в адресном цикле шины I2C только при наличии данных в стеке Так сойдет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yuri_d 0 14 марта, 2008 Опубликовано 14 марта, 2008 · Жалоба писал находу без верификации. так что могут быть и ошибки 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. В результате у преподавателя может появиться подозрение и в результате такое решение выйдет боком автору темы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться