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

Уже слишком много слов сказано в этом треде. И надеюсь, определенный педагогический эффект от вопросов iosifk получен TC'ом. А теперь сделаем следующий шаг - тот же код, но улучшенный :-). С комментариями. Т.е., применим теперь методу "смотри и делай, как я" :). А если сможешь - делай даже лучше, чем я.

 

localparam int unsigned SYS_CLOCK_FREQ        = 50000000; // Частота CLK в герцах. Взял с потолка (50 MHz - часто используемый клок на DevBoard'ах).
localparam int unsigned LED_COUNTER_WIDTH  = $bits(SYS_CLOCK_FREQ/2); // $bits() дает кол-во битов для представления величины в скобках.

module Ensider(
    input wire              clock,  // Делаем отступы, ну, хотя бы 4 пробела, например
    output wire [7:0]    led      // Для лучшего зрительного восприятия кода
);

reg [LED_COUNTER_WIDTH-1:0]    cnt;
logic            timer_2Hz;  // Привнесем еще немного SystemVerilog специфики :) Пока намеренно оставим смесь вериложных и
                                    // системвериложных конструкций (это потом вам на домашнее задание останется - привести все в порядок)
logic            timer_1Hz;

always @(posedge clock) begin   // Привыкайте лучше сразу все вложенные блоки оформлять
                                                // в виде "begin .. end" блоков, даже для единственного оператора внутри
                                                // Это будет полезно при дальнейших модификациях кода - будет одной потенциальной ошибкой меньше

                                                // Reset части пока нет - за отстутсвием такого сигнала в вашем модуле. Жаль. Но опробуем пока без него

    if (cnt == (SYS_CLOCK_FREQ/2 - 1)) begin
        timer_2Hz <= 1'b1;                                  // Этот сигнал будет выставляться в лог.1 на 1 такт с периодом 1/(SYS_CLOCK_FREQ/2), т.е.,
        cnt           <= '0;                                     // с частотой 2 Гц. Счетчик cnt при этом сбрасывается.
    end
    else begin
        cnt           <= cnt+1;                               // В иных случаях счет разрешен,
        timer_2Hz <= 1'b0;                                // а сигнал таймера д.б. занулен.
    end
end

// Подключим все LED'ы, кроме старшего

//assign [color="#FF0000"]#1[/color] led = cnt[27:20];
      // #1 - эта часть оператора будет синтезатором проигнорирована напрочь, она, даже можно сказать, вредна при
      // написании кода, предназначенного для синтеза и последующего использования в FPGA (т.к. при симулировании
      // этого же кода #1 будет создавать вредное расхождение между реальным положением дел и симуляционной
      // картинкой).
      //  Поэтому ...
assign led[6:0] = cnt[LED_COUNTER_WIDTH-1 -: 7]; // Обратите внимание на эту конструкцию "[msb -: width]" - очень полезная вещь.
                                                                             // Она выбирает 7 битов, начиная от старшего.
                                                                             // У нее, кстати, есть "близкий родственник": [lsb +: width]

// Осталось применить счетчик-делитель на 2
always_ff @(posedge clock) begin
    if (timer_2Hz == 1'b1) begin
        timer_1Hz <= ~timer_1Hz;
    end
end

// И наконец - то, что вы хотели получить: сигнал с частотой 1 Гц. В данном случае на светодиоде led[7].
assign led[7] = timer_1Hz;

endmodule

 

Комментарии и вопросы приветствуются, от кого бы ни исходили :).

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


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

Уже слишком много слов сказано в этом треде. И надеюсь, определенный педагогический эффект от вопросов iosifk получен TC'ом. А теперь сделаем следующий шаг - тот же код, но улучшенный :-). С комментариями. Т.е., применим теперь методу "смотри и делай, как я" :). А если сможешь - делай даже лучше, чем я.

 

Комментарии и вопросы приветствуются, от кого бы ни исходили :).

тогда уже до кучи и заголовок.

Например как у Ксайлинкса...

 

//-----------------------------------------------------------------------------

//

// Copyright © 2009 Xilinx Inc.

//

// Project : Programmable Wave Generator

// Module : clk_div.v

// Parent : wave_gen.v

// Children : None

//

// Description:

// This module is a programmable divider use for generating the sample

// clock (clk_samp). It continuously counts down from pre_clk_tx-1 to

// 0, asserting en_clk_samp during the 0 count.

//

// To ensure proper reset of the FFs running on the derived clock,

// en_clk_samp is asserted during reset.

//

// Parameters:

//

// Notes :

// pre_clk_tx must be at least 2 for this module to work. Since

// it is not allowed to be <32 (by the parser), this is not a problem.

//

// Multicycle and False Paths

// None

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


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

Приветствую!

 

Комментарии и вопросы приветствуются, от кого бы ни исходили :).

Раз уж reset отсутствует то не мешало бы позаботится также о инициализации при симуляции.

Чтобы симулятор не посылал на "XXX" :)

 

...
/* synthesis translate_off */
initial begin
    timer_1Hz=1'b0;
    cnt={LED_COUNTER_WIDTH{1'b0}};
end
/* synthesis translate_on */
...

 

Успехов! Rob.

 

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


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

Сначала забудьте слово "программирование".

В микроконтроллере - фиксированная структура железа, а прядок работы записан программой в памяти.

В ПЛИС нет программы. И нет фиксированной структуры. Именно ее Вы и описываете. А вот то, как будет себя вести ПЛИС зависит от описания и входных сигналов...

Поэтому методика разработки тут другая совершенно.

 

Написал я в итоге более менее исполняемый код.И проверил его в Module Sim составив Тестбенч. Теперь основная проблема состоит в самой схеме ,как определить у неё где находится пин ,который отвечает за светодиод ,где пин который отвечает за тактовый генератор?

Диод:LED[1] : 84 : output : 2.5 V : : 5 : Y

Тактовый генератор:ADC_CLC 12

Верно?

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

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


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

Теперь основная проблема состоит в самой схеме ,как определить у неё где находится пин ,который отвечает за светодиод ,где пин который отвечает за тактовый генератор?
Пины назначаются разработчиком (то есть вами) в соответствии со схемой электрической принципиальной.

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


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

Пины назначаются разработчиком (то есть вами) в соответствии со схемой электрической принципиальной.

Я понимаю.Просто хочу удостовериться , что я правильно указал их.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...