我不是在使用$ readmemh来读取各种大文件/而是将数据放入16位寄存器(这使用了我的大多数逻辑元素),而是试图找出如何访问ROM存储器以显示10x10像素VGA图像的方法大小(作为一个简单示例)。我已经生成了一个MIF文件,并使用IP目录->片内存储器来创建ROM:1-端口模块。我现在只能继续下一步,在网上找不到任何简单明了的示例来说明如何做到这一点。
我已将有关ROM模块的顶部模块寄存器和接线包括在内。我不知道如何将时钟/ 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
我看到的是一个10x10像素的蓝色框,而不是看到一个10色的条纹框。在我编译了设计之后,总的内存位状态为4 / 423,936(<1%)
编辑: 我正在使用Altera Cyclone IV(EP4CE10F17C8)开发板和Quartus Prime Lite 18.1版。 IP目录是我在Quartus Prime中使用的Megawizard,用于创建ROM来保存MIF文件中的数据。
这是我用来读取包含16位值的.txt文件的代码。读取另一个包含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监视器上显示图像)并且我已经正确格式化了代码