Egor-ka 0 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба Помогите,пожалуйста разобраться с ошибками? Я хочу по фронту одного сигнала считывать данные, а затем сдвигать их и преобразовывать первый разряд регистра в манчестер. Приведенные в рекомендованных выше ссылках примеры для меня сложноватые. решил попробовать просто сделать основу ,как я понял. Скорее всего это связано с непониманием процесса и языка в целом - пожалуйста,помогите разобраться. module temp (inByte,ena,clk2x,Manch); input [7:0] inByte; input clk2x,ena; output Manch; reg [7:0] inBytetmp; reg [1:0] clkdiv; wire outManch,clk1x; always @(posedge clk2x) clkdiv<=clkdiv +1; 16 always @(negedge ena) begin inBytetmp<=inByte; end 22 always @(posedge clk1x) begin inBytetmp<=inBytetmp >>1; end assign Manch = clk2x^inBytetmp[0]; endmodule Error: Can't resolve multiple constant drivers for net "inBytetmp[7]" at temp.v(16) Error: Constant driver at temp.v(22) Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба Помогите,пожалуйста разобраться с ошибками? Я хочу по фронту одного сигнала считывать данные, а затем сдвигать их и преобразовывать первый разряд регистра в манчестер. Приведенные в рекомендованных выше ссылках примеры для меня сложноватые. решил попробовать просто сделать основу ,как я понял. Скорее всего это связано с непониманием процесса и языка в целом - пожалуйста,помогите разобраться. module temp (inByte,ena,clk2x,Manch); input [7:0] inByte; input clk2x,ena; output Manch; reg [7:0] inBytetmp; reg [1:0] clkdiv; wire outManch,clk1x; always @(posedge clk2x) clkdiv<=clkdiv +1; 16 always @(negedge ena) begin inBytetmp<=inByte; end 22 always @(posedge clk1x) begin inBytetmp<=inBytetmp >>1; end assign Manch = clk2x^inBytetmp[0]; endmodule Error: Can't resolve multiple constant drivers for net "inBytetmp[7]" at temp.v(16) Error: Constant driver at temp.v(22) Спасибо Ошибка (и не единственная :05: ) в том, что все присваивания любому регистру нужно делать в пределах одного always блока (единственное исключение - шины с 3мя состояниями, но в такие подробности лучше не вдаваться :) ) Второе но - у вас асинхронная реализация, при имплементации этого в FPGA вы сможете подробно и со всех сторон изучить все грабли, которые разложены на пути приверженцев асинхронного подхода Рекомендую сделать синхронный дезайн. Что касается остального, то прежде чем писать Верилоговский модуль необходимо определится с интерфейсом: 1) Как будет осуществлятся загрузка данных и их сдвиг (один сигнал или несколько?) 2) Что должно быть на выходе Manch когда сдвиг запрещен? 3) Нужна ли синхронизация фазы выходного манчестера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor-ka 0 30 января, 2008 Опубликовано 30 января, 2008 · Жалоба Здравствуйте. Спасибо огромное за предыдущие ответы. :a14: У меня появился еще вопрос))) Можно ли в Verilog сдвигать слова в переменной типа memory? как я понял, нельзя работать с кусками памяти или с несолькими словами сразу, а можно только со словами в целом, иначе компилятор ругается (пробовал такое присваивание mem[5:0] = mem[6:1]; mem[6] = Byte;) Error: Verilog HDL error at temp.v(15): part-select of memory "mem" is not allowed Когда попробовал следующую конструкцию reg [7:0] Byte; reg [7:0] mem [6:0]; always @(posedge clk) begin mem[0] = mem[1]; mem[1] = mem[2]; mem[2] = mem[3]; mem[3] = mem[4]; mem[4] = mem[5]; mem[5] = mem[6]; mem[6] = Byte; end получилось, все слова в mem имели одинаковое значение Byte, а сдвига по clk так и не произошло. также пробовал использовать неблокирующее присваивание <= - результат был тот же. (может, просто не правильно использовал :smile3046: ) В общем, подскажите, пожалуйста, как правильно работать с переменными типа memory в Verilog? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 30 января, 2008 Опубликовано 30 января, 2008 · Жалоба Здравствуйте. Спасибо огромное за предыдущие ответы. :a14: У меня появился еще вопрос))) Можно ли в Verilog сдвигать слова в переменной типа memory? как я понял, нельзя работать с кусками памяти или с несолькими словами сразу, а можно только со словами в целом, иначе компилятор ругается (пробовал такое присваивание mem[5:0] = mem[6:1]; mem[6] = Byte;) Error: Verilog HDL error at temp.v(15): part-select of memory "mem" is not allowed Когда попробовал следующую конструкцию reg [7:0] Byte; reg [7:0] mem [6:0]; always @(posedge clk) begin mem[0] = mem[1]; mem[1] = mem[2]; mem[2] = mem[3]; mem[3] = mem[4]; mem[4] = mem[5]; mem[5] = mem[6]; mem[6] = Byte; end получилось, все слова в mem имели одинаковое значение Byte, а сдвига по clk так и не произошло. также пробовал использовать неблокирующее присваивание <= - результат был тот же. (может, просто не правильно использовал :smile3046: ) В общем, подскажите, пожалуйста, как правильно работать с переменными типа memory в Verilog? Спасибо. можно всё, главное правильно описать. но главное что для начала нужно запомнить, это то что в Верилоге НЕТ переменных типа memory, но есть массивы. теперь по сути: если тервый пример использования массива был при том же объявление переменной mem что и второй, то вы пользуетесь не последней версией стандарта Верилог (2005), до ieee1800-2005, действительно непакованные размерности массива не могли подвергаться слайсингу (только пакованные). второй пример корректен и должен работать правильно (сдвигать) что у вас за компиллер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 30 января, 2008 Опубликовано 30 января, 2008 · Жалоба Здравствуйте. Когда попробовал следующую конструкцию reg [7:0] Byte; reg [7:0] mem [6:0]; always @(posedge clk) begin mem[0] = mem[1]; mem[1] = mem[2]; mem[2] = mem[3]; mem[3] = mem[4]; mem[4] = mem[5]; mem[5] = mem[6]; mem[6] = Byte; end получилось, все слова в mem имели одинаковое значение Byte, а сдвига по clk так и не произошло. Вроде все правильно :05: Может сдвиг по clk все же произошел? Точнее сдвиг по 7ми последовательным clk - он как раз запишет Byte во все элементы массива И еще - в симуляторе это все будет работать, но не факт что это вообще синтезируемо, в лучшем случае синтезатор сделает 7 регистров вместо памяти Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 30 января, 2008 Опубликовано 30 января, 2008 · Жалоба в лучшем случае синтезатор сделает 7 регистров вместо памяти эт точно, реализацию 14-ти портовой SRAM трудно представить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor-ka 0 30 января, 2008 Опубликовано 30 января, 2008 · Жалоба непакованные размерности массива не могли подвергаться слайсингу вот эту волшебную фразу я понимаю только интуитивно))) можно немного расшифровать? а пробовал я все это дело в quartus II 5.0 он это просинтезировал - но как я понятия не имею (очень хочется разобраться как вообще это понимать и что для этого читать) временная диаграмма показывает, что по каждому clk одинаково заполняются все массивы (во втором варианте) Спасибо за ответы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor-ka 0 31 января, 2008 Опубликовано 31 января, 2008 (изменено) · Жалоба Вроде все правильно :05: Может сдвиг по clk все же произошел? Точнее сдвиг по 7ми последовательным clk - он как раз запишет Byte во все элементы массива Спасибо большое! У меня все работает, вы правы! :a14: Это просто я не разглядел сдвиг из-за маленького периода clk А где можно подробнее почитать про синтез и как он происходит? Изменено 31 января, 2008 пользователем Egor-ka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 31 января, 2008 Опубликовано 31 января, 2008 · Жалоба вот эту волшебную фразу я понимаю только интуитивно))) можно немного расшифровать? а пробовал я все это дело в quartus II 5.0 он это просинтезировал я просто не знаю термина в русском языке. "слайсинг" взял как адаптацию английского термина "slicing". операция эта относится к массивам. сводится к взятию диапазона последовательно расположенных элементов массива одного измерения. например если массив объявлен как а[7:0]. операция ххх=a[5:2] - слайсинг. в стандарте 2001 года слайсинг непакованых измерений массива запрещён. разрешено только поэлементное обращение. начиная со стандарта 2005 года операция разрешена (системверилог). квартус просинтезировал потому что (знаю из сообщений des00) он поддерживает стд.2005, скорее всего синтаксис 2005 включён там как синтаксис по умолчанию. те среды разработки которые ругались на слайсинг непакованых измерений скорее всего либо не поддерживают 2005, либо по умолчанию стоит опция компиллера использовать синтаксис стд. до 2005 года Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor-ka 0 4 февраля, 2008 Опубликовано 4 февраля, 2008 · Жалоба Спасибо за пояснения. А не могли бы вы посоветовать книги начального уровня по верификации на Veriog, а также рекомендовать что-нибудь для понимания процесса синтеза HDL в ПЛИС? Было бы замечательноэтими документами еще и поделиться)))) Заранее Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 4 февраля, 2008 Опубликовано 4 февраля, 2008 · Жалоба Спасибо за пояснения. А не могли бы вы посоветовать книги начального уровня по верификации на Veriog, а также рекомендовать что-нибудь для понимания процесса синтеза HDL в ПЛИС? Было бы замечательноэтими документами еще и поделиться)))) Заранее Спасибо! в шапке подфорума есть тема по литературе на Верилог (страниц много - дочитайте до конца, ссылки на лит. тоже есть): http://electronix.ru/forum/index.php?showtopic=19616 если не найдёте ответов по интересующим вопросам о литературе после прочтения этой темы, пишите туда же, поможем с информацией удачев Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vasta 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 (изменено) · Жалоба Извиняюсь за поднятие старой темы, что- то в трех сосенках уже второй день блуждаю. В широкоизвестном пакете исходников от Xilinx дословно написано следующее: // Input 8 logic 0s #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #1600 rdn = 1'b0 ; #800 rdn = 1'b1 ; #3200 // Input 8 logic 1s #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #2400 rdn = 1'b0 ; #800 rdn = 1'b1 ; Что это за хренотень? Я почему-то всегда считал, что частота единиц в манчестере в 2 раза больше, чем частота нулей Изменено 27 февраля, 2012 пользователем vasta Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ys05 0 1 марта, 2012 Опубликовано 1 марта, 2012 · Жалоба Я почему-то всегда считал, что частота единиц в манчестере в 2 раза больше, чем частота нулей Наверное, с чем-то перепутали. Манчестер - 1 кодируется переходом 0->1, а 0 - переходом 1->0 (ну или все наоборот). Поэтому, он практически симметричен по частоте 1 и 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться