项目名称
颜色循环显示动画
设计要求
每隔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显示