N-битный двунаправленный сдвиговый регистр на Verilog: проект и реализация
В цифровой технике сдвиговый регистр — каскад триггеров, где выход q одного соединён с входом d следующего. Все триггеры работают от общего такта, поэтому битовый массив сдвигается на одну позицию за такт. Пример: 5-битный регистр со значением 10110 и входом 0 даст 01011, затем 00101.
Проект
Параметризованный модуль с параметром MSB (разрядность). Пять входов: d (данные), clk (такт), en (разрешение), dir (направление: 0 — вправо, 1 — влево), rstn (активный низкий сброс). Выход out — текущее состояние регистра.
module shift_reg #(parameter MSB=8) (
input d, clk, en, dir, rstn,
output reg [MSB-1:0] out
);
always @(posedge clk)
if (!rstn) out <= 0;
else begin
if (en) case (dir)
0: out <= {out[MSB-2:0], d}; // сдвиг вправо, d входит в MSB
1: out <= {d, out[MSB-1:1]}; // сдвиг влево, d входит в LSB
endcase
else out <= out;
end
endmodule
Аппаратная схема
Тестбенч
Проверка функциональности: инстанцирование 16-битного регистра, генерация такта 50 МГц, последовательность стимулов: сброс, включение, чередование данных при сдвиге вправо, смена направления, чередование данных при сдвиге влево, пассивный сдвиг.
module tb_sr;
parameter MSB = 16;
reg data, clk, en, dir, rstn;
wire [MSB-1:0] out;
shift_reg #(MSB) sr0 (.d(data), .clk(clk), .en(en), .dir(dir), .rstn(rstn), .out(out));
always #10 clk = ~clk;
initial begin
clk <= 0; en <= 0; dir <= 0; rstn <= 0; data <= 1'b1;
end
initial begin
rstn <= 0; #20 rstn <= 1; en <= 1;
repeat (7) @(posedge clk) data <= ~data;
#10 dir <= 1;
repeat (7) @(posedge clk) data <= ~data;
repeat (7) @(posedge clk);
$finish;
end
initial $monitor("rstn=%0b data=%b en=%0b dir=%0b out=%b", rstn, data, en, dir, out);
endmodule
Результат симуляции (фрагмент)
rstn=0 data=1 en=0 dir=0 out=xxxxxxxxxxxxxxxx rstn=1 data=1 en=1 dir=0 out=0000000000000000 rstn=1 data=0 en=1 dir=0 out=0000000000000001 rstn=1 data=1 en=1 dir=0 out=0000000000000010 rstn=1 data=0 en=1 dir=0 out=0000000000000101 ... rstn=1 data=1 en=1 dir=1 out=1111110101010000 Simulation complete via $finish(1) at time 430 NS
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство математических функций Verilog для эффективного аппаратного дизайна
- Мастерство $timeformat в Verilog: точность и контроль отображения времени
- Понимание и печать timescale в Verilog в любой области видимости