// Объявление модуля module your_project_name // Статические параметры. Наподобе template в C++ #(parameter WIDTH=16) // Объявление интерфейса модуля. Входные и выходные линии, их имена и типы. ( // тактовый сигнал. одноразрядная входная логическая линия input clock, // Три входа данных a, b и c. Логические вектора размера WIDTH. input [WIDTH-1:0] data_a, input [WIDTH-1:0] data_b, input [WIDTH-1:0] data_c, // Сигнал асинхронного выхода output [WIDTH-1:0] result_async, // Сигнал синхронного выхода. (синхронизирован по тактовому сигналу clock) output [WIDTH-1:0] result_sync ); // Объявление линий разрядностью WIDTH. Просто передаёт сигнал. Меняет своё значение мгновенно. Не хранит данных. wire [WIDTH-1:0] a_and_b; wire [WIDTH-1:0] a_and_b_or_c; // Объявление регистра разрядностью WIDTH. Меняет значение только по фронту тактового сигнала. // Хранит последнее присвоенное значение от присвоения до присвоения. reg [WIDTH-1:0] result_sync_reg; // Асинхронное присвоение линии a_and_b логического выражения (data_a "И" data_b). // Теперь линия a_and_b всегда будет равна логическому произведению (data_a "И" data_b). // a_and_b меняет своё значение мгновенно, по изменении значения любого из сигналов, от которых зависит. assign a_and_b = data_a & data_b; // Ещё два присвоения. assign a_and_b_or_c = a_and_b | data_c; assign result_async = a_and_b_or_c; // Синхронный процесс. Содержит Псевдо-последовательный код, который выполняется только по фронту clock. (posedge clock). Так же бывает (negedge clock) // Код может содержать ряд присвоений, условные операторы, циклы и т.д. // Синхронный процесс не обязан полностью сводиться к полной таблице истинности. // При компиляции, те части, по которым можно построить полную таблицу истиннсти, выносятся в отдельный асинхронный процесс. // Остальное же компилируется в массивы триггеров (регистры), синхронизированные по соответствующему тактовому сигналу. // Присваиваться внутри такого процесса могут только переменные-регистры Reg. always @(posedge clock) begin result_sync_reg <= a_and_b_or_c; end // Ещё одно асинхронное присвоение. assign result_sync = result_sync_reg; endmodule