Jump to content

    
Sign in to follow this  
Meinframe

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

Recommended Posts

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

Та же ошибка

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

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.

Sign in to follow this