(Prog) Генератор Verilog из таблиц истинности для сумматоров по модулю
Материал из Модулярная арифметики
Содержание
Описание
Генератор Verilog из таблиц истинности. Умеет минимизировать частовстречающиеся термы. Если одинаковых пар термов больше THOLD (по умолчанию = 30), то они объединяются с помощью отдельного assign.
Source
- Исходник на языке C (Версия 1)
- Исходник на языке C (Версия 2) - добавлены умножители и запись промежуточных вариантов.
Входные данные
Минимизированная или полная таблица истинности в формате CSV
Пример (сумматор по модулю 5)
A0,A1,A2,B0,B1,B2,,X0,X1,X2 0,0,0,1,X,X,,1,0,0 X,0,1,X,1,1,,1,0,0 X,1,1,X,0,1,,1,0,0 X,1,0,X,1,0,,1,0,0 1,X,X,0,0,0,,1,0,0 1,X,X,1,X,X,,0,1,0 X,0,1,X,0,1,,0,1,0 X,1,0,0,0,X,,0,1,0 X,0,0,X,1,1,,0,1,0 0,0,X,X,1,0,,0,1,0 X,1,1,X,0,0,,0,1,0 1,X,X,1,X,X,,0,0,1 X,1,0,1,X,X,,0,0,1 1,X,X,X,1,0,,0,0,1 0,0,0,X,X,1,,0,0,1 X,1,1,X,1,1,,0,0,1 X,X,1,0,0,0,,0,0,1 X,1,0,X,0,1,,0,0,1 X,0,1,X,1,0,,0,0,1
Выходные данные
Verilog для сумматора
Пример (сумматор по модулю 5)
// Sum modulo 5
module sum_modulo_5 (A, B, X);
input [2:0] A;
input [2:0] B;
output[2:0] X;
assign X[2] = (~A[2]&~A[1]&~A[0]& B[2]) | (~A[1]& A[0]& B[1]& B[0]) | ( A[1]& A[0]&~B[1]& B[0]) | ( A[1]&~A[0]& B[1]&~B[0]) | ( A[2]&~B[2]&~B[1]&~B[0]);
assign X[1] = ( A[2]& B[2]) | (~A[1]& A[0]&~B[1]& B[0]) | ( A[1]&~A[0]&~B[2]&~B[1]) | (~A[1]&~A[0]& B[1]& B[0]) | (~A[2]&~A[1]& B[1]&~B[0]) | ( A[1]& A[0]&~B[1]&~B[0]);
assign X[0] = ( A[2]& B[2]) | ( A[1]&~A[0]& B[2]) | ( A[2]& B[1]&~B[0]) | (~A[2]&~A[1]&~A[0]& B[0]) | ( A[1]& A[0]& B[1]& B[0]) | ( A[0]&~B[2]&~B[1]&~B[0]) | ( A[1]&~A[0]&~B[1]& B[0]) | (~A[1]& A[0]& B[1]&~B[0]);
endmodule
module atest_bench();
reg [2:0] in1;
reg [2:0] in2;
wire [2:0] out;
integer i, j, l, m, t;
reg dummy;
wire complete;
integer fori, forj;
sum_modulo_5 sm1(in1, in2, out);
initial
begin
for (fori = 0; fori < 5; fori = fori + 1)
begin
for (forj = 0; forj < 5; forj = forj + 1)
begin
in1 = fori;
in2 = forj;
m = (fori + forj) % 5;
#1 dummy = 1;
$display ("!!! IN1=(%d) IN2=(%d) Res=(%d) Expect=(%d)", fori, forj, out, m);
l = out;
if (l != m)
begin
$display ("!!! Error (%d, %d)!!!", l, m);
end
#1 dummy = 1;
end
end
end
endmodule