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