Почему мой 8-битный счетчик застрял на 0 или 255?

Я пытаюсь написать простой код Verilog по практическим соображениям. Я использую FPGA Cyclone 4. Мой 8-битный счетчик отлично работает с встроенными часами (50 МГц), но это слишком быстро, чтобы увидеть светодиоды на такой скорости, поэтому я сначала попытался замедлить часы с помощью этого:

module enableCounter(
    input clock_5,
    input reset,
    output reg enable_out);

    reg [3:0] counter;

    always @(posedge clock_5) begin
        if (reset) begin
            counter <= 4'b0000;
        end 
        else begin
            counter <= counter + 1;
            if (counter == 4'b0000)
                enable_out <= 1;
            else
                enable_out <= 0;
        end
    end

endmodule

Технически это установило бы выход enable_out на 1 только 8-ю часть времени clock_5. Для подсчета вверх и вниз я также написал эту функцию:

module updown_counter(
    input up_down,
    input clk,
    input enable,
    input reset,

    output reg [7:0] count_out);
    
    always @ (posedge clk) begin
        if (up_down == 0) begin                 // Count UP
            if (reset)
                count_out <= 8'b0000_0000;
            else if (enable && count_out == 8'b1111_1111)
                count_out <= 8'b0000_0000;
            else if (enable && count_out != 8'b1111_1111)
                count_out <= count_out + 8'b0000_0001;
            else
                count_out <= count_out;
        end
        
        else if (up_down == 1) begin            // Count DOWN
            if (reset)
                count_out <= 8'b1111_1111;
            else if (enable && count_out == 8'b0000_0000)
                count_out <= 8'b1111_1111;
            else if (enable && count_out != 8'b0000_0000)
                count_out <= count_out - 8'b0000_0001;
            else
                count_out <= count_out;
        end
    end            
endmodule

Ошибки компиляции нет. 8 светодиодов (подключенных к count_out) выключены и включаются, когда я нажимаю кнопку для сброса. Я также попытался изменить какое-то значение, например, направление вверх_вниз, просто чтобы проверить, не является ли это ошибкой кнопки, но получилось наоборот, что указывает на ошибку в моей программе (наверное?)

Отредактировано: Используя .bdf в Quartus, здесь показано подключение бортовых часов к pll-блоку, а затем к модулям:

@Mikef Я сделал это, используя файл .bdf в Quartus. Я отредактировал свой вопрос, если вы хотите взглянуть на это

johnny_1010 14.04.2023 17:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

из личного опыта: каждый раз, когда я пытаюсь пропустить часть testbench/sim, я дорого плачу. Просто так случилось на прошлой неделе.

В любом случае, даже 50/16 = 3,125 МГц все равно довольно быстро. Если у вас есть 8-битный счетчик, это даст 50 МГц/16/256 ≈ 12 кГц для самого медленного бита, если я не ошибаюсь. По крайней мере, мое зрение ограничено в лучшем случае несколькими изменениями Гц. Кстати, ваши полученные часы будут сильно несбалансированными (время включения-выключения от 20 до 300 нс), что часто нежелательно.

TL;DR: проверьте полученные частоты. Скорее всего, вам придется разделить часы еще дальше, чтобы увидеть изменения. Прямо сейчас текущие частоты обновления приведут только к затемнению светодиодов.

Обновлено:

здесь зашифрованный сим и результат - светодиоды должны переключаться, но слишком быстро, чтобы увидеть это, за исключением эффекта затемнения.

`timescale 1 ns / 1 ns

// Define Module for Test Fixture
module main_tf();

reg         clock_in;
reg         nrst;
wire        clock_en;
                    
// Instantiate the UUT - normally the main
updown_counter updown_counter_inst0(    
    .reset(~nrst),
    .clk(clock_in),
    .up_down(1'b1),
    .enable(clock_en)
    );

enableCounter enableCounter_inst1(
    .reset(~nrst),
    .clock_5(clock_in),
    .enable_out(clock_en)
    );


// Initialize Inputs
initial begin 
    clock_in = 0;
    nrst = 1;
    #5 nrst = 0;  
    #20 nrst = 1;  
end
    
always begin                            
    #20 clock_in = ~clock_in;      //magic happens here
end

endmodule // main_tf

Эй, спасибо! Я попробовал, как вы сказали, и получил гораздо лучший результат после деления частоты на 5e6, поэтому я получил 1 цикл / с с блоком PLL 50 МГц. Я также только учусь писать свои собственные тестовые стенды. Я сделал такой же, как ваш, и включил файлы в top_module точно так же, как вы определили его в своем тестовом стенде. Еще раз спасибо :)

johnny_1010 18.04.2023 22:46

Другие вопросы по теме