Egor-ka 0 January 18, 2008 Posted January 18, 2008 · Report post Помогите,пожалуйста разобраться с ошибками? Я хочу по фронту одного сигнала считывать данные, а затем сдвигать их и преобразовывать первый разряд регистра в манчестер. Приведенные в рекомендованных выше ссылках примеры для меня сложноватые. решил попробовать просто сделать основу ,как я понял. Скорее всего это связано с непониманием процесса и языка в целом - пожалуйста,помогите разобраться. 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) Спасибо Quote Share this post Link to post Share on other sites More sharing options...
xvr 12 January 18, 2008 Posted January 18, 2008 · Report post Помогите,пожалуйста разобраться с ошибками? Я хочу по фронту одного сигнала считывать данные, а затем сдвигать их и преобразовывать первый разряд регистра в манчестер. Приведенные в рекомендованных выше ссылках примеры для меня сложноватые. решил попробовать просто сделать основу ,как я понял. Скорее всего это связано с непониманием процесса и языка в целом - пожалуйста,помогите разобраться. 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) Нужна ли синхронизация фазы выходного манчестера? Quote Share this post Link to post Share on other sites More sharing options...
Egor-ka 0 January 30, 2008 Posted January 30, 2008 · Report post Здравствуйте. Спасибо огромное за предыдущие ответы. :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? Спасибо. Quote Share this post Link to post Share on other sites More sharing options...
CaPpuCcino 0 January 30, 2008 Posted January 30, 2008 · Report post Здравствуйте. Спасибо огромное за предыдущие ответы. :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, действительно непакованные размерности массива не могли подвергаться слайсингу (только пакованные). второй пример корректен и должен работать правильно (сдвигать) что у вас за компиллер? Quote Share this post Link to post Share on other sites More sharing options...
xvr 12 January 30, 2008 Posted January 30, 2008 · Report post Здравствуйте. Когда попробовал следующую конструкцию 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 регистров вместо памяти Quote Share this post Link to post Share on other sites More sharing options...
CaPpuCcino 0 January 30, 2008 Posted January 30, 2008 · Report post в лучшем случае синтезатор сделает 7 регистров вместо памяти эт точно, реализацию 14-ти портовой SRAM трудно представить Quote Share this post Link to post Share on other sites More sharing options...
Egor-ka 0 January 30, 2008 Posted January 30, 2008 · Report post непакованные размерности массива не могли подвергаться слайсингу вот эту волшебную фразу я понимаю только интуитивно))) можно немного расшифровать? а пробовал я все это дело в quartus II 5.0 он это просинтезировал - но как я понятия не имею (очень хочется разобраться как вообще это понимать и что для этого читать) временная диаграмма показывает, что по каждому clk одинаково заполняются все массивы (во втором варианте) Спасибо за ответы. Quote Share this post Link to post Share on other sites More sharing options...
Egor-ka 0 January 31, 2008 Posted January 31, 2008 (edited) · Report post Вроде все правильно :05: Может сдвиг по clk все же произошел? Точнее сдвиг по 7ми последовательным clk - он как раз запишет Byte во все элементы массива Спасибо большое! У меня все работает, вы правы! :a14: Это просто я не разглядел сдвиг из-за маленького периода clk А где можно подробнее почитать про синтез и как он происходит? Edited January 31, 2008 by Egor-ka Quote Share this post Link to post Share on other sites More sharing options...
CaPpuCcino 0 January 31, 2008 Posted January 31, 2008 · Report post вот эту волшебную фразу я понимаю только интуитивно))) можно немного расшифровать? а пробовал я все это дело в quartus II 5.0 он это просинтезировал я просто не знаю термина в русском языке. "слайсинг" взял как адаптацию английского термина "slicing". операция эта относится к массивам. сводится к взятию диапазона последовательно расположенных элементов массива одного измерения. например если массив объявлен как а[7:0]. операция ххх=a[5:2] - слайсинг. в стандарте 2001 года слайсинг непакованых измерений массива запрещён. разрешено только поэлементное обращение. начиная со стандарта 2005 года операция разрешена (системверилог). квартус просинтезировал потому что (знаю из сообщений des00) он поддерживает стд.2005, скорее всего синтаксис 2005 включён там как синтаксис по умолчанию. те среды разработки которые ругались на слайсинг непакованых измерений скорее всего либо не поддерживают 2005, либо по умолчанию стоит опция компиллера использовать синтаксис стд. до 2005 года Quote Share this post Link to post Share on other sites More sharing options...
Egor-ka 0 February 4, 2008 Posted February 4, 2008 · Report post Спасибо за пояснения. А не могли бы вы посоветовать книги начального уровня по верификации на Veriog, а также рекомендовать что-нибудь для понимания процесса синтеза HDL в ПЛИС? Было бы замечательноэтими документами еще и поделиться)))) Заранее Спасибо! Quote Share this post Link to post Share on other sites More sharing options...
CaPpuCcino 0 February 4, 2008 Posted February 4, 2008 · Report post Спасибо за пояснения. А не могли бы вы посоветовать книги начального уровня по верификации на Veriog, а также рекомендовать что-нибудь для понимания процесса синтеза HDL в ПЛИС? Было бы замечательноэтими документами еще и поделиться)))) Заранее Спасибо! в шапке подфорума есть тема по литературе на Верилог (страниц много - дочитайте до конца, ссылки на лит. тоже есть): http://electronix.ru/forum/index.php?showtopic=19616 если не найдёте ответов по интересующим вопросам о литературе после прочтения этой темы, пишите туда же, поможем с информацией удачев Quote Share this post Link to post Share on other sites More sharing options...
vasta 0 February 27, 2012 Posted February 27, 2012 (edited) · Report post Извиняюсь за поднятие старой темы, что- то в трех сосенках уже второй день блуждаю. В широкоизвестном пакете исходников от 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 раза больше, чем частота нулей Edited February 27, 2012 by vasta Quote Share this post Link to post Share on other sites More sharing options...
ys05 0 March 1, 2012 Posted March 1, 2012 · Report post Я почему-то всегда считал, что частота единиц в манчестере в 2 раза больше, чем частота нулей Наверное, с чем-то перепутали. Манчестер - 1 кодируется переходом 0->1, а 0 - переходом 1->0 (ну или все наоборот). Поэтому, он практически симметричен по частоте 1 и 0. Quote Share this post Link to post Share on other sites More sharing options...