Jump to content

    

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

always_ff @(posedge iclk)
    if (irst | cycle)  err_ctr <= 8'h0;
    else if (ien & erEvent) err_ctr <= err_ctr + 1;

 

Error (10170): Verilog HDL syntax error at channel.v(25) near text "@"; expecting ".", or an identifier, or "(", or "" <-----что сие за бред? я целый день просидел так и не смог исправить...

 

Share this post


Link to post
Share on other sites

Может так:

always_ff @(posedge iclk) begin

if (irst | cycle) err_ctr <= 8'h0;

else if (ien & erEvent) err_ctr <= err_ctr + 1;

end

 

Share this post


Link to post
Share on other sites

Может так:
always_ff @(posedge iclk) begin
if (irst | cycle) err_ctr <= 8'h0;
else if (ien & erEvent) err_ctr <= err_ctr + 1;
end

Та же ошибка

Error (10170): Verilog HDL syntax error at channel.v(25) near text "@"; expecting ".", or an identifier, or "(", or ""

Share this post


Link to post
Share on other sites

Нужен весь файл. Возможно у вас ошибка где-то выше этого фрагмента.

 

А у вас вообще в проекте есть сигнал erEvent?

 

Нельзя настолько бездумно пытаться решить поставленную перед вами задачу.

Share this post


Link to post
Share on other sites
Нужен весь файл. Возможно у вас ошибка где-то выше этого фрагмента.

 

Сам код к этой ошибке никакого отношения не имеет. Нечего Квартус обманывать, он тогда и ругаться не будет.

 

Файл имеет расширение .v это значит, что если в настройках не поставлено соответствующей галочки (а в данном случае она точно не поставлена), то Квартус компилирует это как Verilog, а не SystemVerilog. В Verilog, как известно, нет always_ff - вот Квартус и выдает ошибку.

 

Вы либо дайте файлу правильное расширение (.sv), либо в Assigments -> Settings -> Analysis & Synthesis Settings -> Verilog HDL Input поставьте галочку на SV (сейчас у Вас стоит против Verilog-2001 или Verilog-1995)

Share this post


Link to post
Share on other sites
Сам код к этой ошибке никакого отношения не имеет. Нечего Квартус обманывать, он тогда и ругаться не будет.

Точняк.

 

Надо просто понимать, как появился этот проект.

Накидал этот проект в другой теме, и там ff не было.

А строки выше писал по памяти студенту с телефона на мыло.

ТС так их и вставил не поправив ошибки.

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        // Выходные данные
                );
    
    // Регистр генератора ПСП, инициализируется
    // всеми единицами при включении ПЛИС
    reg      [8:0]    lfsr = {9{1'b1}};
    // Выходной буферный регистр
    reg            serial_ff;
    //Счётчик
    reg   [7:0] err_ctr;
    //Результат ошибок
    reg         result;
   
    // Событие "ошибка" случается, если значение в регистре ПСП
    // менее заданного параметра
    wire        errorEvent = lfsr < {1'b0, ierRate};
    wire        cycle;
    
//Счетчик будет считать каждый раз, когда наш генератор генерирует ошибку
always @ (posedge iclk)
    if (irst | cycle)  err_ctr <= 8'h0;
    else if (ien & errorEvent) err_ctr <= err_ctr + 1;

//Посчитанный результат сохраняем в регистр до конца цикла измерения
always @ (posedge iclk)
     if (irst) result <= 8'h0;
     else if (ien & cycle) result <= 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

//Регистр один раз за цикл пробегает любое выбранное нами значение.
//Формируем сигнал конца цикла
    assign cycle = lfsr == 9'hFF;


// По переднему фронту сигнала iclk при активном разрешительном сигнале ien
// присваимваем буферному регистру serial_ff результат операции ИСКЛЮЧАЮЩЕЕ ИЛИ
// между исходным (входным) потоком данных и потоком ошибок.
always @ (posedge iclk)
    if (ien)
        serial_ff <= iserial ^ errorEvent;

    assign        oserial = serial_ff;
    

endmodule

 

а как посмотреть result ? ну или кол-во ошибок.

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        // Выходные данные
                );
    
    // Регистр генератора ПСП, инициализируется
    // всеми единицами при включении ПЛИС
    reg      [8:0]    lfsr = {9{1'b1}};
    // Выходной буферный регистр
    reg            serial_ff;

    // Событие "ошибка" случается, если значение в регистре ПСП
    // менее заданного параметра
    wire        errorEvent = lfsr < {1'b0, ierRate};


// Описание сдвигового регистра с обратными связями (генератора ПСП)
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

 

 

Имеется дополнениек этому коду:

//ошибки за период счетчика LFSR.

//Регистр один раз за цикл пробегает любое выбранное нами значение.
//Формируем сигнал конца цикла
assign cycle = lfsr == 9'hFF;

//Cчетчик будет считать каждый раз, когда наш генератор генерирует ошибку
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;

 

Эти строки нужно просто вставить в проект в любом месте, определив, конечно, используемые регистры. Я вставлял эти строки, объявлял регистры. Но когда делал функциональную симуляцию, то ничего не получалось. Кто нибудь может вставить эти строки в код правильно и провести функциональную симуляцию?

Share this post


Link to post
Share on other sites
Кто нибудь может вставить эти строки в код правильно и провести функциональную симуляцию?

 

Тут много кто может вставить эти строки в код правильно и провести функциональную симуляцию - это вполне решаемая задача.

Share this post


Link to post
Share on other sites

Тут много кто может вставить эти строки в код правильно и провести функциональную симуляцию - это вполне решаемая задача.

А почему же никто не поможет? Ведь это дело 10 минут(возможно даже меньше)

Просто я люблю учится на примерах готовых, а не на воздухе в котором ветает то что мне нужно и которое я смогу поймать только через 1-2 месяца...

Ну помогите же мне :rolleyes:. А то тут сообщество принципиальных людей, которые привыкли жить как [волки в "стаде"].

Share this post


Link to post
Share on other sites
А почему же никто не поможет? Ведь это дело 10 минут(возможно даже меньше)

 

Потому что то, что Вы просите это не помощь, а просто выполнение вашего учебного задания за Вас. Проект Вам написали, может кто и моделирование за Вас выполнит...

Share this post


Link to post
Share on other sites

Ага ! Не ждали :1111493779:

Просидел 2 дня толку 0. Вот что нагородил:

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

 

И всё равно почему-то при функциональной симуляции на oerserial ничего нет...прям ваще незнаю что делать :crying:

Share this post


Link to post
Share on other sites

ну симуляцию научились уже делать, уже не ноль значит

используйти инкрементную отладку, смотрите сигналы ien, serial, errorEvent, что на них и т.д. откатывайте.

 

ps: пишите четче свои проблемы, иначе вас просто начнут игнорить

Share this post


Link to post
Share on other sites
output oserial, oerserial // Выходные данные

reg [8:0] result;

assign oerserial = result;

И всё равно почему-то при функциональной симуляции на oerserial ничего нет

 

Предупреждения смотреть по соблюдению разрядности. RTL просмотрщик.

Вы от 9 разрядного регистра оставили result[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