Skip to content

terminal (pt‐br)

Diogo Valadares Reis dos Santos edited this page Aug 26, 2025 · 1 revision

[English]

[← Página Anterior | Próxima Página →]

O Terminal

O Terminal é um componente que permite que texto seja exibido pela máquina sem a necessidade de renderizar cada caractere pixel a pixel, tornando-o ideal para exibir mensagens do sistema.

image

A interface do terminal é muito mais simples que a da tela. Ela requer apenas uma entrada ASCII de 7 bits, um sinal de clock e um sinal para limpar o terminal.

Para escrever no terminal em um programa, utilize a instrução de armazenamento de byte (sb). Como o terminal possui um buffer interno, apenas um endereço é necessário para escrever os dados. Para limpar o terminal, envie um sinal de escrita para o próximo endereço usando outra instrução sb.

Na interface da simulação em SystemVerilog, o terminal está localizado no lado direito da janela:

image

Código em SystemVerilog

No código SystemVerilog, o terminal funciona utilizando um registrador de deslocamento (shift register). Quando novos dados são escritos no primeiro registrador, os conteúdos existentes são deslocados para baixo no buffer. Ao escrever no arquivo externo, todo o buffer é salvo em formato hexadecimal, separado por bytes.

`timescale 1s/1s
module terminal #(
    parameter string TERMINAL_FILE = "terminal.mem"
)
// entradas e saídas
(
    input logic clock,
    input logic reset, // Sinal de reset adicionado
    input logic write,
    input logic [7:0] data
);
// registrador de deslocamento
    logic [7:0] buffer [0:63];

    always @(negedge clock) begin
        integer file_handle;
// lógica de reset
        if (reset) begin
            for (int i = 0; i < 64; i++) begin
                buffer[i] <= 8'd0;
            end
            file_handle = $fopen(TERMINAL_FILE, "w");
            if (file_handle != 0) begin
                $fclose(file_handle);
            end
        end
// lógica de escrita
        else if (write) begin
            // gera o registrador de deslocamento
            for (int i = 63; i > 0; i--) begin
                buffer[i] <= buffer[i-1];
            end
            buffer[0] <= data;

            // limpa o arquivo antes de escrever o novo conteúdo do buffer
            file_handle = $fopen(TERMINAL_FILE, "w");
            if (file_handle) begin
                foreach (buffer[i]) begin
                    $fdisplay(file_handle, "%h", buffer[i]);
                end
                $fclose(file_handle);
            end
        end
    end

endmodule

Clone this wiki locally