реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> [LED-диод]-System Verilog, Мигание диода с интервалом в 1 секунду
Raven
сообщение Mar 9 2017, 15:26
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 465
Регистрация: 16-01-05
Из: Санкт-Петербург
Пользователь №: 1 987



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

Код
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


Комментарии и вопросы приветствуются, от кого бы ни исходили sm.gif.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 9 2017, 15:43
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 3 570
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Raven @ Mar 9 2017, 18:26) *
Уже слишком много слов сказано в этом треде. И надеюсь, определенный педагогический эффект от вопросов iosifk получен TC'ом. А теперь сделаем следующий шаг - тот же код, но улучшенный :-). С комментариями. Т.е., применим теперь методу "смотри и делай, как я" sm.gif. А если сможешь - делай даже лучше, чем я.

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

тогда уже до кучи и заголовок.
Например как у Ксайлинкса...

//-----------------------------------------------------------------------------
//
// 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


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Mar 9 2017, 15:57
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 912
Регистрация: 23-12-04
Пользователь №: 1 643



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

Цитата(Raven @ Mar 9 2017, 18:26) *
Комментарии и вопросы приветствуются, от кого бы ни исходили sm.gif.

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

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


Успехов! Rob.
Go to the top of the page
 
+Quote Post
Ensider
сообщение Mar 11 2017, 05:44
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 8-03-17
Из: Россия,Москва
Пользователь №: 95 746



Цитата(iosifk @ Mar 8 2017, 14:33) *
Сначала забудьте слово "программирование".
В микроконтроллере - фиксированная структура железа, а прядок работы записан программой в памяти.
В ПЛИС нет программы. И нет фиксированной структуры. Именно ее Вы и описываете. А вот то, как будет себя вести ПЛИС зависит от описания и входных сигналов...
Поэтому методика разработки тут другая совершенно.


Написал я в итоге более менее исполняемый код.И проверил его в Module Sim составив Тестбенч. Теперь основная проблема состоит в самой схеме ,как определить у неё где находится пин ,который отвечает за светодиод ,где пин который отвечает за тактовый генератор?
Диод:LED[1] : 84 : output : 2.5 V : : 5 : Y
Тактовый генератор:ADC_CLC 12
Верно?

Сообщение отредактировал Ensider - Mar 11 2017, 06:35
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 11 2017, 08:38
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 785
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Ensider @ Mar 11 2017, 08:44) *
Теперь основная проблема состоит в самой схеме ,как определить у неё где находится пин ,который отвечает за светодиод ,где пин который отвечает за тактовый генератор?
Пины назначаются разработчиком (то есть вами) в соответствии со схемой электрической принципиальной.
Go to the top of the page
 
+Quote Post
Ensider
сообщение Mar 11 2017, 08:57
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 8-03-17
Из: Россия,Москва
Пользователь №: 95 746



Цитата(andrew_b @ Mar 11 2017, 08:38) *
Пины назначаются разработчиком (то есть вами) в соответствии со схемой электрической принципиальной.

Я понимаю.Просто хочу удостовериться , что я правильно указал их.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2017 - 08:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016