【学习笔记】用uart控制vga

        工程目的,用uart控制vga。(简单提升了一下上一个工程)

        功能: 当输入A时才能开启数据往vga的ram中传输数据,并且uart不能控制vga开关状态。当计数到数据量最大值时,uart才能正常控制vga开关状态。当输入B时,将vga开启,正常显示(当先输入B再输入A一边更新vga图像数据一边图像显示)。当输入C时,将vga关闭。(A、B和C为16位数据)
              总体框图:(实际编写全部模块放顶层模块,这样画只是为了方便观看)

 

module uart_ctrl_vga(
	input		wire	clk_sys			,
	input		wire	rst_n_sys		,
	input		wire	rx					,	

	output	wire	[7:0]rgb		,
	output	wire	hsync			,
	output	wire	vsync			
);

//output uart_rx
	wire	[7:0]uart_po_data	;
	wire	uart_po_flag		;

//output ctrl
	wire	[15:0]	ram_addr	;
	wire	[7:0]	ctrl_po_data;
	wire	ctrl_po_flag		;
	wire	vga_on_off			;	

//output clk_divide
	wire	clk_vga				;

//output	vga_pic
	wire	[7:0]pix_data		;
	
//output	vga_ctrl			
	wire	[9:0]pix_x	;
	wire	[9:0]pix_y	;


uart_rx  uart_inst(
	.clk_sys			(clk_sys)	,
	.rst_n_sys		(rst_n_sys)	,
	.rx				(rx)			,
		
	.po_data	(uart_po_data),
	.po_flag			(uart_po_flag)
	);
	

ctrl		ctrl_inst(	
	.clk_sys				(clk_sys)		,
	.rst_n_sys			(rst_n_sys)		,
	.uart_po_data		(uart_po_data)	,
	.uart_po_flag		(uart_po_flag)	,
	
	.ram_addr			(ram_addr)		,
	.ctrl_po_data		(ctrl_po_data)	,
	.ctrl_po_flag		(ctrl_po_flag)	,
	.vga_on_off			(vga_on_off)	
);
	
clk_divide	clk_divide_inst(
	.clk_sys		(clk_sys),
	.rst_n_sys	(rst_n_sys),

	.clk_vga		(clk_vga)	

);
	

vga_pic	vga_pic_inst(
	.clk_vga		(clk_vga)		,
	.rst_n_sys	(rst_n_sys)		,
	.pix_x		(pix_x)			,
	.pix_y		(pix_y)			,
	.clk_sys		(clk_sys)		,
	.po_data		(ctrl_po_data)	,
	.po_flag		(ctrl_po_flag)	,
	.vga_on_off	(vga_on_off)	,
	.ram_addr	(ram_addr)		,

	.pix_data	(pix_data)	

);
	
vga_ctrl	vga_ctrl_inst(
	.clk_vga		(clk_vga)	,
	.rst_n_sys	(rst_n_sys)	,
	.pix_data	(pix_data)	,
	.vga_on_off	(vga_on_off),

	.rgb			(rgb)		,
	.pix_x		(pix_x)	,
	.pix_y		(pix_y)	,
	.hsync		(hsync)	,
	.vsync		(vsync)	
);


	
endmodule

 ctrl模块:

module ctrl(
	input	wire 	clk_sys					,
	input	wire	rst_n_sys				,
	input	wire	[7:0]	uart_po_data	,
	input	wire	uart_po_flag			,
	
	output	reg	[15:0]	ram_addr	,
	output	reg	[7:0]	ctrl_po_data,
	output	reg	ctrl_po_flag		,
	output	reg	vga_on_off			
);
	reg	[15:0]	ctrl_reg	;
	reg	[15:0]	flag_reg	;
	reg	addr_flag			;
	reg	addr_en				;
	
	parameter	A=16'd16351,
					B=16'd50408,
					C=16'd6036;

	parameter	addr_max='d2_500;
	
always@(posedge clk_sys	or negedge rst_n_sys)
	if(!rst_n_sys)
		ctrl_reg<=0												;	
	else	if(addr_en==1)								
		ctrl_reg<=ctrl_reg									;
	else	if(uart_po_flag==1)
		ctrl_reg<={ctrl_reg[7:0],uart_po_data[7:0]}	;
	else
		ctrl_reg<=ctrl_reg									;

