Последовательностная логика
Введение в проектирование на языке Verilog
Прутьянов В. В.
Последовательностная логика
Цифровые схемы
Комбинационные
Последовательностные
Синхронные
Цифровые схемы
Комбинационные
Последовательностные
Синхронные
Последовательностная логика
SR-защелка (SR-latch)
R(t) | S(t) | Q(t+dt) |
0 | 0 | Q(t) |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | X |
D-защелка (D-latch, latch)
C(t) | D(t) | Q(t+dt) |
0 | X | Q(t) |
1 | 0 | 0 |
1 | 1 | 1 |
D-триггер (flip-flop)
представлено двумя D-защелками
CLK(t) | D(t) | Q(t+dt) |
0→1 | 0 | 0 |
0→1 | 1 | 1 |
0 | X | Q(t) |
1 | X | Q(t) |
GDS: D-flip-flop, D-latch, инвертор и NAND из PDK SKY130 High Density
Цифровые схемы
Комбинационные
Последовательностные
Синхронные
Синхронная логика
Синхронная логика
D-триггер в Verilog
reg q;
always @(posedge clk) begin
q <= d; // Non-blocking assignment
end
Неблокирующее присваивание в Verilog
reg a, b;�
always @(posedge clk) begin
a <= d;
b <= a;
end
D-триггер с асинхронным сбросом в Verilog
reg q;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
q <= 0;
else
q <= d;
end
Счетчик
m-1
1
2
0
...
Диаграмма состояний счетчика прямого счета
Пример: счетчик от 0 до 9
module counter10 (
input clk,
output [3:0] o_cnt
);
reg [3:0] cnt;
assign o_cnt = cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt <= 4'd0;
else
if (cnt == 4'd9)
cnt <= 4'd0;
else
cnt <= cnt + 4'd1;
end
endmodule
Пример: деление частоты
module clkdiv #(
parameter F0 = 50_000_000,
parameter F1 = 12_500_000
)(
input clk,
input rst_n,
output out
);
localparam CNT_WIDTH = $clog2(F0/F1);
reg [CNT_WIDTH-1:0] cnt;
assign out = &cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt <= {CNT_WIDTH{1'b0}};
else
cnt <= cnt + 1'b1;
end
endmodule
Регистровый файл
1RW регистровый файл 4x8
Массивы в Verilog/SystemVerilog
Пример: регистровый файл
module reg_file(
input wire clk,
input wire [3:0] i_rd_addr,
output wire [7:0] o_rd_data,
input wire [3:0] i_wr_addr,
input wire [7:0] i_wr_data,
input wire i_wr_en
);
reg [7:0] r[15:0]; // Unpacked array
assign o_rd_data = r[i_rd_addr];
always @(posedge clk) begin
if (i_wr_en) begin
r[i_wr_addr] <= i_wr_data;
end
end
endmodule
Сдвиговый регистр
Сдвиговый регистр на 4 бита
X₃
X₂
X₁
X₀
Последовательный
вывод 1 бита
Параллельный ввод 4 бит
0
Генерация псевдослучайных чисел: LFSR
23
…
XOR
LFSR: конфигурация Фибоначчи
24
# | 1 | 2 | 3 | ОС |
0 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 0 | 1 |
2 | 1 | 1 | 0 | 1 |
3 | 1 | 1 | 1 | 0 |
4 | 0 | 1 | 1 | 1 |
5 | 1 | 0 | 1 | 0 |
6 | 0 | 1 | 0 | 0 |
7 | 0 | 0 | 1 | 1 |
0
0
1
+
1
2
3
1
LFSR: конфигурация Галуа
25
# | 3 | 2 | 1 | ОС |
0 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 1 | 1 |
2 | 1 | 1 | 1 | 1 |
3 | 1 | 1 | 0 | 0 |
4 | 0 | 1 | 1 | 1 |
5 | 1 | 0 | 0 | 0 |
6 | 0 | 1 | 0 | 0 |
7 | 0 | 0 | 1 | 1 |
0
0
1
3
2
1
+
1
Синхронное FIFO
Синхронное FIFO
Бистабильный элемент: аналоговый подход
28
Бистабильный элемент: метастабильность
29
sky130_fd_sc_hd__inv_1.spice
D-latch: метастабильность
30
GATE DATA Q BUF(Q)
sky130_fd_sc_hd__dlxtp_1.spice
D-flip-flop: метастабильность
31
sky130_fd_sc_hd__dfxtp_2.spice
CLK DATA Q BUF(Q)
sky130_fd_sc_hd__dfxtp_2.spice
Метастабильность: причины возникновения
Метастабильность: цепи синхронизации
33
D-триггер со входом разрешения
reg q;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 0;
else if (en)
q <= d;
end
Задание