Код: Выделить всё
module channel (
input irst, iclk, ien,
input [7:0] ierRate, // Входная вероятность ошибки
// 8'h00 - P = 0 - ошибки отсутствуют
// 8'hFF - P = ~0.5
input iserial, // Входные данные (код NRZ)
output oserial, oerserial // Выходные данные
);
// Регистр генератора ПСП, инициализируется
// всеми единицами при включении ПЛИС
reg [8:0] lfsr = {9{1'b1}};
// Выходной буферный регистр
reg serial_ff;
// Событие "ошибка" случается, если значение в регистре ПСП
// менее заданного параметра
wire errorEvent = lfsr < {1'b0, ierRate};
//Ошибки
reg [8:0] result;
//Счётчик
reg [8:0] err_ctr;
reg [8:0] cycle;
//Регистр один раз за цикл пробегает любое выбранное нами значение.
//Формируем сигнал конца цикла
assign cycle = lfsr == 9'hFF;
//Счетчик будет считать каждый раз, когда наш генератор генерирует ошибку
always_ff @ (posedge iclk)
if (irst | cycle) err_ctr <= 8'h0;
else if (ien & errorEvent) err_ctr <= err_ctr + 1;
//Посчитанный результат сохраняем в регистр до конца цикла измерения
always_ff @ (posedge iclk)
if (irst) result <= 8'h0;
else if (ien & cycle) result <= err_ctr;
assign oerserial = result;
// Описание сдвигового регистра с обратными связями (генератора ПСП)
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
Кто нибудь может помочь? Я новичёк в этом и собрал код из двух кусков (писал код не я). Не могу понять как данные с result получить при функциональной симуляции проекта.