always@(posedge clk_sys	or negedge rst_n_sys)
	if(!rst_n_sys)
		flag_reg<=0				;	
	else
		flag_reg<=ctrl_reg	;
		
always@(posedge clk_sys or negedge rst_n_sys)
	if(!rst_n_sys)
		addr_flag<=0	;
	else if(ctrl_reg==A && ctrl_reg!=flag_reg)
		addr_flag<=1	;
	else
		addr_flag<=0	;
	
always@(posedge clk_sys or negedge rst_n_sys)
	if(!rst_n_sys)
		addr_en<=0			;
	else	if(addr_flag)
		addr_en<=1			;
	else	if(ram_addr==addr_max)
		addr_en<=0			;
	else
		addr_en<=addr_en	;
			
always@(posedge clk_sys or negedge rst_n_sys)
	if(!rst_n_sys)
		ram_addr<=0				;
	else if(ram_addr==addr_max)
		ram_addr<=0				;
	else if(addr_en==1 && ctrl_po_flag==1)
		ram_addr<=ram_addr+1'b1	;
	else
		ram_addr<=ram_addr	;
		
always@(posedge clk_sys or negedge rst_n_sys)
	if(!rst_n_sys)begin
		ctrl_po_data<=0		;
		ctrl_po_flag<=0		;
		end
	else	if(addr_en)begin
		ctrl_po_data<=uart_po_data;
		ctrl_po_flag<=uart_po_flag;
		end
	else	begin
		ctrl_po_data<=0		;
		ctrl_po_flag<=0		;
		end
		
always@(posedge clk_sys or negedge rst_n_sys)
	if(!rst_n_sys)
		vga_on_off<=0				;
	else if(addr_en )
		vga_on_off<=vga_on_off	;
	else if(ctrl_reg==B)
		vga_on_off<=1				;
	else if(ctrl_reg==C)
		vga_on_off<=0				;
	else
		vga_on_off<=vga_on_off	;
	
endmodule	

vag_ctrl模块:

module	vga_ctrl(
	input	wire	clk_vga			,
	input	wire	rst_n_sys		,
	input	wire	[7:0]pix_data	,
	input	wire	vga_on_off		,
	
	output	reg	[7:0]rgb		,
	output	wire	[9:0]pix_x	,
	output	wire	[9:0]pix_y	,
	output	reg	hsync			,
	output	reg	vsync			
);

reg	[9:0]cnt_hsync	;
reg	[9:0]cnt_vsync	;
reg	rgb_vaild		;


