summaryrefslogtreecommitdiff
path: root/ntoa.sv
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ntoa.sv83
1 files changed, 83 insertions, 0 deletions
diff --git a/ntoa.sv b/ntoa.sv
new file mode 100644
index 0000000..c55c9e6
--- /dev/null
+++ b/ntoa.sv
@@ -0,0 +1,83 @@
1module ntoa
2 #( BITS = 8
3 )
4 ( input bit clk
5 , input bit reset
6
7 , output bit n_ready
8 , input bit n_valid `define n_valid $past(n_valid)
9 , input bit [BITS-1:0] n_data `define n_data $past(n_data)
10
11 , input bit a_ready `define a_ready $past(a_ready)
12 , output bit a_valid
13 , output bit [7:0] a_data
14 );
15
16bit bcd_ready;
17bit bcd_valid;
18bit [b2b.DIGITS-1:0][b2b.BASE_BITS-1:0] bcd_data;
19
20bin2bcd
21 #( .BITS(BITS)
22 , .BASE(10)
23 ) b2b
24 ( .clk(clk)
25 , .reset(reset)
26
27 , .bin_ready(n_ready)
28 , .bin_valid(n_valid)
29 , .bin_data(n_data)
30
31 , .bcd_ready(bcd_ready)
32 , .bcd_valid(bcd_valid) `define bcd_valid $past(bcd_valid)
33 , .bcd_data(bcd_data) `define bcd_data $past(bcd_data)
34 );
35
36bit bcd_b_valid;
37bit [b2b.DIGITS-1:0][b2b.BASE_BITS-1:0] bcd_b_data;
38
39bit [$clog2(b2b.DIGITS):0] work;
40
41always_ff @(posedge clk) begin
42 if (reset) begin
43 a_valid = 0;
44 bcd_ready = 0;
45 bcd_b_valid = 0;
46 end else begin
47 if (bcd_ready && `bcd_valid) begin
48 bcd_b_valid = 1;
49 bcd_b_data = `bcd_data;
50 // verilator lint_off WIDTH
51 work = b2b.DIGITS;
52 // verilator lint_on WIDTH
53 for (int i = b2b.DIGITS; i > 1; i = i - 1) begin
54 if (bcd_b_data[b2b.DIGITS-1] != 0) break;
55 bcd_b_data = { bcd_b_data[b2b.DIGITS-2:0], {b2b.BASE_BITS{1'b0}} };
56 work = work - 1;
57 end
58 end
59
60 if (`a_ready) a_valid = 0;
61 if (!a_valid && bcd_b_valid) begin
62 if (work != 0) begin
63 a_valid = 1;
64 // verilator lint_off WIDTH
65 if (bcd_b_data[b2b.DIGITS-1] < 10)
66 a_data = "0" + bcd_b_data[b2b.DIGITS-1];
67 else
68 a_data = "a" + bcd_b_data[b2b.DIGITS-1] - 10;
69 // verilator lint_off WIDTH
70 bcd_b_data = { bcd_b_data[b2b.DIGITS-2:0], {b2b.BASE_BITS{1'b0}} };
71 work = work - 1;
72 end else begin
73 a_valid = 1;
74 a_data = ",";
75 bcd_b_valid = 0;
76 end
77 end
78
79 bcd_ready = !bcd_b_valid;
80 end
81end
82
83endmodule