Meinframe 0 17 ноября, 2011 Опубликовано 17 ноября, 2011 · Жалоба Так нужно? assign oerserial = result [8:0]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 17 ноября, 2011 Опубликовано 17 ноября, 2011 · Жалоба Так нужно? output [8:0] oerserial Вам же явно даже строчки выписали - присваиваете вместо 9 разрядов 1, т.к. oerserial объявлен как одноразрядный сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Meinframe 0 17 ноября, 2011 Опубликовано 17 ноября, 2011 · Жалоба Добавил output [8:0] oerserial else if (ien & errorEvent) err_ctr <= err_ctr + 1; Warning (10230): Verilog HDL assignment warning at channel.v(36): truncated value with size 32 to match size of target (9) Делаю симуляцию, oerserial обозначаю как B 000000000...и после симуляции опять ничего... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 17 ноября, 2011 Опубликовано 17 ноября, 2011 · Жалоба else if (ien & errorEvent) err_ctr <= err_ctr + 1; Warning (10230): Verilog HDL assignment warning at channel.v(36): truncated value with size 32 to match size of target (9) По умолчанию константная 1 изначально 32-разрядная и синтезатор округляет ее до 9 разрядов, можете явно написать как ctr <= err_ctr + 9'd1. Это информативное предупреждение и в данном случае не является ошибкой. Обратите внимание еще раз на сообщение N14 и выводите последовательно промежуточные результаты, смотрите все ли работает по Вашему алгоритму. В данном случае Вы пишете, что в конце у меня что-то не то, объясните почему. Вы б сначала проверили, что частоту правильно задаете, разрешающие сигналы, потом постепенно и до счетчика дойдете. Многие здесь могут взять Ваш проект с тестом и за пару минут все прогнать, только Вам от этого польза какая? ЗЫ// Тест не выложили, кстати. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yume 0 18 ноября, 2011 Опубликовано 18 ноября, 2011 (изменено) · Жалоба Делаю симуляцию, oerserial обозначаю как B 000000000...и после симуляции опять ничего... Возникает вопрос: а зачем выход вообще обозначать как-то в симуляции - он же должен оставаться XXXXXXXXX? К тому же, ваш выходной сигнал зависит от некоторых других: входных данных, сигнала разрешение, ресета...посмотрите, когда и в какое значение вы их установили. Как я понимаю, симуляция проводиться на вэйформах квартуса? Изменено 18 ноября, 2011 пользователем yume Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Meinframe 0 23 ноября, 2011 Опубликовано 23 ноября, 2011 (изменено) · Жалоба Мне кажется ошибка в логике 34 и 39 строка, но точно понять никак не могу. Ещё не пойму как частота может повлиять на то будет ли у меня сигнал или нет. А ещё какой Вы просите выложить тест? А ещё я не привык к тому что программа компилируется и видимых ошибок нет, а на выход ничего не идёт. поэтому мой мозК просто рвётся на части, прям уже незнаю что делать, все эти дни потратил на поиск в книжках различных ситуаций но мне кажется ошибка моя проще чем кажется но только я её не вижу. Где же прячется ошибка? Вот последняя версия кода channel.v Эти тесты просили? И ещё вопрос как сделать инкрементную компиляцию и что это вообще такое...или по шагам как нибудь? ЗЫ сорри за такие вопросы буду по 300 раз спрашивать глупости, просто я забываю быстро и поэтому приходится повторять. ЗЗЫ если надо выложу весь проект целиком. я уверен что lfsr работает, но не уверен что cycle выставляется хотя бы раз, и уверен что errorEvent работает. Помогите понять почему cycle не работает. Изменено 23 ноября, 2011 пользователем Meinframe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 23 ноября, 2011 Опубликовано 23 ноября, 2011 · Жалоба А ещё я не привык к тому что программа компилируется и видимых ошибок нет, а на выход ничего не идёт. поэтому мой мозК просто рвётся на части... Никакой принципиальной разницы с программой, написанной на Си в данном случае нет. Если Си-программа написана функционально неверно, но правильно синтаксически, то скомпилируется она без ошибок, но на выходе вы не получите ожидаемого результата. И ещё вопрос как сделать инкрементную компиляцию и что это вообще такое...или по шагам как нибудь?Забудте о инкрементной компиляции, она вам нафик не нужна. Для справки: инкрементная компиляция — это такая К., позволяющая перекомпилировать изменившуюся часть проекта. Актуально для проектов внушительных размеров. ЗЫ сорри за такие вопросы буду по 300 раз спрашивать глупости, просто я забываю быстро и поэтому приходится повторять. Записывайте на бумажку. Начните с азов. assign cycle = lfsr == 9'hFF Мне думается, в этой строчке есть, как минимум, неточность. Я бы ее поправил на что-то вроде &lfsr. Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 24 ноября, 2011 Опубликовано 24 ноября, 2011 · Жалоба Meinframe, уже лучше теперь выведите на врямянку сигналы lfsr и errorEvent Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Meinframe 0 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба assign cycle = lfsr == 9'hFF Поправил на &lfsr...но ничего не изменилось. теперь выведите на врямянку сигналы lfsr и errorEvent Времянка какя-то странная получается, щас времени нет, вечером приду выложу скрины. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба Я ведь не поленился и накатал трехстрочный тест с Вашими входными воздействиями за 5 минут: `timescale 1ns / 1ps module test_channel; reg irst,iclk,ien,iserial; reg [7:0] ierRate; wire oserial; wire [7:0] result; channel uut ( .irst(irst), .iclk(iclk), .ien(ien), .ierRate(ierRate), // Входная вероятность ошибки .iserial(iserial), // Входные данные (код NRZ) .oserial(oserial), // Выходные данные .result(result) ); initial begin iclk=1'b0; irst=1'b1; ien=1'b1; ierRate=8'd127; iserial=1'b0; #11 irst=1'b0; end always #5 iclk=~iclk; always @(negedge iclk) iserial<=~iserial; endmodule Единственное, переименовал channel.v на channel.sv В результате на моделсиме cycle срабатывает каждые 511 тактов и передает одно и то же значение на result - 126. На вашем скрине выведено только несколько тактов работы - этого недостаточно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба Поправил на &lfsr...но ничего не изменилось. И какая получилась результирующая строка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Meinframe 0 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба 1) И какая получилась результирующая строка? При компиляции выдаёт Warning: Внимание: Выходные контакты застряли на VCC или GND А вот что при симуляции: 2) bogaev_roman у меня не получается откомпилировать Ваш тест-код. Error: Node instance "uut" instantiates undefined entity "channel" Предупреждение (10755): Verilog HDL предупреждение в uut.v (29): сигнал iclk создаёт комбинационную петлю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 29 ноября, 2011 Опубликовано 29 ноября, 2011 · Жалоба 1) Вы можете в wave добавить сигналы lfsr, errorEvent,cycle и увеличить длительность моделирования, чтоб в окно влезло минимум 512 тактов iclk или хотя бы интервал в несколько тактов с центром в 511 тактов iclk? 2) Я просто привел некоторые результаты (скрины прикрутить не имею возможности), запускал в modelsim 6.2g. Встроенным симулятором не пользуюсь и каким образом тест подключать для встроенного моделирования понятия не имею. Если это ошибка modelsim - выведите подробнее. ЗЫ.. cycle = lfsr == 9'hFF и cycle = &lfsr при wire cycle; reg [8:0] lfsr; по мне так 2 большие разности, первое сработает при lfsr=9'b011111111, второе при lfsr=9'b111111111 ЗЫ..приведите Вашу последнюю версию channel.sv. А то в версии, которую я скачал - cycle 9 бит, хотя должен быть всего 1, здесь может быть разница в моделировании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Meinframe 0 5 декабря, 2011 Опубликовано 5 декабря, 2011 · Жалоба Может вот так доказать статистическую вероятность изменения бита? module channel ( input irst, iclk, ien, input [7:0] ierRate, // Входная вероятность ошибки // 8'h00 - P = 0 - ошибки отсутствуют // 8'hFF - P = ~0.5 input iserial, // Входные данные (код NRZ) output oserial, // Выходные данные output [7:0] oerserial // Выходные данные, кол-во ошибок ); // Регистр генератора ПСП, инициализируется // всеми единицами при включении ПЛИС reg [8:0] lfsr = {9{1'b1}}; // Выходной буферный регистр reg serial_ff; //Счётчик reg [7:0] err_ctr; // Событие "ошибка" случается, если значение в регистре ПСП // менее заданного параметра wire errorEvent = lfsr < {1'b0, ierRate}; //Счетчик будет считать каждый раз, когда наш генератор генерирует ошибку always @ (posedge iclk) if (oserial) err_ctr <= err_ctr + 1'b1; assign oerserial = err_ctr; // Описание сдвигового регистра с обратными связями (генератора ПСП) always @ (posedge iclk) if (irst) lfsr <= {9{1'b1}}; // По сигналу сброс синхронно (т.е. по фронту iclk) // загружаем в регистр все единицы else if (ien) // По сигналу lfsr <= {lfsr[7:0], lfsr[8] ^ lfsr[4]}; // Стандартный полином для генератора 9-й степени // g(x) = x^9 + x^5 + 1 // По переднему фронту сигнала iclk при активном разрешительном сигнале ien // присваимваем буферному регистру serial_ff результат операции ИСКЛЮЧАЮЩЕЕ ИЛИ // между исходным (входным) потоком данных и потоком ошибок. always @ (posedge iclk) if (ien) serial_ff <= iserial ^ errorEvent; assign oserial = serial_ff; endmodule Не подскажите мне как сделать так чтобы просто был счётчик который считает кол-во раз изменившегося бита между входной и выходной последовательностью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 5 декабря, 2011 Опубликовано 5 декабря, 2011 · Жалоба Не подскажите мне как сделать так чтобы просто был счётчик который считает кол-во раз изменившегося бита между входной и выходной последовательностью. Если Вы имеете ввиду счетчик, который считает кол-во ошибок выхода относительно входа тогда примерно так: always @(posedge clk) if (rst) counter_err<=0; else if (data_in!=data_out) counter_err<=counter_err+1;/для одноразрядного можно использовать исключающее ИЛИ else counter_err<=counter_err; При условии, что вход/выход засинхронизированы относительно clk и задержка выхода относительно входа нулевая latency=0 - меньше такта). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться