网站开发asp,专门看网站的浏览器,网站开发前台后台,公众号开发者登录密码填哪个1.原理 场同步信号的单位是像素点 场同步信号的单位是一行 60的含义是每秒钟刷新60帧图像 全0表示黑色 2.1 CLK_gen.v
module CLK_gen(input wire sys_clk ,input wire sys_rst_n ,output wire CLK_out ,output wire locked
);parameter STATE1b0;
reg [1:0] cnt;
r…1.原理 场同步信号的单位是像素点 场同步信号的单位是一行 60的含义是每秒钟刷新60帧图像 全0表示黑色 2.1 CLK_gen.v
module CLK_gen(input wire sys_clk ,input wire sys_rst_n ,output wire CLK_out ,output wire locked
);parameter STATE1b0;
reg [1:0] cnt;
reg flag_clk;assign lockedSTATE;
assign CLK_outflag_clk;always(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n1b0)cnt2b0;else if(cnt2d1)cnt2b0;else cntcnt1b1;always(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n1b0)flag_clk1b0;else if(cnt2d1)flag_clk1b1;elseflag_clk1b0;endmodule
2.2 Vga_ctrl.v
module Vga_ctrl(input wire Vga_clk ,input wire sys_rst_n ,input wire [15:0] Pix_data ,output wire [9:0] Pix_x ,output wire [9:0] Pix_y , output wire [15:0] rgb ,output wire hsync ,output wire vsync
);parameter H_SYNC10d96 , H_BACK10d40 ,H_LEFT10d8 ,H_VALID10d640 ,H_RIGHT10d8 ,H_FRONT10d8 ,H_TOTAL10d800 ;parameter V_SYNC10d2 ,V_BACK10d25 ,V_TOP10d8 ,V_VALID10d480 ,V_BOTTOM10d8 ,V_FRONT10d2 ,V_TOTAL10d525;reg [9:0] Cnt_h;
reg [9:0] Cnt_v;
wire Rgb_valid;
wire pix_data_req;assign Rgb_valid(Cnt_hH_SYNCH_BACKH_LEFTCnt_hH_SYNCH_BACKH_LEFTH_VALIDCnt_vV_SYNCV_BACKV_TOPCnt_vV_SYNCV_BACKV_TOPV_VALID)?1b1:1b0;//这里为什么不减1呢,画个简单的图就知道了//因为前面的时间要满足H_SYNCH_BACKH_LEFT//有效信号是从他们之和加1开始计数的//比如Cnt_h10就是计数了11个//而H_SYNCH_BACKH_LEFT1235//所以前面要计满5个也就是计数到410-55刚好是大于等于5开始信号有效assign pix_data_req(Cnt_hH_SYNCH_BACKH_LEFT-1b1Cnt_hH_SYNCH_BACKH_LEFTH_VALID-1b1Cnt_vV_SYNCV_BACKV_TOPCnt_vV_SYNCV_BACKV_TOPV_VALID)?1b1:1b0;assign Pix_xpix_data_req?Cnt_h-(H_SYNCH_BACKH_LEFT-1b1):10h3ff;
assign Pix_ypix_data_req?Cnt_v-(V_SYNCV_BACKV_TOP):10h3ff;
//assign Pix_xRgb_valid?Cnt_h-(H_SYNCH_BACKH_LEFT):10d0;
//assign Pix_yRgb_valid?Cnt_v-(V_SYNCV_BACKV_TOP):10d0;
//这里也没有减1为什么呢
//同理Cnt_h是从0开始计数的假如Cnt_h10
//H_SYNCH_BACKH_LEFT1235
//那么此时的行坐标就等于10-55因为前面的0-4是5个周期
//如果此时在H_SYNCH_BACKH_LEFT的基础上减1的话
//那么10-46前面就是0-5等于6个时钟周期了时序不符合assign hsync(Cnt_hH_SYNC-1b1)?1b1:1b0;
assign vsync(Cnt_vV_SYNC-1b1)?1b1:1b0;
//为什么这里要减呢因为Cnt_h是从0开始计数的假如说计数到了10就是0-11
//假如行同步信号是2个时钟周期那么有效的就是第3个时钟周期也就是计数到1.
//举个例子就能看出是不是需要减了assign rgb(Rgb_valid1b1)?Pix_data:16d0;always(posedge Vga_clk or negedge sys_rst_n )if(sys_rst_n1b0)Cnt_h10d0;else if(Cnt_hH_TOTAL-1b1)Cnt_h10d0;elseCnt_hCnt_h1b1;always(posedge Vga_clk or negedge sys_rst_n )if(sys_rst_n1b0)Cnt_v10d0;else if((Cnt_vV_TOTAL-1b1)(Cnt_hH_TOTAL-1b1))Cnt_v10d0;else if(Cnt_hH_TOTAL-1b1)Cnt_vCnt_v1b1;elseCnt_vCnt_v;endmodule
2.3 tb_Vga_ctrl.v
module tb_Vga_ctrl();reg sys_clk;
reg sys_rst_n ;
reg[15:0] Pix_data ;wire [9:0] Pix_x ;
wire [9:0] Pix_y ;
wire [15:0]rgb ;
wire hsync ;
wire vsync ;
wire CLK_out ;
wire locked ;
wire rst_n;initial beginsys_clk1b1;sys_rst_n1b0;#20sys_rst_n1b1;end assign rst_n(sys_rst_nlocked);always#10 sys_clk~sys_clk;always(posedge CLK_out or negedge rst_n)if(rst_n1b0)Pix_data16h0000;else if (Pix_x10d0Pix_x10d639Pix_y10d0Pix_y10d479)Pix_data16hffff;elsePix_data16h0000;defparam CLK_gen_inst.STATE1b1; Vga_ctrl Vga_ctrl_inst(.Vga_clk (CLK_out) ,.sys_rst_n (rst_n),.Pix_data (Pix_data),.Pix_x (Pix_x ),.Pix_y (Pix_y ), .rgb (rgb ) ,.hsync (hsync ),.vsync (vsync )
);CLK_gen CLK_gen_inst(.sys_clk (sys_clk ) ,.sys_rst_n (sys_rst_n ),.CLK_out (CLK_out ) ,.locked (locked )
);endmodule 要显示1帧图像1s是60帧1帧就是0.0167s所以等于16.7ms 时钟正确25mhz锁定信号是拉高的表示锁定信号在高电平时时钟的输出有效因为若锁定信号为0那么复位信号就一直为0时钟就起不了作用。 复位信号为0数据就为0坐标信号大于等于0且小于一定范围就为全为白色ffff。否则就全为0。 完成一帧 场同步信号也正确。 这里有错。因为有效信号多记了一个时钟周期 因此这里要修改数据有效信号 现在计数正确了 修改时钟换成分频后的信号 还是有问题当数据有效时数据仍为0。说明数据滞后数据有效信号一个时钟周期所以得让数据提前一个时钟周期解决方法是增加一个数据请求信号比数据有效信号提前1时钟周期然后rgb刚好滞后数据请求信号一个时钟周期。就达到了rgb和数据有效信号同步得效果。 末尾没有问题原因是因为是时序逻辑修改代码 行可以超前但是场不用场超前就是超前一行了而行超前就是超前一个时钟周期。这里修改是要将pix_x超前一个时钟周期然后再pi_data滞后一个周期从而达到同步的效果 行计数器这里也要减1 请求信号确实超前有效信号一个时钟周期 末尾也正确 但是坐标还是不对 这下对了为什么要让括号里面的信号减1呢因为pix_data_req比数据有效信号提前了一个时钟周期如果按照原来的不减1那么坐标就会变小提前数据有效信号一个时钟周期要让坐标不变就得让计数得值变大所以减1。 数据和有效信号是同步的