Jump to content

    

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

Так нужно?

output [8:0] oerserial

Вам же явно даже строчки выписали - присваиваете вместо 9 разрядов 1, т.к. oerserial объявлен как одноразрядный сигнал.

Share this post


Link to post
Share on other sites

Добавил

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...и после симуляции опять ничего...

 

Share this post


Link to post
Share on other sites
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 и выводите последовательно промежуточные результаты, смотрите все ли работает по Вашему алгоритму. В данном случае Вы пишете, что в конце у меня что-то не то, объясните почему. Вы б сначала проверили, что частоту правильно задаете, разрешающие сигналы, потом постепенно и до счетчика дойдете. Многие здесь могут взять Ваш проект с тестом и за пару минут все прогнать, только Вам от этого польза какая?

ЗЫ// Тест не выложили, кстати.

Share this post


Link to post
Share on other sites
Делаю симуляцию, oerserial обозначаю как B 000000000...и после симуляции опять ничего...

Возникает вопрос: а зачем выход вообще обозначать как-то в симуляции - он же должен оставаться XXXXXXXXX?

К тому же, ваш выходной сигнал зависит от некоторых других: входных данных, сигнала разрешение, ресета...посмотрите, когда и в какое значение вы их установили. Как я понимаю, симуляция проводиться на вэйформах квартуса?

Edited by yume

Share this post


Link to post
Share on other sites

Мне кажется ошибка в логике 34 и 39 строка, но точно понять никак не могу. Ещё не пойму как частота может повлиять на то будет ли у меня сигнал или нет.

А ещё какой Вы просите выложить тест? А ещё я не привык к тому что программа компилируется и видимых ошибок нет, а на выход ничего не идёт. поэтому мой мозК просто рвётся на части, прям уже незнаю что делать, все эти дни потратил на поиск в книжках различных ситуаций но мне кажется ошибка моя проще чем кажется но только я её не вижу. Где же прячется ошибка?

 

Вот последняя версия кода

channel.v

 

Эти тесты просили?

2217313m.png

2207073m.png

 

И ещё вопрос как сделать инкрементную компиляцию и что это вообще такое...или по шагам как нибудь?

ЗЫ сорри за такие вопросы буду по 300 раз спрашивать глупости, просто я забываю быстро и поэтому приходится повторять.

ЗЗЫ если надо выложу весь проект целиком.

 

я уверен что lfsr работает, но не уверен что cycle выставляется хотя бы раз, и уверен что errorEvent работает. Помогите понять почему cycle не работает.

Edited by Meinframe

Share this post


Link to post
Share on other sites
А ещё я не привык к тому что программа компилируется и видимых ошибок нет, а на выход ничего не идёт. поэтому мой мозК просто рвётся на части...
Никакой принципиальной разницы с программой, написанной на Си в данном случае нет. Если Си-программа написана функционально неверно, но правильно синтаксически, то скомпилируется она без ошибок, но на выходе вы не получите ожидаемого результата.

 

И ещё вопрос как сделать инкрементную компиляцию и что это вообще такое...или по шагам как нибудь?
Забудте о инкрементной компиляции, она вам нафик не нужна.

Для справки: инкрементная компиляция — это такая К., позволяющая перекомпилировать изменившуюся часть проекта. Актуально для проектов внушительных размеров.

 

ЗЫ сорри за такие вопросы буду по 300 раз спрашивать глупости, просто я забываю быстро и поэтому приходится повторять.

Записывайте на бумажку.

 

Начните с азов.

 

assign cycle = lfsr == 9'hFF

 

Мне думается, в этой строчке есть, как минимум, неточность. Я бы ее поправил на что-то вроде &lfsr.

 

Удачи!

Share this post


Link to post
Share on other sites

Meinframe, уже лучше

теперь выведите на врямянку сигналы lfsr и errorEvent

Share this post


Link to post
Share on other sites
assign cycle = lfsr == 9'hFF

Поправил на &lfsr...но ничего не изменилось.

 

теперь выведите на врямянку сигналы lfsr и errorEvent

 

Времянка какя-то странная получается, щас времени нет, вечером приду выложу скрины.

Share this post


Link to post
Share on other sites

Я ведь не поленился и накатал трехстрочный тест с Вашими входными воздействиями за 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. На вашем скрине выведено только несколько тактов работы - этого недостаточно.

 

 

 

Share this post


Link to post
Share on other sites
Поправил на &lfsr...но ничего не изменилось.

И какая получилась результирующая строка?

 

Share this post


Link to post
Share on other sites

1)

И какая получилась результирующая строка?

 

При компиляции выдаёт Warning: Внимание: Выходные контакты застряли на VCC или GND

 

А вот что при симуляции:

2182202m.png

 

2)

bogaev_roman у меня не получается откомпилировать Ваш тест-код.

 

Error: Node instance "uut" instantiates undefined entity "channel"

Предупреждение (10755): Verilog HDL предупреждение в uut.v (29): сигнал iclk создаёт комбинационную петлю

Share this post


Link to post
Share on other sites
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, здесь может быть разница в моделировании.

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   // Выходные данные, кол-во ошибок
				);

// Регистр генератора ПСП, инициализируется
// всеми единицами при включении ПЛИС
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

 

Не подскажите мне как сделать так чтобы просто был счётчик который считает кол-во раз изменившегося бита между входной и выходной последовательностью. :wacko:

Share this post


Link to post
Share on other sites
Не подскажите мне как сделать так чтобы просто был счётчик который считает кол-во раз изменившегося бита между входной и выходной последовательностью.

Если Вы имеете ввиду счетчик, который считает кол-во ошибок выхода относительно входа тогда примерно так:

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 - меньше такта).

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