本文算是个草稿,以后再优化
使用rom读数据时,列如读图片时,需要遍历rom中的所有的值,此时需要注意以下几个信号
四个比较重要的信号,即rom的读使能信号rden,rom的读地址addr,rom的读数据有效信号,和rom的读出的数据。
module lcd_display(
input lcd_clk ,
input rst_n ,
input [10:0] pixel_xpos , //像素点横坐标
input [10:0] pixel_ypos , //像素点纵坐标
output [15:0] pixel_data ,
);
//parameter define
parameter H_DISP = 11'd480 ; //行有效数据
parameter V_DISP = 11'd272 ; //场有效数据
//图像的分辨率
parameter PIC_H = 11'd190 ;
parameter PIC_V = 11'd134 ;
//图像的起始坐标
parameter POS_X = (H_DISP - PIC_H)/2;
parameter POS_Y = (V_DISP - PIC_V)/2;
//rom的参数
parameter WIDTH = 16'd16 ;
parameter DEPTH = 16'd25460 ;
//空白区域的显示颜色
parameter WIRTE = 16'b11111_111111_11111;
//reg define
reg [15:0] addr ;
reg rom_valid ;
//wire define
wire rden ;
wire [15:0] rom_data ;
//rden:rom的读使能信号
assign rden = ((pixel_xpos >= POS_X) && (pixel_xpos < (POS_X + PIC_H))
&& (pixel_ypos >= POS_Y) && (pixel_ypos < (POS_Y + PIC_V))
? 1'b1 : 1'b0;
//addr:rom读地址
always @ (posedge lcd_clk or negedge rst_n) begin
if(!rst_n)
addr <= 16'd0;
else if(rden) begin
if(addr == DEPTH - 1'd1)
addr <= 16'd0;
else
addr <= addr + 1'd1;
end
else
addr <= 16'd0;
end
//rom_valid:读rom的数据有效信号
always @ (posedge lcd_clk or negedge rst_n) begin
if(!rst_n)
rom_valid <= 1'b0;
else
rom_valid <= rden;
end
//pixel_data:输出图像数据
assign pixel_data = (rom_valid == 1'b1) ? rom_data : WIRTE;
pic_rom pic_rom_inst (
.address (addr),
.clock (lcd_clk),
.rden (rden),
.q (rom_data)
);