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

Материал из Модулярная арифметики
(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «== Описание == Генератор Verilog из таблиц истинности. Умеет минимизировать частовстречающие…»)
 
 
Строка 3: Строка 3:
  
 
== Source ==
 
== Source ==
[http://vscripts.ru/res/sources/2013/verilog-generator-from-tables-sum-by-mod.c Исходник на языке C]
+
* [http://vscripts.ru/res/sources/2013/verilog-generator-from-tables-sum-by-mod.c Исходник на языке C (Версия 1)]
 +
* [http://vscripts.ru/res/sources/2013/verilog-generator-from-tables-sum-by-mod-ver2.c Исходник на языке C (Версия 2)] - добавлены умножители и запись промежуточных вариантов.
  
 
== Входные данные ==
 
== Входные данные ==

Текущая версия на 10:20, 8 апреля 2013

Содержание

[править] Описание

Генератор 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

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

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