1.start_end_vga模块介绍
除了上一篇博客的paly模块,游戏还需要设置start、end、speed模块,状态转移图如下:
前段的h_cnt、v_cnt、vga_hs、vga_vs信号跟前面play_vga的一样,不再赘述。
因为start和end和speed的逻辑是大致一致的,都是在使能信号到来时读出一张mif图片,区别只在于要在VGA上显示的图片内容,这里我们调用三个ROM,将三者的不同图片存在各自的ROM里,分别设计各自的ROM_top模块,即可重复引用该start_end_vga模块用作start、end和speed了。如下图
2.ROM图片生成与读取
为了减少读取图片的数据量,这里只用一张100*100分辨率的图片即可,意思意思就行了。
故有10000个像素点的数据,rom 的位宽设置为 8,深度设置为 10000。
以rom_start_top为例:
需要注意的是, rom 设置时,勾选了‘q’ output port,所以== rom 的数据输出会延迟2拍==,这个地方要注意,自己可以仿真看看现象!!
可以看出:
rom_rd_en 比 Hor_Addr_Time 区域提前了 3 个时钟周期,所以rom_rd_data 比Hor_Addr_Time 区域只提前了 1 个时钟周期(rom 输出延时 2 拍)。
然后 vga_r/vga_g/vga_b 获取 rom_rd_data 数据需要消耗一拍,所以最终vga_r/vga_g/vga_b 数据与 Hor_Addr_Time 区域正好对齐。
fpga 代码编写最重要的就是时序对齐,要精确到一个时钟周期!!!
rom_rd_en生成
//在显示屏上正中间显示100*100的图像
//rom读出数据有两拍延时,再加上rom_rd_en对start_area打了一拍,所以需要提前3拍
//v_cnt是多周期的,所以不用提前
assign rom_rd_en = (h_cnt >= Hor_Start - 3 + 270 && h_cnt < Hor_Start - 3 + 370 && v_cnt >= Ver_Start + 190 && v_cnt < Ver_Start + 290);
//start_area_r
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
rom_rd_en_r <= 2'b0;
end
else begin
rom_rd_en_r <= {rom_rd_en_r[0],rom_rd_en};
end
end
图片mif文件数据读出,数据拼接输出方式到后面mif文件生成的部分再细说
//vga_r,vga_g,vga_b
always @(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)begin
vga_r <= 5'd0;
vga_g <= 6'd0;
vga_b <= 5'd0;
end
else if(rom_rd_en_r[1])begin
vga_r <= {rom_rd_data[7:5],2'h0};//高3位+两个0
vga_g <= {rom_rd_data[4:2],3'h0};
vga_b <= {rom_rd_data[1:0],3'h0};
end
else begin
vga_r <= 5'd0;
vga_g <= 6'd0;
vga_b <= 5'd0;
end
end
3. ROM_top模块
只要根据 rom_rd_en 信号产生 rom_addr并且例化 rom ip 即可。
//依次读出1byte数据,读出数据量计数cnt
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt <= 0;
end
else if(add_cnt)begin
if(end_cnt)
cnt <= 0;
else
cnt <= cnt + 1;
end
end
assign add_cnt = rom_rd_en;
assign end_cnt = add_cnt && cnt == ADDR_END-1;
assign rom_addr = cnt;
//rom
rom_start rom_start_inst(
.address (rom_addr ),
.clock (clk ),
.q (rom_rd_data )
);
此外
rom_end和相应的rom_end_top、start_end_vga_inst_end,
rom_speed和相应的rom_speed_top、start_end_vga_inst_speed都是一样的方法去设计,只是存入的mif图片不同
下一篇博客介绍如何设置图片分辨率,以及如何生成图片的mif文件并导入rom中