Генератор Verilog для прямого преобразователя в базис вида (2
n
-1, 2
n
, 2
n
+1)
Выберите n для формулы 2^n (от 3 до 43):
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Максимальное значение на входе:
Прямой преобразователь для базиса: (7, 8, 9). Значение на входе [0;503)
module forward_converter (x, x_mod9, x_mod8, x_mod7); input [8:0] x; output [3:0] x_mod9; output [2:0] x_mod8; output [2:0] x_mod7; wire [2:0] B1; wire [2:0] B2; wire [2:0] B3; wire [2:0] tmp7; wire [3:0] tmp9; assign B3 = x[2:0]; assign B2 = x[5:3]; assign B1 = x[8:6]; assign x_mod8 = B3; mod_add #(7, 3) add1 (tmp7, B1, B3); mod_add #(7, 3) add2 (x_mod7, B2, tmp7); mod_add #(9, 4) add3 (tmp9, {1'b0, B1}, {1'b0, B3}); mod_sub #(9, 4) add4 (x_mod9, {1'b0, B2}, tmp9); endmodule module mod_add (data_out, data_A, data_B); parameter p = 5; parameter NBRB =3; output reg [NBRB-1:0] data_out; input [NBRB-1:0] data_A, data_B; always @(data_A or data_B) begin if ({1'b0,data_A} + {1'b0,data_B} < p) data_out <= {1'b0,data_A} + {1'b0,data_B}; else data_out <= {1'b0,data_A} + {1'b0,data_B} - (p); end endmodule module mod_sub (data_out, data_A, data_B); parameter p = 5; parameter NBRB =3; output reg [NBRB-1:0] data_out; input [NBRB-1:0] data_A, data_B; always @(data_A or data_B) begin if(data_B >= data_A) data_out<= {1'b0,data_B} - {1'b0, data_A}; else data_out<= {1'b0,data_B} - {1'b0,data_A} +(p); end endmodule module atest_bench(); reg [8:0] x; wire [3:0] x1; wire [2:0] x2; wire [2:0] x3; integer i, j, k, l, m, n; reg dummy; integer fori; forward_converter r1(x, x1, x2, x3); initial begin for (fori = 0; fori <= 503; fori = fori + 1) begin x = fori; #1 dummy = 1; l = fori%9; m = fori%8; n = fori%7; $display ("!!! Input = (%d) Res = (%d, %d, %d) Expect = (%d, %d, %d)", fori, x1, x2, x3, l, m, n); i = x1; j = x2; k = x3; if (i != l || j != m || k != n) begin $display ("!!! Error (%d, %d, %d, %d)!!!", fori, i, j, k); end #1 dummy = 1; end end endmodule
На главную