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 (irst) err_ctr<=0; else if (iserial!=oserial) err_ctr<=err_ctr+1'b1; else err_ctr<=err_ctr; 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 · Жалоба Если не вдаваться в подробности, то ошибка следующая - serial_ff будет задержан на 1 такт относительно iserial. В Вашем варианте сравниваются вычисленный выход и новый вход. Поэтому при сравнении необходимо использовать задержанный на один такт iserial. reg iserial_r; always @(posedge iclk) if (irst) iserial_r<=1'b0; else iserial_r<=iserial; always @(posedge iclk) if (irst) err_ctr<=0; else if (iserial_r!=oserial) err_ctr<=err_ctr+1'b1; else err_ctr<=err_ctr; PS//Выведете дополнительные промежуточные сигналы на wave Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
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, // Выходные данные, кол-во ошибок output reg prom1 ); // Регистр генератора ПСП, инициализируется // всеми единицами при включении ПЛИС reg [8:0] lfsr = {9{1'b1}}; // Выходной буферный регистр reg serial_ff; //Счётчик reg [7:0] err_ctr; // Событие "ошибка" случается, если значение в регистре ПСП // менее заданного параметра wire errorEvent = lfsr < {1'b0, ierRate}; reg iserial_r; assign prom1 = errorEvent; //Промежуточный сигнал события ошибка always @(posedge iclk) if (irst) iserial_r<=1'b0; else iserial_r<=iserial; always @(posedge iclk) if (irst) err_ctr<=0; else if (iserial_r!=oserial) err_ctr<=err_ctr+1'b1; else err_ctr<=err_ctr; 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 · Жалоба Сдается мне алгоритм работает не так как Вы задумали. // 8'hFF - P = ~0.5 при этом на вход подается постоянно 'd127 -> вероятность появления errorEvent = lfsr < {1'b0, ierRate}; в данном случае будет 1/4. Т.е. чтоб реально получить вероятность близкую к 0.5 требуется подать 'd255 и смотреть не 10 тактов, а больше гораздо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Meinframe 0 6 декабря, 2011 Опубликовано 6 декабря, 2011 · Жалоба Сдается мне алгоритм работает не так как Вы задумали. // 8'hFF - P = ~0.5 при этом на вход подается постоянно 'd127 -> вероятность появления errorEvent = lfsr < {1'b0, ierRate}; в данном случае будет 1/4. Т.е. чтоб реально получить вероятность близкую к 0.5 требуется подать 'd255 и смотреть не 10 тактов, а больше гораздо. Это всего лишь вероятность "порчи" бита, мне не нужно регулировать её, пускай будет 1/4 или 1/2 это как мне кажется не влияет на то, что счётчик по каким-то неведомым причинам не может посчитать случившиеся ошибки, я просто не могу понять вроде бы не такая уж и сложная задача посчитать изменения выходного сигнала относительно входного, но БЛИИИН я просто непонимаю где ошибка...))) :maniac: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 6 декабря, 2011 Опубликовано 6 декабря, 2011 · Жалоба Это всего лишь вероятность "порчи" бита, мне не нужно регулировать её, пускай будет 1/4 или 1/2 это как мне кажется не влияет на то, что счётчик по каким-то неведомым причинам не может посчитать случившиеся ошибки, я просто не могу понять вроде бы не такая уж и сложная задача посчитать изменения выходного сигнала относительно входного, но БЛИИИН я просто непонимаю где ошибка...))) :maniac: Я загонял Ваш код и свой тест, нормально все счетчик считает. Загонял разную вероятность и ввел еще дополнительный сигнал - счетчик обнуления и прекрасно наблюдал кол-во ошибок за 1000 тактов. При 255 - около 500 (с определенной погрешностью) ошибок, при 127 - 250 ошибок и т.д. В чем проблема? Вот Вы ради интереса попробуйте увеличить время моделирования на собственном тесте и увидите, что через 1000 тактов oeserial будет примерно 250. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Meinframe 0 6 декабря, 2011 Опубликовано 6 декабря, 2011 · Жалоба bogaev_roman Вы не могли сделать так сказать ГАЙД по тому как Вы проводили симуляцию с тестом, я думаю многим начинающим таким как я это будет полезно. Само собой когда у Вас будет свободное время. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 6 декабря, 2011 Опубликовано 6 декабря, 2011 · Жалоба bogaev_roman Вы не могли сделать так сказать ГАЙД по тому как Вы проводили симуляцию с тестом, я думаю многим начинающим таким как я это будет полезно. Само собой когда у Вас будет свободное время. Все гайды уже давно написаны, здесь обитают более компетентные люди в написании статей. Лучше поделитесь - в чем Ваша проблема? :bb-offtopic: Только вопросы конкретные задавайте. Не знаете как увеличить время моделирования во встроенном квартусовском симуляторе - ищите поисковиком по форуму, я думаю это уже обсуждалось, если нет - создавайте новый топ. Не знаете как вытянуть сигналы, которые не output - тоже самое. Но не выкладывайте код с более чем 50 строчек - его многие даже просматривать не станут, не то что разбираться - конкретизируйте свои проблемы и дробите не мелкие части, тогда вероятность что Вам помогут гораздо выше. Ну не будете же Вы выкладывать здесь проект с более десятков/сотен тысяч ALUTs и verilog на десятки тысяч строк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться