-
Notifications
You must be signed in to change notification settings - Fork 3
/
4.v
162 lines (129 loc) · 3.47 KB
/
4.v
1
2
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
`timescale 100ns/1ns
`default_nettype none
`include "Uart8.v"
module test;
localparam CLOCK_FREQ = 12000000; // Alhambra board
localparam SIM_STEP_FREQ = 1 / 0.0000001 / 2; // this sim timescale 100ns
// for the simulation timeline:
// ratio SIM_STEP_FREQ MHz / CLOCK_FREQ MHz gives the output waveform in proper time
// (*but note all clocks and the timeline are approximate due to rounding)
localparam SIM_TIMESTEP_FACTOR = SIM_STEP_FREQ / CLOCK_FREQ;
localparam ENABLED_BAUD_CLOCK_STEPS = 14;
reg clk;
reg en_1;
reg en_2;
reg txStart_1;
reg txStart_2;
wire txBusy_1;
wire txBusy_2;
wire rxBusy_1;
wire rxBusy_2;
wire txDone_1;
wire txDone_2;
wire rxDone_1;
wire rxDone_2;
wire rxErr_1;
wire rxErr_2;
reg [7:0] txByte_1;
reg [7:0] txByte_2;
wire [7:0] rxByte_1;
wire [7:0] rxByte_2;
wire bus_wire_1_2;
wire bus_wire_2_1;
Uart8 #(.CLOCK_RATE(CLOCK_FREQ)) uart1(
.clk(clk),
// rx interface
.rxEn(en_2),
.rx(bus_wire_2_1),
.rxBusy(rxBusy_1),
.rxDone(rxDone_1),
.rxErr(rxErr_1),
.out(rxByte_1),
// tx interface
.txEn(en_1),
.txStart(txStart_1),
.in(txByte_1),
.txBusy(txBusy_1),
.txDone(txDone_1),
.tx(bus_wire_1_2)
);
Uart8 #(.CLOCK_RATE(CLOCK_FREQ)) uart2(
.clk(clk),
// rx interface
.rxEn(en_1),
.rx(bus_wire_1_2),
.rxBusy(rxBusy_2),
.rxDone(rxDone_2),
.rxErr(rxErr_2),
.out(rxByte_2),
// tx interface
.txEn(en_2),
.txStart(txStart_2),
.in(txByte_2),
.txBusy(txBusy_2),
.txDone(txDone_2),
.tx(bus_wire_2_1)
);
initial clk = 1'b0;
always #SIM_TIMESTEP_FACTOR clk = ~clk;
initial begin
integer t;
$dumpfile(`DUMP_FILE_NAME);
$dumpvars(0, test);
#600
en_1 = 1'b0;
txStart_1 = 1'b0;
#600
en_1 = 1'b1;
txByte_1 = 8'b01000101;
$display(" tx 1 data: %8b", txByte_1);
for (t = 0; t < ENABLED_BAUD_CLOCK_STEPS; t++) begin
// #1000 x 100ns == 0.1ms == 1 tx clock period (approximately) at 9600 baud
#1000
case (t)
1: begin
txStart_1 = 1'b1;
$display("%7.2fms | tx start: %d", $realtime/10000, txStart_1);
$display("%7.2fms | tx busy: %d, tx done: %d", $realtime/10000, txBusy_1, txDone_1);
$display("%7.2fms | rx 2 data: %8b", $realtime/10000, rxByte_2);
end
2: begin
txStart_1 = 1'b0;
$display("%7.2fms | tx start: %d", $realtime/10000, txStart_1);
end
13: begin
// output is ready
$display("%7.2fms | tx busy: %d, tx done: %d", $realtime/10000, txBusy_1, txDone_1);
$display("%7.2fms | rx 2 data: %8b", $realtime/10000, rxByte_2);
end
endcase
end
#600
txByte_1 = 8'b01111111;
$display(" tx 1 data: %8b", txByte_1);
for (t = 0; t < ENABLED_BAUD_CLOCK_STEPS; t++) begin
#1000
case (t)
1: begin
txStart_1 = 1'b1;
$display("%7.2fms | tx start: %d", $realtime/10000, txStart_1);
$display("%7.2fms | tx busy: %d, tx done: %d", $realtime/10000, txBusy_1, txDone_1);
$display("%7.2fms | rx 2 data: %8b", $realtime/10000, rxByte_2);
end
2: begin
txStart_1 = 1'b0;
$display("%7.2fms | tx start: %d", $realtime/10000, txStart_1);
end
13: begin
// output is ready
$display("%7.2fms | tx busy: %d, tx done: %d", $realtime/10000, txBusy_1, txDone_1);
$display("%7.2fms | rx 2 data: %8b", $realtime/10000, rxByte_2);
#400
en_1 = 1'b0;
end
endcase
end
#1400
$finish();
end
endmodule