§ В чем интерес
Сегодня я попробую сконвертировать код Verilog на JS и проверить, что из этого получится.§ Исходный код на верилоге
module vga ( input clock, output [1:0] r, output [1:0] g, output [1:0] b, output hs, output vs, output reg [12:0] address, input [ 7:0] data, input [10:0] cursor ); reg [9:0] x = 10'b0; reg [8:0] y = 9'b0; // Мерцания reg flash = 1'b0; reg [ 3:0] ticker = 1'b1; // Временные регистры reg [7:0] rmask; // Маска из знакогенератора reg [7:0] rcolor; // Рисуемый цвет reg [7:0] tdata; // Временный байт wire xborder = x == 10'd799; wire yborder = y == 9'd448; wire visible = x >= 48 && x < 48+640 && y >= 35 && y <= 35+400; // Горизонтальная и вертикальная синхронизация assign hs = x < 48+640+16; assign vs = y >= 35+400+12; // Выравнивание wire [9:0] xv = x - 40; // Не 48, а 40, из-за конвейерного метода wire [8:0] yv = y - 35; // А здесь 35 // Итоговый пиксель wire pix = rmask[ ~xv[2:0] ]; // Если =0, то цвет букв становится цветом фона wire enfore = ~(flash & rcolor[7]); // Номер знакоместа от 0 до 1999 wire [10:0] cplace = yv[8:4]*80 + xv[9:3]; wire acursor = (cursor + 1 == cplace) & (yv[3:0] >= 4'hE); // Вычисление цвета wire [ 3:0] curcolor = (pix & enfore) | (acursor & flash) ? rcolor[3:0] : rcolor[6:4]; wire [ 5:0] outcolor = // RR GG BB curcolor == 4'h0 ? 6'b00_00_00 : // Черный curcolor == 4'h1 ? 6'b00_00_01 : // Синий curcolor == 4'h2 ? 6'b00_01_00 : // Зеленый curcolor == 4'h3 ? 6'b00_01_01 : // Бирюзовый curcolor == 4'h4 ? 6'b01_00_00 : // Красный curcolor == 4'h5 ? 6'b01_00_01 : // Пурпурный curcolor == 4'h6 ? 6'b01_01_00 : // Коричневый curcolor == 4'h7 ? 6'b10_10_10 : // Светло-серый curcolor == 4'h8 ? 6'b01_01_01 : // Темно-серый curcolor == 4'h9 ? 6'b00_00_11 : // Ярко-синий curcolor == 4'hA ? 6'b00_11_00 : // Ярко-зеленый curcolor == 4'hB ? 6'b00_11_11 : // Голубой curcolor == 4'hC ? 6'b11_00_00 : // Ярко-красный curcolor == 4'hD ? 6'b11_00_11 : // Розовый curcolor == 4'hE ? 6'b11_11_00 : // Желтый 6'b11_11_11; // Белый assign {r, g, b} = visible ? outcolor : 6'b00_00_00; always @(posedge clock) begin x <= xborder ? 1'b0 : x + 1'b1; y <= xborder && yborder ? 1'b0 : (xborder ? y + 1'b1 : y); /* verilator lint_off CASEINCOMPLETE */ case (xv[2:0]) // Запрос символа 3'h0: begin address <= {cplace, 1'b0}; end // Сохранить символ в tdata, запрос цвета (соседний байт) 3'h1: begin address[0] <= 1'b1; tdata <= data; end // Запрос знакогенератора, сохранение цвета 3'h2: begin address <= {1'b1, tdata, yv[3:0]}; tdata <= data; end // Новые значения для конвейера 3'h7: begin rmask <= data; rcolor <= tdata; end endcase if (xborder && yborder) begin ticker <= ticker + 1'b1; flash <= ticker ? flash : ~flash; end end endmodule
28 янв, 2023
© 2007-2023 Правда в том, что Алиса плывет в космосе