(Prog) Генератор Verilog из таблиц истинности для сумматоров по модулю
Материал из Модулярная арифметики
(Различия между версиями)
Turbo (обсуждение | вклад) (Новая страница: «== Описание == Генератор Verilog из таблиц истинности. Умеет минимизировать частовстречающие…») |
Turbo (обсуждение | вклад) |
||
Строка 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
- Исходник на языке 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