-
Notifications
You must be signed in to change notification settings - Fork 3
/
3.v
136 lines (107 loc) · 2.82 KB
/
3.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
`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 offset_RX_OVERSAMPLE_RATE = 13;
localparam ENABLED_BAUD_CLOCK_STEPS = 17;
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)
);
defparam uart1.RX_OVERSAMPLE_RATE = offset_RX_OVERSAMPLE_RATE;
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)
);
defparam uart2.RX_OVERSAMPLE_RATE = offset_RX_OVERSAMPLE_RATE;
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'b10001010;
$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);
#550
txStart_1 = 1'b0;
$display("%7.2fms | tx start: %d", $realtime/10000, txStart_1);
end
14: 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
en_1 = 1'b0;
#2400
$finish();
end
endmodule