Визуальная электроника

Введение

Если посмотреть в любую книгу по программированию, то почти все они начинаются с программы "Hello World". Если вы написали такую программу, то можете быть уверены, что можете кое-что сделать на этом языке. Так что, я собираюсь показать, как написать такую программу на Verilog, перед тем, как приступить к программе счетчика.

Я тоже хочу показать Вам как написать программу  "hello world" , а затем разработать  "counter"  /счетчик/ в Verilog.

Программа "Hello World"

Verilog Code:
  1. //-----------------------------------------------------
  2. // “это моя первая программа в Verilog
  3. // Имя конструкции : hello_world
  4. // Имя файла : hello_world.v
  5. // Функция : Эта программа распечатает 'Hello World by Deepak'
  6. // Кодер : Deepak
  7. //-----------------------------------------------------
  8. module hello_world ;
  9.  
  10. initial begin
  11. $display ("Hello World by Deepak");
  12. #10 $finish;
  13. end
  14.  
  15. endmodule // Конец модуля hello_world

Слова в голубом цвете - комментарии, темно красном - зарезервированные слова. Любая программа в Verilog начинается с зарезервированного слова 'module' <module_name>. В выше представленном обзаце 8-я строка содержит модуль hello_world. (Примечание: Перед заявленным модулем у нас могут быть предписания пред-процессаора компилятора такие как 'include', 'define')

[Эти директивы играют ту же роль, что и в языке C) или микропроцессоры, содержащие тысячи транзисторов. Поэтому: in). Сclude включает содержимое внешних файлов, а defin). Сe представляет механизм замены текста.]

Строка 10 содержит начальный блок: этот блок выполняется только один раз после начала вычислений при time=0 (0ns). Этот блок содержит два предписания, содержащиеся в начале 10-й строки и в конце 13-той строки. В Verilog, если у Вас вставляется несколько строк в блоке, Вам необходимо указать "begin" и "end" /"начало" и "конец"/. Модуль заканчивается зарезервированным словом 'endmodule', в нашем случае - в строке 15.

 

Результат выполнения программы "Hello World"

Hello World by Deepak

 

Конструктивный блок счетчика

Clock

Тактовые импульсы

Reset

Логический сброс

Enable

Логическое включение

Counter

Счетчик

Counter out

Выход счетчика

 

Спецификация счетчика

  • 4-х бит синхронный счетчик.
  • Синхронный сброс с активным высоким уровнем сигнала.
  • Разрешающий сигнал с активным высоким уровнем.

 

Реализация счетчика

