Иноформационно-образовательный портал для FPGA разработчиков
Главное меню
  • Страница 1 из 1
  • 1
Модератор форума: drakonof  
heart_beat
drakonof
Рядовой
Группа: Модераторы
Сообщений: 2
Репутация: 1
Статус: Offline
 
Модуль генерации сигнала от частоты. Можно юзать на светодиоде от разных модулей и ip ядер (например от mac или pcie), как индикатор правильной инициализации.

heart_beat.sv

Код
#SV
`timescale 1ns / 10ps

module heart_beat #
(
    parameter integer SPEED_GRADE   = 2,
    parameter         IS_DEBUG      = "false",
    parameter         IS_BLINK      = "false"
)
(
    input  logic i_clk,
    input  logic i_s_rst_n,
    
    output logic o_heart_beat
);
    localparam integer                RATE            = (IS_DEBUG == "true") ? 120 : 120_000_000;
    localparam integer                MAX_COUNTER_VAL = RATE / (((SPEED_GRADE != 2 ) &&
                    (SPEED_GRADE != 3 ) &&
                    (SPEED_GRADE != 5 ) &&
                    (SPEED_GRADE != 6 )) ? 2 : SPEED_GRADE);
                    
    localparam integer                COUNTER_WIDTH   = $clog2(MAX_COUNTER_VAL);
                    
    localparam [COUNTER_WIDTH - 1: 0] CMP_COUNTER_VAL = MAX_COUNTER_VAL - 1'h1;
    

    logic                        heart_beat;
    logic                        mask;
    logic [COUNTER_WIDTH - 1: 0] counter;

    assign o_heart_beat = heart_beat & ((IS_BLINK == "true") ? '1 : mask);
    
    always_ff @ (posedge i_clk) begin
        if (i_s_rst_n == '0) begin
            counter    <= '0;
            heart_beat <= '0;
        end
        else begin
            if (counter == CMP_COUNTER_VAL) begin
                heart_beat <= !heart_beat;
                counter    <= '0;
            end
            else begin
                counter++;
            end  
        end
    end
    
    generate
         if (IS_BLINK == "false") begin
             localparam integer                MASK_COUNTER_PRE     = 4;
             localparam integer                MASK_MAX_COUNTER_VAL = (MAX_COUNTER_VAL / MASK_COUNTER_PRE);
    
             localparam integer                MASK_COUNTER_WIDTH   = $clog2(MASK_MAX_COUNTER_VAL);
             localparam [COUNTER_WIDTH - 1: 0] MASK_CMP_COUNTER_VAL = MASK_MAX_COUNTER_VAL - 1'h1;
             
             logic [MASK_COUNTER_WIDTH - 1: 0] mask_counter;
    
             always_ff @ (posedge i_clk) begin
                 if (i_s_rst_n == '0) begin
                     mask <= '0;
                     mask_counter <= '0;
                 end
                 else begin
                     if (mask_counter == MASK_CMP_COUNTER_VAL) begin
                         mask         <= !mask;
                         mask_counter <= '0;
                     end  
                     else begin
                         mask_counter++;
                     end
                 end
             end
         end
    endgenerate
endmodule


heart_beat_tb.sv


zlobec
Рядовой
Группа: Проверенные
Сообщений: 1
Репутация: 0
Статус: Offline
 
Код
mask_counter++;

Инкремент в SV блокирующий.
Сообщение отредактировал zlobec - Среда, 29.12.2021, 16:07
KeisN13
Рядовой
Группа: Администраторы
Сообщений: 11
Репутация: 0
Статус: Offline
 
люблю, когда подписывают направление портов модуля или энтити (i_  , o_ , io, i, o, io), потом сильно упрощает жизнь в иерархии
Код
#SV
input  logic i_clk,
input  logic i_s_rst_n,
    
output logic o_heart_beat
evgeniybolnov
Рядовой
Группа: Проверенные
Сообщений: 3
Репутация: 0
Статус: Offline
 
Чисто из любопытства: в чем сакральный смысл в SPEED_GRADE, а точнее то условие, в котором используется?
KeisN13
Рядовой
Группа: Администраторы
Сообщений: 11
Репутация: 0
Статус: Offline
 
Цитата evgeniybolnov ()
Чисто из любопытства: в чем сакральный смысл в SPEED_GRADE, а точнее то условие, в котором используется?

Ну комментов не хватает в коде это явно, хотя бы по параметрам
andrewkushchenko
Рядовой
Группа: Проверенные
Сообщений: 2
Репутация: 2
Статус: Offline
 

Цитата drakonof ()
Код
#SV
parameter IS_DEBUG = "false", parameter IS_BLINK = "false"

Лучше использовать bit или logic. Ведь может быть только 2 состояния? со строкой можно опечататься


Цитата drakonof ()
Код
#SV
parameter integer SPEED_GRADE = 2,

Надо бы комментариев добавить. а то непонятно это спидгрейд микросхемы или опорная частота? и в каких ихмерениях частота?


Цитата drakonof ()
Код
#SV
localparam integer MASK_COUNTER_PRE = 4; localparam integer MASK_MAX_COUNTER_VAL = (MAX_COUNTER_VAL / MASK_COUNTER_PRE);

localparam integer MASK_COUNTER_WIDTH = $clog2(MASK_MAX_COUNTER_VAL);
localparam [COUNTER_WIDTH - 1: 0] MASK_CMP_COUNTER_VAL = MASK_MAX_COUNTER_VAL - 1'h1;


И тут хорошо бы комментариев разъясняющих что происходит. Сходу сложно понять.
Но в целом кажется легче добавить отдельный параметр для второго счетчика.
dsmv
Рядовой
Группа: Проверенные
Сообщений: 2
Репутация: 0
Статус: Offline
 
Перед описанием модуля не хватает строчки

Код
#SV
`default_nettype none


После описания модуля также не хватает:

Код
#SV
`default_nettype wire


Эти строчки предотвращают ряд глупых ошибок
drakonof
Рядовой
Группа: Модераторы
Сообщений: 2
Репутация: 1
Статус: Offline
 
Спасибо за ответы) очень круто)

Цитата zlobec ()
Инкремент в SV блокирующий.

Это плохо? Вроде так и задумывал)

Цитата evgeniybolnov ()
Чисто из любопытства: в чем сакральный смысл в SPEED_GRADE, а точнее то условие, в котором используется?

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

Цитата KeisN13 ()
Ну комментов не хватает в коде это явно, хотя бы по параметрам

Да, я не особый фанат коментить код. В моем мире, если переменная/модуль/функция... не даёт своего четкого понимания о цели своего существования, то просто имя подобрано не правильно. На мой не профессиональный взгляд коменты нужны для описания тонких моментов кода, не больше. Хотя описания в шапке модуля явно не хватает)

Цитата andrewkushchenko ()
Лучше использовать bit или logic. Ведь может быть только 2 состояния? со строкой можно опечататься

Спасибо, исправлю, так действительно будет лучше.
Цитата andrewkushchenko ()
Но в целом кажется легче добавить отдельный параметр для второго счетчика.

Да)

Цитата dsmv ()
После описания модуля также не хватает:

Тоже добавлю)
  • Страница 1 из 1
  • 1
Поиск:
ePN