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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...