Как правильно получить доступ к ПЗУ: 1-Port - PullRequest
0 голосов
/ 14 апреля 2019

Вместо использования $ readmemh для чтения различных больших файлов / помещения данных в 16-битные регистры (что использует большинство моих логических элементов), я пытаюсь выяснить, как получить доступ к памяти ПЗУ для отображения изображения VGA 10x10 пикселей. по размеру (как простой пример). Я создал файл MIF и использовал IP Catalog-> On-Chip Memory для создания модуля ROM: 1-Port. Теперь я застрял в том, что делать дальше, и не могу найти простых простых примеров в интернете, показывающих, как это сделать.

Я включил в свои верхние регистры модуля и провода в отношении моего модуля ПЗУ. Я не знаю, как подключить часы / clk к модулю и получить данные из «q», который затем используется для получения значений RGB из цветовой палитры

reg [6:0] address;
reg clock;
wire [15:0] q;
Spriterom u1(
    address,
    clock,
    q);

initial clock=0;`

'always@(posedge clk)
begin
    if((H_SCAN > HZSYNC+HBACK_PORCH) && (V_SCAN > VTSYNC+VBACK_PORCH) && (H_SCAN < HZSYNC+HBACK_PORCH+HACTIVE+1) && (V_SCAN < VTSYNC+VBACK_PORCH+VACTIVE+1))
        begin
            if((H_SCAN > HZSYNC+HBACK_PORCH+100) && (V_SCAN > VTSYNC+VBACK_PORCH+50) && (H_SCAN < HZSYNC+HBACK_PORCH+110+1) && (V_SCAN < VTSYNC+VBACK_PORCH+60+1))
            begin
                                // I know this is not right to use q[clock]
                red <= pal_memory[q[clock]*3]>>3;
                green <= pal_memory[(q[clock]*3)+1]>>2;
                blue <= pal_memory[(q[clock]*3)+2]>>3;
                clock <= clock + 1;
                if(clock == 100)
                   clock<=0;
                end
            else
                begin
                    red <= 0;
                    green <= 0;
                    blue <= 0;
                end
        end
else
        begin
            red <= 0;
            green <= 0;
            blue <= 0;
        end
end         

Вместо того, чтобы видеть 10-цветную раздетую коробку, я вижу синюю коробку 10х10 пикселей. После того, как я скомпилировал проект, общее количество битов памяти составляет 4 / 423,936 (<1%) </p>

EDIT: Я использую плату разработки Altera Cyclone IV (EP4CE10F17C8) и версию 18.1 Quartus Prime Lite. Каталог IP - это Megawizard, который я использовал в Quartus Prime для создания ПЗУ для хранения данных из файла MIF.

Это код, который я использовал для чтения файла .txt, содержащего 16-битные значения. Читается другой файл, содержащий цвета палитры RGB. Цвета палитры, относящиеся к пикселю, затем отправляются на монитор.

`timescale 1ns / 1ps
module VGA640x480(clk, reset, red, green, blue, vsync,hsync);
input clk,reset;
output vsync,hsync;
output reg [4:0] red;
output reg [5:0] green;
output reg [4:0] blue;  

reg axdir=1;
reg aydir=1;

//-------------------------------
// VGA 800x600 Horizontal Values
//-------------------------------
parameter HTOTAL=1040;
parameter HZSYNC=120;
parameter HBACK_PORCH=64;
parameter HACTIVE=800;
parameter HFRONT_PORCH=56;
reg [10:0] H_SCAN; 
reg HPOLARITY;

//-----------------------------
// VGA 800x600 Vertical Values
//-----------------------------
parameter VTOTAL=666;
parameter VTSYNC=6;
parameter VBACK_PORCH=23;
parameter VACTIVE=600;
parameter VFRONT_PORCH=37;
reg [10:0] V_SCAN;
reg VPOLARITY;

reg [15:0] my_memory [0:3479]; 
initial $readmemh("Cloud.txt", my_memory); // 87 x 40 = 3480

reg [15:0] pal_memory [0:383]; //16 bits wide: 3 (R G B) x 128 colours = 384
initial $readmemh("Sprpal.txt", pal_memory);
integer j;

//-----------------------------
// Horizontal Timings
//-----------------------------
always@(posedge clk)
begin
    //Horizontal Sync
    if(H_SCAN < HZSYNC)
        HPOLARITY <= 0;
    else 
        HPOLARITY <= 1;

    //End of line
    if(H_SCAN == HTOTAL)
        H_SCAN <= 0;
    else 
        H_SCAN <= H_SCAN + 1'b1;
end
assign hsync = HPOLARITY;

//-----------------------------
// Vertical Timings
//-----------------------------
always@(posedge clk)
begin
    //Vertical Sync
    if(V_SCAN < VTSYNC)
        VPOLARITY <= 0;
    else 
        VPOLARITY <= 1;

    //Bottom of screen
    if(H_SCAN == HZSYNC + HBACK_PORCH + HACTIVE)
        if(V_SCAN == VTOTAL)
            V_SCAN <= 0;
    else 
        V_SCAN <= V_SCAN + 1;
end
assign vsync = VPOLARITY;

always@(posedge clk)
begin

if((H_SCAN > HZSYNC+HBACK_PORCH) && (V_SCAN > VTSYNC+VBACK_PORCH) && (H_SCAN < HZSYNC+HBACK_PORCH+HACTIVE+1) && (V_SCAN < VTSYNC+VBACK_PORCH+VACTIVE+1))
    begin

    if((H_SCAN > HZSYNC+HBACK_PORCH+100) && (V_SCAN > VTSYNC+VBACK_PORCH+50) && (H_SCAN < HZSYNC+HBACK_PORCH+187+1) && (V_SCAN < VTSYNC+VBACK_PORCH+90+1))

            begin
                red <= pal_memory[my_memory[j]*3]>>3;
                green <= pal_memory[(my_memory[j]*3)+1]>>2;
                blue <= pal_memory[(my_memory[j]*3)+2]>>3;
                j <= j + 1;
                if(j == 3479)
                j<=0;
            end

    end
else
        begin
            red <= 0;
            green <= 0;
            blue <= 0;
        end
end             
endmodule

Надеюсь, это поможет вам понять, что я пытаюсь сделать (отобразить изображение на мониторе VGA), и я правильно отформатировал код

...