LFSR во FPGA — код на VHDL и VerilogКак работает линейный регистр сдвига с обратной связью внутри FPGALFSR (Linear Feedback Shift Register) — линейный регистр сдвига с обратной связью, полезный внутри FPGA. LFSR просты в синтезе: требуют мало ресурсов и работают на очень высоких частотах. Применения
Проект module single_port_sync_ram #( parameter ADDR_WIDTH = 4, parameter DATA_WIDTH = 32, parameter DEPTH = 16 )( input clk, input [ADDR_WIDTH-1:0] addr, inout [DATA_WIDTH-1:0] data, input cs, we, oe ); reg [DATA_WIDTH-1:0] tmp_data; reg [DATA_WIDTH-1:0] mem [DEPTH]; always
Сумматор — базовый компонент АЛУ процессора, используется для инкремента адресов, индексов, указателей. Полный сумматор учитывает входной перенос (Cin) и выдаёт сумму (Sum) и выходной перенос (Cout). Таблица истинности ABCinCoutSum 00000 00101 01001 01110 10001 10110 11010 11111
Что такое мультиплексор? Мультиплексор (mux) передаёт данные с одного из N входов на выход по управляющему сигналу sel. Для N=4 входов селектор 2-битный. Значения sel и соответствующие выходы: sel a b c d out 0 3 7 1 9 3 1 3 7 1 9 7 2 3 7 1 9 1 3 3 7 1 9 9 Две
Проект module pr_en ( input [7:0] a, b, c, d, input [1:0] sel, output reg [7:0] out ); always @(a or b or c or d or sel) begin if (sel == 2b00) out <= a; else if (sel == 2b01) out <= b; else if (sel == 2b10) out <= c; else out <= d; end endmodule Аппаратная схема Тестб
В цифровой технике сдвиговый регистр — каскад триггеров, где выход q одного соединён с входом d следующего. Все триггеры работают от общего такта, поэтому битовый массив сдвигается на одну позицию за такт. Пример: 5-битный регистр со значением 10110 и входом 0 даст 01011, затем 00101. Проект Пара
Проект module gray_ctr #(parameter N = 4) ( input clk, rstn, output reg [N-1:0] out ); reg [N-1:0] q; always @(posedge clk) begin if (!rstn) begin q <= 0; out <= 0; end else begin q <= q + 1; `ifdef FOR_LOOP for (int i = 0; i < N-1; i = i+1) out[i
Проект module modN_ctr #( parameter N = 10, parameter WIDTH = 4 )( input clk, rstn, output reg [WIDTH-1:0] out ); always @(posedge clk) begin if (!rstn) out <= 0; else if (out == N-1) out <= 0; else out <= out + 1; end endmodule Тестбенч module tb; parameter N = 10, WIDTH
Проект module johnson_ctr #(parameter WIDTH=4) ( input clk, rstn, output reg [WIDTH-1:0] out ); always @(posedge clk) begin if (!rstn) out <= 1; else begin out[WIDTH-1] <= ~out[0]; for (int i = 0; i < WIDTH-1; i = i+1) out[i] <= out[i+1]; end end endmodule
Проект module ring_ctr #(parameter WIDTH=4) ( input clk, rstn, output reg [WIDTH-1:0] out ); always @(posedge clk) begin if (!rstn) out <= 1; else begin out[WIDTH-1] <= out[0]; for (int i = 0; i < WIDTH-1; i = i+1) out[i] <= out[i+1]; end end endmodule Тес
Рипл-счётчик (asynchronous ripple counter) — асинхронный счётчик, где все триггеры, кроме первого, тактируются выходом предыдущего. Проект module dff ( input d, clk, rstn, output reg q, output qn ); always @(posedge clk or negedge rstn) if (!rstn) q <= 0; else q <= d; ass
4-битный счётчик инкрементируется от 4b0000 до 4h1111 и переполняется обратно в 0. Работает при наличии тактового сигнала и деактивированном сбросе. Переполнение происходит при отбрасывания старшего бита: при значении 4b1111 следующий инкремент даёт 5b10000, старший бит теряется, остаётся 0000. 00
Триггер захватывает данные по фронту такта. Защёлка (latch) не имеет тактового фронта — её выход следует за входом, пока вход разрешения (en) активен. Проект Защёлка с тремя входами (d — данные, rstn — активный низкий сброс, en — разрешение) и одним выходом q. Сброс активен при низком уровне. Выход
Проект module tff ( input clk, input rstn, input t, output reg q ); always @(posedge clk) begin if (!rstn) q <= 0; else if (t) q <= ~q; else q <= q; end endmodule Тестбенч module tb; reg clk, rstn, t; wire q; tff u0 (.clk(clk), .rstn(rstn), .t(t), .q(q));
D-триггер — последовательный элемент, захватывающий значение входа d по фронту тактового сигнала. Вариант 1: Асинхронный активный низкий сброс module dff ( input d, input rstn, input clk, output reg q ); always @(posedge clk or negedge rstn) if (!rstn) q <= 0; else q <= d
Проект module jk_ff ( input j, input k, input clk, output q ); reg q; always @(posedge clk) case ({j,k}) 2b00: q <= q; 2b01: q <= 0; 2b10: q <= 1; 2b11: q <= ~q; endcase endmodule Схема устройства Тестбенч module tb_jk; reg j, k, clk; wire q;
Лучший способ начать изучение — простейший пример «Hello World!». // Однострочные комментарии начинаются с // // Verilog-код всегда пишется внутри модулей module tb; // initial-блок используется для инициализации сигналов и переменных initial // $display — системная задача для вывода в конс
Verilog предоставляет системные задачи и функции для работы с файлами: открытия, записи значений, чтения данных в переменные и закрытия файлов. Открытие и закрытие файлов module tb; // Переменная для хранения дескриптора файла integer fd; initial begin // Открываем файл my_file.txt для за
Дефолтный timescale Хотя модулям Verilog ожидается наличие timescale перед модулем, симуляторы могут вставлять дефолтный timescale. Фактический timescale, применяемый в любой области иерархии, можно напечатать системной задачей $printtimescale, принимающей область (scope) как аргумент. module tb;
Директива `timescale задает единицу времени и точность для симуляций. Системная функция $timeformat управляет стилем отображения спецификатора %t в задачах отображения ($display, $strobe). Синтаксис $timeformat(<unit_number>, <precision>, <suffix_string>, <minimum field width&
Verilog
Освоение цикла нарезки резьбы Fanuc G76 на станках с ЧПУ: подробное руководство
Повышение эффективности CNC-проектов с помощью ценностного анализа и инженерии
Быстрый ремонт кожухов направляющих поддерживает бесперебойную работу Eaton Hydraulics
FRACAS: превращение отчетов об отказах в приросты надежности