(Prog) Генератор Verilog из таблиц истинности для сумматоров по модулю
Материал из Модулярная арифметики
Версия от 07:20, 8 апреля 2013; Turbo (обсуждение | вклад)
Содержание
Описание
Генератор 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