always@(posedge clk_vga or negedge rst_n_sys	)
	if(~rst_n_sys)
		cnt_hsync<=10'd0				;
	else 	if(~vga_on_off)		
		cnt_hsync<=10'd0				;
	else if(cnt_hsync==10'd799)
		cnt_hsync<=10'd0				;
	else	
		cnt_hsync<=1'b1+cnt_hsync	;

always@(posedge clk_vga or negedge rst_n_sys	)
	if(~rst_n_sys)
		cnt_vsync<=10'd0				;
	else 	if(~vga_on_off)		
		cnt_vsync<=10'd0				;
	else	if(cnt_vsync==10'd524 && cnt_hsync==10'd799)
		cnt_vsync<=10'd0				;
	else	if(cnt_hsync==10'd799)
		cnt_vsync<=cnt_vsync+1'b1	;
	else
		cnt_vsync<=cnt_vsync			;
		
always@(posedge clk_vga or negedge rst_n_sys	)
	if(~rst_n_sys)
		rgb_vaild<=1'b0;
	else 	if(~vga_on_off)		
		rgb_vaild<=1'b0;
	else	if(cnt_hsync>=10'd143 && cnt_hsync<10'd783 && cnt_vsync>=10'd35 && cnt_vsync<=10'd514)
		rgb_vaild<=1'b1				;
	else
		rgb_vaild<=1'b0;

assign		pix_x=(cnt_hsync>=10'd143 && cnt_hsync<10'd783 && cnt_vsync>=10'd35 && cnt_vsync<=10'd514)?cnt_hsync-10'd143:10'hff	;
assign		pix_y=(cnt_hsync>=10'd143 && cnt_hsync<10'd783 && cnt_vsync>=10'd35 && cnt_vsync<=10'd514)?cnt_vsync-10'd35	:10'hff		;
	
always@(posedge clk_vga or negedge rst_n_sys	)
	if(~rst_n_sys)
		hsync<=1'b0		;
	else 	if(~vga_on_off)		
		hsync<=1'b0		;
	else	if	(cnt_hsync<=10'd95 )
		hsync<=1'b1		;
	else
		hsync<=1'b0		;
	
always@(posedge clk_vga or negedge rst_n_sys	)
	if(~rst_n_sys)
		vsync<=1'b0		;
	else 	if(~vga_on_off)
		vsync<=1'b0		;
	else	if	(cnt_hsync<=10'd783 && cnt_vsync <=10'd1 )
		vsync<=1'b1		;
	else
		vsync<=1'b0		;
		
always@(posedge clk_vga or negedge rst_n_sys	)
	if(~rst_n_sys)
		rgb<=8'H0		;
	else 	if(~vga_on_off)
		rgb<=8'H0		;
	else if(rgb_vaild==1'b1)
		rgb<=pix_data	;
	else
		rgb<=8'Hff	;
endmodule

 

vga_pic模块:

module	vga_pic(
	input	wire	clk_vga				,
	input	wire	rst_n_sys			,
	input	wire	[9:0]pix_x			,
	input	wire	[9:0]pix_y			,
	input	wire	clk_sys				,
	input	wire	[7:0]po_data		,
	input	wire	po_flag				,
	input	wire	vga_on_off			,
	input	wire	[11:0]ram_addr		,
	
	output	reg	[7:0]pix_data	

);

reg	[11:0]rd_addr			;
wire	[7:0]q_pic				;
parameter	lift	=10'd270	,
				right	=10'd319	,
				top	=10'd190	,
				bottom=10'd239	;

parameter	addr_max=2_499	;
				
parameter	a=8'd0		,
				b=8'd28		,
				c=8'd56		,
				aa=8'd84		,
				bb=8'd112	,
				cc=8'd140	,
				aaa=8'd168	,
				bbb=8'd196	,
				ccc=8'd224	;

always@(posedge clk_vga or negedge rst_n_sys)
	if (~rst_n_sys)
		rd_addr<=12'h0				;
	else 	if(~vga_on_off)		
		rd_addr<=12'h0				;
	else	if(rd_addr==addr_max)
		rd_addr<=12'h0				;
	else	if(pix_x<=10'd317 && pix_x>=10'd268 && pix_y>=10'd188 && pix_y<=10'd237 )
		rd_addr<=rd_addr+1'b1	;
	else	
		rd_addr<=rd_addr			;
	
always@(posedge clk_vga or negedge rst_n_sys)
	if(~rst_n_sys)
		pix_data<=8'hff		;
	else 	if(~vga_on_off)		
		pix_data<=8'hff		;			
	else if (pix_y==10'h3ff || pix_x==10'h3ff)
		pix_data<=8'hff		;
	else	if(pix_x<=10'd319 && pix_x>=10'd270 && pix_y>=10'd190 && pix_y<=10'd239)
		pix_data<=q_pic		;
	else if (pix_x<=10'd63)
		pix_data<=a				;
	else if (pix_x<=10'd127)
		pix_data<=b				;
	else if (pix_x<=10'd191)
		pix_data<=c				;			
	else if (pix_x<=10'd255)
		pix_data<=aa			;	
	else if (pix_x<=10'd319)
		pix_data<=bb			;
	else if (pix_x<=10'd447)
		pix_data<=cc			;
	else if (pix_x<=10'd511)
		pix_data<=aaa			;
	else if (pix_x<=10'd511)
		pix_data<=bbb			;
	else if (pix_x<=10'd639)
		pix_data<=ccc			;
	else
		pix_data<=8'hff	;

vga_ram	vga_ram_inst (
	.data 		( po_data 	),
	.rdaddress 	( rd_addr 	),
	.rdclock 	( clk_vga 	),
	.wraddress 	( ram_addr 	),
	.wrclock 	( clk_sys 	),
	.wren 		( po_flag 	),
	.q 			( q_pic 		)
	);

endmodule

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值