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

Материал из Модулярная арифметики
(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «== Описание == Генератор Verilog из таблиц истинности. Умеет минимизировать частовстречающие…»)

Версия 11:29, 11 марта 2013

Содержание

Описание

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

Source

Исходник на языке C

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

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

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация