1 | `include "rom.v"
|
2 | `include "ram.v"
|
3 |
|
4 | module vga_text_rs232(
|
5 | input clock,
|
6 | output hsync,
|
7 | output vsync,
|
8 | output reg [3:0] red,
|
9 | output reg [3:0] green,
|
10 | output reg [3:0] blue,
|
11 | output reg [7:0] led_g,
|
12 | input reset,
|
13 | input RXD
|
14 | );
|
15 |
|
16 | parameter rcv_bit_per = 2604; //19200 Buad
|
17 | parameter half_rcv_bit_per = 1302;
|
18 |
|
19 | //--State Definitions--
|
20 | parameter ready = 2'b00;
|
21 | parameter start_bit = 2'b01;
|
22 | parameter data_bits = 2'b10;
|
23 | parameter stop_bit = 2'b11;
|
24 |
|
25 | wire clk;
|
26 | wire [7:0] char;
|
27 | wire [7:0] dat;
|
28 | wire [9:0] charLin;
|
29 |
|
30 | wire h_enable;
|
31 | wire v_enable;
|
32 | wire vid_enable;
|
33 | wire CounterXmaxed;
|
34 | wire CounterYmaxed;
|
35 |
|
36 | reg [16:0] qc;
|
37 | reg [32:0] cnt;
|
38 | reg Pixel;
|
39 | reg [9:0] CounterX; // 10 Bit, range 0..799
|
40 | reg [9:0] CounterY; // 10 Bit, range 0..524
|
41 | reg [11:0] Basis; // Adr. Zeilenanfang
|
42 | reg [6:0] Offs; // Pos. in Zeile
|
43 | reg [11:0] ZPos; // effektive Zeichenpos. in BWS
|
44 | reg [11:0] write_address;
|
45 | reg [7:0] dat_w;
|
46 | reg we;
|
47 |
|
48 | reg [12:0] counter, n_counter;
|
49 | reg [3:0] data_bit_count, n_data_bit_count;
|
50 | reg [7:0] rcv_sr, n_rcv_sr;
|
51 | reg [1:0] state, n_state;
|
52 |
|
53 | rom myRom (.addr_a(charLin), .clk(clk), .q_a(dat)); // Zeichensatz
|
54 | ram myRam (.q(char), .read_address(ZPos), .clk(clk),.write_address(write_address), .d(dat_w),.we(we)); // Bildspeicher
|
55 |
|
56 | assign CounterXmaxed = (CounterX==800);
|
57 | assign CounterYmaxed = (CounterY==525);
|
58 |
|
59 | always @(posedge clock)
|
60 | begin
|
61 | qc <= qc + 1;
|
62 | end
|
63 | // 50Mhz 2^1 = 25MHz
|
64 | assign clk = qc[0];
|
65 |
|
66 | always @(posedge clock)
|
67 | begin
|
68 | if(rcv_sr >=32)
|
69 | begin
|
70 | if(write_address < 2399 )
|
71 | begin
|
72 | we=1;
|
73 | write_address=write_address+1;
|
74 | dat_w=rcv_sr;
|
75 | led_g=rcv_sr;
|
76 | end
|
77 | else
|
78 | write_address=0;
|
79 | end
|
80 | end
|
81 |
|
82 | always @(posedge clk) begin
|
83 | // Zählen in horizontaler Richtung
|
84 | if(CounterXmaxed)
|
85 | CounterX <= 0;
|
86 | else begin
|
87 | CounterX <= CounterX + 1;
|
88 | if (dat & (1 << CounterX[2:0]))
|
89 | Pixel <= 1;
|
90 | else
|
91 | Pixel <= 0;
|
92 | end
|
93 |
|
94 | // Zählen in vertikaler Richtung
|
95 | if(CounterXmaxed) begin
|
96 | if (CounterYmaxed) CounterY <= 0;
|
97 | else CounterY <= CounterY + 1;
|
98 | end
|
99 |
|
100 | if (CounterX[2:0] == 0) begin
|
101 | if (CounterX == 0 && CounterY == 0) Basis <= 0;
|
102 | else if (CounterX == 0 && CounterY[3:0]==0) Basis <= Basis + 80;
|
103 | end
|
104 |
|
105 | Offs <= CounterX[9:3];
|
106 | ZPos <= Basis + Offs;
|
107 | end
|
108 |
|
109 | always @(posedge clk)
|
110 | begin
|
111 | if (vid_enable==1 && Pixel == 1)
|
112 | begin
|
113 | red = 4'b1111;
|
114 | blue = 4'b1111;
|
115 | green = 4'b1111;
|
116 | end
|
117 | else
|
118 | begin
|
119 | red = 4'b0000;
|
120 | blue = 4'b1111;
|
121 | green = 4'b0000;
|
122 | end
|
123 | end
|
124 |
|
125 | assign hsync = (CounterX < 655) || (CounterX > 751);
|
126 | assign vsync = (CounterY < 489) || (CounterY > 491);
|
127 |
|
128 | assign charLin = {char,CounterY[3:1]}; // Zeiger fuer Zeichensatz
|
129 |
|
130 | // Filter für video enable ableiten
|
131 | assign h_enable = (CounterX > 4 && CounterX < 640);
|
132 | assign v_enable = (CounterY < 480);
|
133 | assign vid_enable = h_enable && v_enable;
|
134 |
|
135 | always @(state, RXD, counter, data_bit_count) begin
|
136 | n_rcv_sr <= rcv_sr;
|
137 | n_counter <= counter;
|
138 | n_state <= state;
|
139 | n_data_bit_count <= data_bit_count;
|
140 |
|
141 | case (state)
|
142 | ready:
|
143 | begin
|
144 | if(RXD == 0) begin
|
145 | n_state <= start_bit;
|
146 | n_counter <= counter + 1;
|
147 | end
|
148 | else begin
|
149 | n_state <= ready;
|
150 | n_counter <= 0;
|
151 | n_data_bit_count <= 0;
|
152 | end
|
153 | end
|
154 |
|
155 | start_bit: begin
|
156 |
|
157 | if(counter == half_rcv_bit_per) begin
|
158 | n_state <= data_bits;
|
159 | n_data_bit_count <= data_bit_count + 1;
|
160 | n_counter <= 0;
|
161 | end
|
162 | else begin
|
163 | n_state <= start_bit;
|
164 | n_counter <= counter + 1;
|
165 | end
|
166 | end
|
167 |
|
168 | data_bits:
|
169 | begin
|
170 | if(counter == rcv_bit_per) begin
|
171 | n_rcv_sr <= {RXD,rcv_sr[7:1]};
|
172 | n_data_bit_count <= data_bit_count + 1;
|
173 | n_counter <= 0;
|
174 | if(data_bit_count == 8)
|
175 | n_state <= stop_bit;
|
176 | end
|
177 | else
|
178 | n_counter <= counter + 1;
|
179 | end
|
180 |
|
181 | stop_bit:
|
182 | begin
|
183 | n_counter <= counter + 1;
|
184 | if(counter == rcv_bit_per)
|
185 | n_state <= ready;
|
186 | end
|
187 | endcase
|
188 | end
|
189 |
|
190 | always @(posedge clock or posedge reset) begin
|
191 | if(reset == 1) begin
|
192 | state <= ready;
|
193 | rcv_sr <= 0;
|
194 | counter <= 0;
|
195 | data_bit_count <= 0;
|
196 | end
|
197 | else begin
|
198 | state <= n_state;
|
199 | rcv_sr <= n_rcv_sr;
|
200 | counter <= n_counter;
|
201 | data_bit_count <= n_data_bit_count;
|
202 | end
|
203 | end
|
204 |
|
205 | endmodule
|