Verilog Code:
  1. //-----------------------------------------------------
  2. // Это моя вторая Конструкция в Verilog
  3. // Название Конструкции : first_counter (первый чсетчик)
  4. // Имя файла : first_counter.v
  5. // Функции : Это 4-х битовый суммирующий счетчик с
  6. // синхронным сбросом высокого уровня и
  7. // с разрешающим сигналом активного высокого уровня
  8. //-----------------------------------------------------
  9. module first_counter (
  10. clock , // запуск входа счетчика
  11. reset , // синхронный сброс с активным высоким уровнем сигнала
  12. enable , // Разрешающий сигнал для счетчика с активным высоким уровнем
  13. counter_out // 4-х битовый вектор выхода счетчика
  14. ); Конец списка портов
  15. //-------------Input Ports----------------------------- (порты ввода)
  16. input clock ;
  17. input reset ;
  18. input enable ;
  19. //-------------Output Ports----------------------------(порты ввода)
  20. output [3:0] counter_out ;
  21. //-------------Input ports Data Type-------------------(тип данных портов ввода)
  22. // По правилам - все порты ввода должны быть шинами
  23. wire clock ;
  24. wire reset ;
  25. wire enable ;
  26. //-------------Output Ports Data Type------------------(тип данных портов вывода)
  27. // Портами вывода могут быть ячейки памяти (reg) или шины
  28. reg [3:0] counter_out ;
  29.  
  30. //------------Отсюда начинается код -------------------------
  31. // Поскольку это счетчик с запуском по положительному фронту,
  32. //В список чувствительности блока, записанного ниже, добавляем положительный
  33. // фронт сигнала clock.
  34. always @ (posedge clock)
  35. begin : COUNTER // Имя блока
  36. // При каждом положительном фронте сигнала clock мы проверяем вход reset<br />// Если на входе reset логическая единица, мы загружаем в выход счетчика нули (4'b0000)
  37. if (reset == 1'b1) begin
  38. counter_out <= #1 4'b0000;
  39. end
  40. // Если на входе reset ноль, мы увеличиваем содержание счетчика
  41. else if (enable == 1'b1) begin
  42. counter_out <= #1 counter_out + 1;
  43. end
  44. end // Конец блока счетчика
  45.  
  46. end // Коней модуля счетчика

Модуль тестирование счетчика

Любая цифровая схема, независимо от ее сложности, должна проходить проверку правильности своей работы. Для счетчика необходимо иметь тактовый сигнал и логику сброса. После выхода счетчика из сброса, на вход разрешения подается разрешающий уровень и происходит проверка выходных сигналов на предмет правильности счета. Так делается на реальном счетчике и то же самое делается при помощи Verilog.

Test case

Тестовый случай

Clock gen

Генерация тактового импульса

Reset logic

Логический сброс

Enable logic

Логическое включение

Counter

Счетчик

Monitor/Checker

Монитор/устройство проверки

Рабочее окружение (тестбенч) для счетчика состоит из тактового генератора, управления сбросом, управления разрешением работы и логикой сравнения выхода с требуемыми значениями.

Verilog Code:
  1. `include "first_counter.v"
  2. module first_counter_tb();
  3. // Объявление ввода как регистра, а вывода как шины
  4. reg clock, reset, enable;
  5. wire [3:0] counter_out;
  6.  
  7. // Инициализация всех переменных
  8. initial begin
  9. $display ("time\t clk reset enable counter");
  10. $monitor ("%g\t %b %b %b %b",
  11. $time, clock, reset, enable, counter_out);
  12. clock = 1; // начальное значение тактов счетчика
  13. reset = 0; // задание начального значения сброса
  14. enable = 0; // задание начального сигнала разрешения
  15. #5 reset = 1; // активировать сброс
  16. #10 reset = 0; // деактивировать сброс
  17. #10 enable = 1; // активировать разрешение
  18. #100 enable = 0; // деактивировать разрешение
  19. #5 $finish; // завершить симуляцию
  20. end
  21.  
  22. // Генератор тактовых импульсов
  23. always begin
  24. #5 clock = ~clock; // переключение вывода clock каждые 5 тактов
  25. end
  26.  
  27. // Подключить проверяемое устройство
  28. first_counter U_counter (
  29. clock,
  30. reset,
  31. enable,
  32. counter_out
  33. );
  34.  
  35. endmodule
Code:
  1. <span style="color: black; font-size: small;">
  2. time clk reset enable counter
  3.  
  4. 0 1 0 0 xxxx
  5. 5 0 1 0 xxxx
  6. 10 1 1 0 xxxx
  7. 11 1 1 0 0000
  8. 15 0 0 0 0000
  9. 20 1 0 0 0000
  10. 25 0 0 1 0000
  11. 30 1 0 1 0000
  12. 31 1 0 1 0001
  13. 35 0 0 1 0001
  14. 40 1 0 1 0001
  15. 41 1 0 1 0010
  16. 45 0 0 1 0010
  17. 50 1 0 1 0010
  18. 51 1 0 1 0011
  19. 55 0 0 1 0011
  20. 60 1 0 1 0011
  21. 61 1 0 1 0100
  22. 65 0 0 1 0100
  23. 70 1 0 1 0100
  24. 71 1 0 1 0101
  25. 75 0 0 1 0101
  26. 80 1 0 1 0101
  27. 81 1 0 1 0110
  28. 85 0 0 1 0110
  29. 90 1 0 1 0110
  30. 91 1 0 1 0111
  31. 95 0 0 1 0111
  32. 100 1 0 1 0111
  33. 101 1 0 1 1000
  34. 105 0 0 1 1000
  35. 110 1 0 1 1000
  36. 111 1 0 1 1001
  37. 115 0 0 1 1001
  38. 120 1 0 1 1001
  39. 121 1 0 1 1010
  40. 125 0 0 0 1010
  41. </span>

Форма сигнала счетчика