Jump to content

    

Verilog. Не могу скомпилировать.

При таком коде (жаль не могу под спойлер закинуть)

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

 

вот такая симуляция

2226164.png

Share this post


Link to post
Share on other sites

Если не вдаваться в подробности, то ошибка следующая - 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

Share this post


Link to post
Share on other sites

при таком коде:

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

 

Скрин симуляции:

2225930.png

 

Что-то не работает...хотя Вы вроде правильно написали

Share this post


Link to post
Share on other sites

Сдается мне алгоритм работает не так как Вы задумали.

// 8'hFF - P = ~0.5 при этом на вход подается постоянно 'd127 -> вероятность появления errorEvent = lfsr < {1'b0, ierRate};

в данном случае будет 1/4. Т.е. чтоб реально получить вероятность близкую к 0.5 требуется подать 'd255 и смотреть не 10 тактов, а больше гораздо.

 

Share this post


Link to post
Share on other sites
Сдается мне алгоритм работает не так как Вы задумали.

// 8'hFF - P = ~0.5 при этом на вход подается постоянно 'd127 -> вероятность появления errorEvent = lfsr < {1'b0, ierRate};

в данном случае будет 1/4. Т.е. чтоб реально получить вероятность близкую к 0.5 требуется подать 'd255 и смотреть не 10 тактов, а больше гораздо.

 

Это всего лишь вероятность "порчи" бита, мне не нужно регулировать её, пускай будет 1/4 или 1/2 это как мне кажется не влияет на то, что счётчик по каким-то неведомым причинам не может посчитать случившиеся ошибки, я просто не могу понять вроде бы не такая уж и сложная задача посчитать изменения выходного сигнала относительно входного, но БЛИИИН я просто непонимаю где ошибка...))) :maniac:

Share this post


Link to post
Share on other sites
Это всего лишь вероятность "порчи" бита, мне не нужно регулировать её, пускай будет 1/4 или 1/2 это как мне кажется не влияет на то, что счётчик по каким-то неведомым причинам не может посчитать случившиеся ошибки, я просто не могу понять вроде бы не такая уж и сложная задача посчитать изменения выходного сигнала относительно входного, но БЛИИИН я просто непонимаю где ошибка...))) :maniac:

Я загонял Ваш код и свой тест, нормально все счетчик считает. Загонял разную вероятность и ввел еще дополнительный сигнал - счетчик обнуления и прекрасно наблюдал кол-во ошибок за 1000 тактов. При 255 - около 500 (с определенной погрешностью) ошибок, при 127 - 250 ошибок и т.д. В чем проблема? Вот Вы ради интереса попробуйте увеличить время моделирования на собственном тесте и увидите, что через 1000 тактов oeserial будет примерно 250.

Share this post


Link to post
Share on other sites
bogaev_roman Вы не могли сделать так сказать ГАЙД по тому как Вы проводили симуляцию с тестом, я думаю многим начинающим таким как я это будет полезно. Само собой когда у Вас будет свободное время.

Share this post


Link to post
Share on other sites
bogaev_roman Вы не могли сделать так сказать ГАЙД по тому как Вы проводили симуляцию с тестом, я думаю многим начинающим таким как я это будет полезно. Само собой когда у Вас будет свободное время.

Все гайды уже давно написаны, здесь обитают более компетентные люди в написании статей. Лучше поделитесь - в чем Ваша проблема?

:bb-offtopic: Только вопросы конкретные задавайте. Не знаете как увеличить время моделирования во встроенном квартусовском симуляторе - ищите поисковиком по форуму, я думаю это уже обсуждалось, если нет - создавайте новый топ. Не знаете как вытянуть сигналы, которые не output - тоже самое. Но не выкладывайте код с более чем 50 строчек - его многие даже просматривать не станут, не то что разбираться - конкретизируйте свои проблемы и дробите не мелкие части, тогда вероятность что Вам помогут гораздо выше. Ну не будете же Вы выкладывать здесь проект с более десятков/сотен тысяч ALUTs и verilog на десятки тысяч строк.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this