§ В чем интерес

Сегодня я попробую сконвертировать код 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 Человек без автомобиля - то же самое, что и человек без прав