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

Помогите,пожалуйста разобраться с ошибками?

 

Я хочу по фронту одного сигнала считывать данные, а затем сдвигать их и преобразовывать первый разряд регистра в манчестер.

Приведенные в рекомендованных выше ссылках примеры для меня сложноватые. решил попробовать просто сделать основу ,как я понял.

Скорее всего это связано с непониманием процесса и языка в целом - пожалуйста,помогите разобраться. :help:

 

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)

 

Спасибо

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


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

Помогите,пожалуйста разобраться с ошибками?

 

Я хочу по фронту одного сигнала считывать данные, а затем сдвигать их и преобразовывать первый разряд регистра в манчестер.

Приведенные в рекомендованных выше ссылках примеры для меня сложноватые. решил попробовать просто сделать основу ,как я понял.

Скорее всего это связано с непониманием процесса и языка в целом - пожалуйста,помогите разобраться. :help:

 

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 вы сможете подробно и со всех сторон изучить все грабли, которые разложены на пути приверженцев асинхронного подхода :wacko: Рекомендую сделать синхронный дезайн.

 

 

 

Что касается остального, то прежде чем писать Верилоговский модуль необходимо определится с интерфейсом:

 

1) Как будет осуществлятся загрузка данных и их сдвиг (один сигнал или несколько?)

 

2) Что должно быть на выходе Manch когда сдвиг запрещен?

 

3) Нужна ли синхронизация фазы выходного манчестера?

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


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

Здравствуйте.

Спасибо огромное за предыдущие ответы. :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?

 

Спасибо.

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


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

Здравствуйте.

Спасибо огромное за предыдущие ответы. :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, действительно непакованные размерности массива не могли подвергаться слайсингу (только пакованные).

второй пример корректен и должен работать правильно (сдвигать)

что у вас за компиллер?

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


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

Здравствуйте.

Когда попробовал следующую конструкцию

 

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 регистров вместо памяти

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


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

в лучшем случае синтезатор сделает 7 регистров вместо памяти

эт точно, реализацию 14-ти портовой SRAM трудно представить

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


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

непакованные размерности массива не могли подвергаться слайсингу

вот эту волшебную фразу я понимаю только интуитивно)))

можно немного расшифровать?

а пробовал я все это дело в quartus II 5.0

он это просинтезировал - но как я понятия не имею (очень хочется разобраться как вообще это понимать и что для этого читать)

 

временная диаграмма показывает, что по каждому clk одинаково заполняются все массивы (во втором варианте)

 

Спасибо за ответы.

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


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

Вроде все правильно :05: Может сдвиг по clk все же произошел? Точнее сдвиг по 7ми последовательным clk - он как раз запишет Byte во все элементы массива

Спасибо большое! У меня все работает, вы правы! :a14:

Это просто я не разглядел сдвиг из-за маленького периода clk

 

А где можно подробнее почитать про синтез и как он происходит?

Изменено пользователем Egor-ka

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


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

вот эту волшебную фразу я понимаю только интуитивно)))

можно немного расшифровать?

а пробовал я все это дело в quartus II 5.0

он это просинтезировал

я просто не знаю термина в русском языке. "слайсинг" взял как адаптацию английского термина "slicing".

операция эта относится к массивам. сводится к взятию диапазона последовательно расположенных элементов массива одного измерения. например если массив объявлен как а[7:0]. операция ххх=a[5:2] - слайсинг. в стандарте 2001 года слайсинг непакованых измерений массива запрещён. разрешено только поэлементное обращение. начиная со стандарта 2005 года операция разрешена (системверилог).

квартус просинтезировал потому что (знаю из сообщений des00) он поддерживает стд.2005, скорее всего синтаксис 2005 включён там как синтаксис по умолчанию. те среды разработки которые ругались на слайсинг непакованых измерений скорее всего либо не поддерживают 2005, либо по умолчанию стоит опция компиллера использовать синтаксис стд. до 2005 года

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


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

Спасибо за пояснения.

А не могли бы вы посоветовать книги начального уровня по верификации на Veriog, а также рекомендовать что-нибудь для понимания процесса синтеза HDL в ПЛИС?

Было бы замечательноэтими документами еще и поделиться))))

 

Заранее Спасибо!

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


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

Спасибо за пояснения.

А не могли бы вы посоветовать книги начального уровня по верификации на Veriog, а также рекомендовать что-нибудь для понимания процесса синтеза HDL в ПЛИС?

Было бы замечательноэтими документами еще и поделиться))))

 

Заранее Спасибо!

в шапке подфорума есть тема по литературе на Верилог (страниц много - дочитайте до конца, ссылки на лит. тоже есть):

http://electronix.ru/forum/index.php?showtopic=19616

если не найдёте ответов по интересующим вопросам о литературе после прочтения этой темы, пишите туда же, поможем с информацией

удачев

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


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

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

В широкоизвестном пакете исходников от 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 раза больше, чем частота нулей

Изменено пользователем vasta

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


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

Я почему-то всегда считал, что частота единиц в манчестере в 2 раза больше, чем частота нулей

 

Наверное, с чем-то перепутали. Манчестер - 1 кодируется переходом 0->1, а 0 - переходом 1->0 (ну или все наоборот). Поэтому, он практически симметричен по частоте 1 и 0.

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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