`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 10:50:17 04/27/2022 // Design Name: // Module Name: ascii_test // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module ascii_test( input wire clk, input wire video_on, input wire [9:0] x, input wire [9:0] y, output reg [7:0] rgb, input wire [7:0] ascii ); wire [10:0] rom_addr; wire [7:0] rom_data; wire [7:0] ram_data; wire [11:0] ascii_char; wire [3:0] char_row; wire [2:0] bit_addr; wire ascii_bit; wire ascii_bit_on; ascii_rom rom(.clk(clk), .addr(rom_addr), .data(rom_data)); //vga_rom VGAbuff(.clk(~clk), .addr(ascii_char[4:0]), .data(ram_data), .broj1(broj1), .broj2(broj2), .rez(rez)); vga_ram VGAbuff ( .clka(~clk), // input clka .wea(1'b1), // input [0 : 0] wea .addra(12'b0), // input [11 : 0] addra .dina(ascii), // input [7 : 0] dina .clkb(~clk), // input clkb .addrb(ascii_char), // input [11 : 0] addrb .doutb(ram_data) // output [7 : 0] doutb ); // potrebno je generisati adrese koje ce iscitati svih 2400 lokacija iz VGA bafera // tj potreban nam je opseg od 0 do 2399 // ne mozemo koristiti x[2:0] jer to koristimo za selekciju piksela po sirini fonta // mozemo poceti od x[3] je je to bit koji se inkrementuje nakon svakih 8 piksela // sa x[9:3] mozemo adresirati 100 karaktera (80 je vidljivo) // svaki put kada ispisemo 16 redova potrebno je dodati 80 na x[9:3] da bi se adresirao red karaktera ispod // zato ne mozemo koristiti y[3:0] jer to koristimo za selekciju reda fonta (svaki ffont ima 16 redova) // mozemo poceti od y[4] jer je to bit koji se inkrementuje svakih 16 redova // formula je adresa = 80*y[8:4] + x[9:3] // pokusati naci resenje koje ne ukljucuje mnozenje, donji red nece raditi zato sto se ne uvecava za 80, 2*80, 4*80... // assign ascii_char = (80 << y[8:4]) - 80 + x[9:3]; assign ascii_char = 80*y[8:4] + x[9:3]; assign char_row = y[3:0]; assign bit_addr = x[2:0]; assign rom_addr = {ram_data[6:0],char_row}; assign ascii_bit = rom_data[~bit_addr]; assign ascii_bit_on = ((x >= 0 && x < 640) && (y >= 0 && y < 480)) ? ascii_bit : 1'b0; // ispisujemo 2400 karaktera (8*2400) always @* if(~video_on) rgb <= 8'b0; else if(ascii_bit_on) rgb <= 8'b11; //rgb <= ram_data; //rgb <= rom_data; //rgb <= x[7:0]; //rgb <= y[7:0]; //rgb <= ascii_char[7:0]; //rgb <= ascii_char[11:4]; //rgb <= {y[7:4],x[6:3]}; //rgb <= {1'b0,y[9:3]}; else rgb <= 8'b11111111; endmodule