(Prog) Генератор Verilog из таблиц истинности для сумматоров по модулю
Материал из Модулярная арифметики
Версия от 11:29, 11 марта 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