(Prog) Генератор Verilog из таблиц истинности для сумматоров по модулю

Материал из Модулярная арифметики
Версия от 07:20, 8 апреля 2013; Turbo (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Описание

Генератор Verilog из таблиц истинности. Умеет минимизировать частовстречающиеся термы. Если одинаковых пар термов больше THOLD (по умолчанию = 30), то они объединяются с помощью отдельного assign.

Source

Входные данные

Минимизированная или полная таблица истинности в формате 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