Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

4-битный счетчик

4-битный счетчик начинает увеличиваться с 4'b0000 до 4'h1111, а затем возвращается к 4'b0000. Он будет продолжать считать до тех пор, пока у него есть работающие часы, а сброс удерживается на высоком уровне.

Ролловер происходит, когда отбрасывается самый старший бит последнего добавления. Когда счетчик достигает максимального значения 4'b1111 и получает еще один запрос на подсчет, счетчик пытается достичь 5'b10000, но, поскольку он может поддерживать только 4 бита, MSB будет отброшен, что приведет к 0.

	0000
	0001
	0010
	...
	1110
	1111
	       rolls over
	0000
	0001
	...

Конструкция содержит два входа, один для часов, а другой для сброса с активным низким уровнем. Сброс с активным низким уровнем — это когда схема сбрасывается, когда значение вывода сброса равно 0. Существует 4-битный выходной сигнал, который по существу предоставляет значения счетчика.

Дизайн электронного счетчика

  
  
module counter (  input clk,               // Declare input port for clock to allow counter to count up
                  input rstn,              // Declare input port for reset to allow the counter to be reset to 0 when required
                  output reg[3:0] out);    // Declare 4-bit output port to get the counter values

  // This always block will be triggered at the rising edge of clk (0->1)
  // Once inside this block, it checks if the reset is 0, if yes then change out to zero
  // If reset is 1, then design should be allowed to count up, so increment counter
  always @ (posedge clk) begin
    if (! rstn)
      out <= 0;
    else 
      out <= out + 1;
  end
endmodule

  

module счетчик имеет часы и активный низкий уровень сброса (обозначается n ) в качестве входных данных и значение счетчика в качестве 4-битного вывода. always блок всегда выполняется всякий раз, когда часы переходят от 0 к 1, что означает нарастающий фронт или положительный фронт. Выход увеличивается только в том случае, если сброс удерживается высоким или равным 1, что достигается с помощью if-else блокировать. Если при положительном фронте тактового импульса обнаруживается низкий уровень сброса, выход сбрасывается до значения по умолчанию 4'b0000.

Тестовый стенд

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

Модуль тестового стенда называется tb_counter. и порты не требуются, так как это верхний модуль в моделировании. Однако нам нужны внутренние переменные для генерации, хранения и управления часами и сбросом. Для этого мы объявили две переменные типа reg для часов и сброса. Нам также нужен wire введите net, чтобы установить соединение с выходными данными проекта, иначе по умолчанию будет использоваться 1-битная скалярная сеть.

Часы генерируются через always блок, который даст период в 10 единиц времени. initial Блок используется для установки начальных значений для наших внутренних переменных и передачи значения сброса в проект. Дизайн создан в тестовом стенде и подключен к нашим внутренним переменным, чтобы он получал значения, когда мы вводим их из тестового стенда. У нас нет $display в нашем тестовом стенде и, следовательно, мы не увидим никаких сообщений в консоли.

  
  
module tb_counter;
  reg clk;                     // Declare an internal TB variable called clk to drive clock to the design
  reg rstn;                    // Declare an internal TB variable called rstn to drive active low reset to design
  wire [3:0] out;              // Declare a wire to connect to design output

  // Instantiate counter design and connect with Testbench variables
  counter   c0 ( .clk (clk),
                 .rstn (rstn),
                 .out (out));

  // Generate a clock that should be driven to design
  // This clock will flip its value every 5ns -> time period = 10ns -> freq = 100 MHz
  always #5 clk = ~clk;

  // This initial block forms the stimulus of the testbench
  initial begin
    // 1. Initialize testbench variables to 0 at start of simulation
    clk <= 0;
    rstn <= 0;
    
    // 2. Drive rest of the stimulus, reset is asserted in between
    #20   rstn <= 1;                   
    #80   rstn <= 0;
    #50   rstn <= 1;
    
    // 3. Finish the stimulus after 200ns
    #20 $finish;
  end
endmodule

  
Журнал моделирования
ncsim> run
[0ns] clk=0 rstn=0 out=0xx
[5ns] clk=1 rstn=0 out=0x0
[10ns] clk=0 rstn=0 out=0x0
[15ns] clk=1 rstn=0 out=0x0
[20ns] clk=0 rstn=1 out=0x0
[25ns] clk=1 rstn=1 out=0x1
[30ns] clk=0 rstn=1 out=0x1
[35ns] clk=1 rstn=1 out=0x2
[40ns] clk=0 rstn=1 out=0x2
[45ns] clk=1 rstn=1 out=0x3
[50ns] clk=0 rstn=1 out=0x3
[55ns] clk=1 rstn=1 out=0x4
[60ns] clk=0 rstn=1 out=0x4
[65ns] clk=1 rstn=1 out=0x5
[70ns] clk=0 rstn=1 out=0x5
[75ns] clk=1 rstn=1 out=0x6
[80ns] clk=0 rstn=1 out=0x6
[85ns] clk=1 rstn=1 out=0x7
[90ns] clk=0 rstn=1 out=0x7
[95ns] clk=1 rstn=1 out=0x8
[100ns] clk=0 rstn=0 out=0x8
[105ns] clk=1 rstn=0 out=0x0
[110ns] clk=0 rstn=0 out=0x0
[115ns] clk=1 rstn=0 out=0x0
[120ns] clk=0 rstn=0 out=0x0
[125ns] clk=1 rstn=0 out=0x0
[130ns] clk=0 rstn=0 out=0x0
[135ns] clk=1 rstn=0 out=0x0
[140ns] clk=0 rstn=0 out=0x0
[145ns] clk=1 rstn=0 out=0x0
[150ns] clk=0 rstn=1 out=0x0
[155ns] clk=1 rstn=1 out=0x1
[160ns] clk=0 rstn=1 out=0x1
[165ns] clk=1 rstn=1 out=0x2
Simulation complete via $finish(1) at time 170 NS + 0	

Обратите внимание, что счетчик сбрасывается на 0, когда сброс активного низкого уровня становится равным 0, и когда сброс сбрасывается примерно через 150 нс, счетчик начинает отсчет со следующего появления положительного фронта тактового сигнала.

Схема оборудования


Verilog

  1. Подзарядка, сброс, перенастройка
  2. 3-битный двоичный счетчик
  3. Синхронные счетчики
  4. Модуль счетчика
  5. Счетчики звонков
  6. Конвергенция ИТ / ОТ:возможность культурного сброса
  7. Счетчик Python в коллекциях с примером
  8. Счетчик Verilog Mod-N
  9. Верилог Серый Счетчик
  10. Ошибки PID:сброс Windup