Корзина

0 Товары - 0.00 RUB
В корзину

Курсы Валют

Курсы Валют  Дата ЦБ
Нал.USD
17.01 56.39
Нал.EUR
17.01 69.02
Нал.CNY
17.01 87.61

Оплата

visa

Реклама

Verilog

Первая программа на Verilog. Введение.

Введение

Если Вы обратитесь к любой книге по языкам программирования, то неизменно обнаружите что она начинается с программы "Hello World"; как только Вы её записали, вы можете быть уверены, что теперь сможете написать на этом языке.

Я тоже хочу показать Вам как написать программу  "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') 

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

 

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

Hello World by Deepak

 

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

vcount.gif

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
  37. // Если на входе reset логическая единица, мы загружаем в выход счетчика нули (4'b0000)
  38. if (reset == 1'b1) begin
  39. counter_out <= #1 4'b0000;
  40. end
  41. // Если на входе reset ноль, мы увеличиваем содержание счетчика
  42. else if (enable == 1'b1) begin
  43. counter_out <= #1 counter_out + 1;
  44. end
  45. end // Конец блока счетчика
  46.  
  47. end // Коней модуля счетчика

 

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

Всякий числовой счетчик, не важно простой или сложный, должен быть оттестирован. Для определения логики счетчика, мы должны определить логику счетчика времени и сброса. Пока счетчик не установлен, необходимо переключаем его в режим установки и проверяем волновой фронт счетчика времени, чтобы убедиться в прравильности счета. Это делается средствами Verilog.

vcount_tb.gif

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. reset = 0; // задание начального пуска
  15. #5 reset = 1; // подтверждение сброса
  16. #10 reset = 0; // повторное подтверждение сброса
  17. #10 reset = 1; // подтверждение пуска
  18. #100 reset = 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

 


time clk reset enable counter

0      1     0     0     xxxx
5      0     1     0     xxxx
10     1     1     0     xxxx
11     1     1     0     0000
15     0     0     0     0000
20     1     0     0     0000
25     0     0     1     0000
30     1     0     1     0000
31     1     0     1     0001
35     0     0     1     0001
40     1     0     1     0001
41     1     0     1     0010
45     0     0     1     0010
50     1     0     1     0010
51     1     0     1     0011
55     0     0     1     0011
60     1     0     1     0011
61     1     0     1     0100
65     0     0     1     0100
70     1     0     1     0100
71     1     0     1     0101
75     0     0     1     0101
80     1     0     1     0101
81     1     0     1     0110
85     0     0     1     0110
90     1     0     1     0110
91     1     0     1     0111
95     0     0     1     0111
100    1     0     1     0111
101    1     0     1     1000
105    0     0     1     1000
110    1     0     1     1000
111    1     0     1     1001
115    0     0     1     1001
120    1     0     1     1001
121    1     0     1     1010
125    0     0     0     1010

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

vcount_sim.gif

Перевод

Вход

Или классический вход:

Время

Карта сайта Визуальная электроника Полезные ссылки сайта Визуальная электроника