颜色循环显示动画

项目名称

颜色循环显示动画

设计要求

每隔0.5s显示一幅图,每幅图由各种颜色构成,进行循环显示

设计说明

   本次设计在vga驱动接口设计项目的基础上进行改进的,不了解的可以先看那个。

本次设计需要一个0.5s的计数器和一个状态计数器,状态计数器的累加改变图像的显示状态,每记数0.5s显示下一幅图像,在显示图像时一定要在显示有效区进行显示,由于总统设计比较简单,不再过多详述。

代码设计

部分主要代码展示,笔者在设计过程中state在两个always块中进行了赋值,结果报错Error (10028): Can't resolve multiple constant drivers for net "state[3]" at vga_color.v(201),所以一定要切记,在两个always块中不能对同一个变量进行赋值。

//显示区标志
always@(*)
	if(!rst_n)
		flag<=0;
	else if((cnt1>=11'd144 && cnt1<11'd784) && (cnt2>=11'd35 && cnt2<11'd515))
		flag<=1;
	else 	
		flag<=0;
		
//---------------------------------------------------------------------------//
//颜色循环显示计时,每隔0.5s切换图像 500_000_000/20-1
reg [24:0] cnt;
localparam cnt_top=25'd24999999;
always@(posedge clk or negedge rst_n)
		if(!rst_n)
			cnt<=25'd0;
		else if(cnt<cnt_top)
			cnt<=cnt+1'b1;
		else
			cnt<=25'd0;
wire delay_done=(cnt==cnt_top)?1'b1:1'b0;

reg [23:0] vga_red;
reg [23:0] vga_green;
reg [23:0] vga_blue;
reg [23:0] vga_yellow;
reg [23:0] vga_mult1;
reg [23:0] vga_mult2;
reg [23:0] vga_mult3;
reg [23:0] vga_mult4;
reg [23:0] vga_mult5;

//--------------------红色显示-------------------------//		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		vga_red<=0;
	else if(flag)
		vga_red<=red;
	else
		vga_red<=0;	
//--------------------绿色显示-------------------------//		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		vga_green<=0;
	else if(flag)
		vga_green<=green;
	else
		vga_green<=0;
//--------------------蓝色显示-------------------------//		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		vga_blue<=0;
	else if(flag)
		vga_blue<=blue;
	else
		vga_blue<=0;
//--------------------黄色显示-------------------------//		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		vga_yellow<=0;
	else if(flag)
		vga_yellow<=yellow;
	else
		vga_yellow<=0;	
		//--------------------cyan-------------------------//		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		vga_mult1<=0;
	else if(flag)
		vga_mult1<=cyan;
	else
		vga_mult1<=0;	
		//--------------------royal-------------------------//		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		vga_mult2<=0;
	else if(flag)
		vga_mult2<=royal;
	else
		vga_mult2<=0;	
//-------------------红黄蓝绿显示--------------------------//
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		vga_mult3<=0;
	else if(flag)begin
		if((cnt1>=11'd144 && cnt1<=11'd463) && (cnt2>=11'd35 && cnt2<=11'd274))
			vga_mult3<=red;
		else if((cnt1>=11'd464 && cnt1<=11'd783) && (cnt2>=11'd35 && cnt2<=11'd274))
			vga_mult3<=green;
		else if((cnt1>=11'd464 && cnt1<=11'd783) && (cnt2>=11'd275 && cnt2<=11'd514))
			vga_mult3<=blue;
		else if((cnt1>=11'd144 && cnt1<=11'd463) && (cnt2>=11'd275 && cnt2<=11'd514))
			vga_mult3<=yellow;
		else
			vga_mult3<=0;
	end
	else
		vga_mult3<=0;
//-----------------------8彩色带显示-------------//		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		vga_mult4<=0;
	else if(flag)begin
		if((cnt1>=11'd144 && cnt1<=11'd224) && (cnt2>=11'd35 && cnt2<11'd515))
			vga_mult4<=red;
		else if((cnt1>=11'd225 && cnt1<=11'd305) && (cnt2>=11'd35 && cnt2<11'd515))
			vga_mult4<=green;
		else if((cnt1>=11'd306 && cnt1<=11'd386) && (cnt2>=11'd35 && cnt2<11'd515))
			vga_mult4<=blue;
		else if((cnt1>=11'd387 && cnt1<=11'd467) && (cnt2>=11'd35 && cnt2<11'd515))
			vga_mult4<=yellow;
		else if((cnt1>=11'd468 && cnt1<=11'd548) && (cnt2>=11'd35 && cnt2<11'd515))
			vga_mult4<=black;
		else if((cnt1>=11'd549 && cnt1<=11'd629) && (cnt2>=11'd35 && cnt2<11'd515))
			vga_mult4<=white;
		else if((cnt1>=11'd630 && cnt1<=11'd710) && (cnt2>=11'd35 && cnt2<11'd515))
			vga_mult4<=cyan;
		else if((cnt1>=11'd711 && cnt1<11'd784) && (cnt2>=11'd35 && cnt2<11'd515))
			vga_mult4<=royal;
		else
			vga_mult4<=0;
	end
	else
		vga_mult4<=0;	
//--------------------white-------------------------//		
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		vga_mult5<=0;
	else if(flag)
		vga_mult5<=white;
	else
		vga_mult5<=0;	
		
//显示状态每次加1
reg  [3:0] state;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		state<=0;
	else if(delay_done)begin
			if(state<4'd8)
				state<=state+1;
			else
				state<=0;
	end	
	else
		state<=state;
end

//显示,组合逻辑和时序逻辑都可以实现
always@(posedge clk or negedge rst_n)
if(!rst_n)
	vga_rgb<=0;
else
	begin
		if(flag)begin
			case(state)
				0:vga_rgb<=vga_red;
				1:vga_rgb<=vga_green;
				2:vga_rgb<=vga_blue;
				3:vga_rgb<=vga_yellow;
				4:vga_rgb<=vga_mult1;
				5:vga_rgb<=vga_mult2;
				6:vga_rgb<=vga_mult3;
				7:vga_rgb<=vga_mult4;
				8:vga_rgb<=vga_mult5;
			endcase
		end
		else
			vga_rgb<=0;
	end

显示结果

csdn无法上传视频,笔者将视频制作成gif显示

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值