Перейти к содержанию

    

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

Так нужно?

output [8:0] oerserial

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил

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

 

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Делаю симуляцию, oerserial обозначаю как B 000000000...и после симуляции опять ничего...

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

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

Изменено пользователем yume

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

channel.v

 

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

2217313m.png

2207073m.png

 

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

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

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

 

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

Изменено пользователем Meinframe

Поделиться сообщением


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

 

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

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

 

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

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

 

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

 

assign cycle = lfsr == 9'hFF

 

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

 

Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Meinframe, уже лучше

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
assign cycle = lfsr == 9'hFF

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Поправил на &lfsr...но ничего не изменилось.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1)

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

 

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

 

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

2182202m.png

 

2)

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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, здесь может быть разница в моделировании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может вот так доказать статистическую вероятность изменения бита?

 

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:

Поделиться сообщением


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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация