//vga结构计数器结构实现
屏幕显示分辨率为640480,刷新频率是60hz要求在屏幕中间显示一个200200的绿色方框,其他地方显示黑色;
/计数器结构
//------------------------------------------------------------------------------------------------------------------------------------------------
//明德扬定义计数器
//计数器规则1:计数器逐一考虑3要素:初值、加一条件、结束值
//计数器规则2:计数器初值必须为零
//计数器规则3:使用某一计数器值,必须同时满足加一条件
//计数器规则4:结束条件必须同时满足加一条件
//计数器规则5:当取某个数时,assign的形式必须为:(加一条件)&&(cnt==计数值-1);
//计数器规则6:结束后必须回到0;
//计数器规则7:若要限定范围,则推荐使用">=“和”<"两种符号;
//计数器规则8:设计步骤是,先写计数器的always段,条件用名字代替,然后用assign写出加1条件;最后用assign写出结束条件;
//计数器规则9:加1条件必须与计数器严格对齐,其他信号一律向计数器对齐;
//计数器规则10:命名规则必须符合规范,比如:add_cnt表示加1条件;end_cnt表示结束条件;
//计数器规则11:减1计数器暂时不用。
//计数器八步法
// 第一步:功能明确
// 第二步:功能波形
// 第三步:计数结构 ------根据波形找出实现时序需要的计数器数量和结构
// 第四步:加1和结束条件
// 第五步:定义特殊点
// 第六步:完整性检查
// 第七步:计数器代码
// 第八步:功能代码
————————————————
在根据第六步完成功能代码时,要熟记计数器规则
always @(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
cnt_hs <= 0;
end
else if(add_cnt_hs) //加一条件
begin
if(end_cnt_hs) //结束条件
cnt_hs <= 0;
else
cnt_hs <= cnt_hs + 1'b1;
end
end
assign add_hs = 1;
assign end_hs = add_cnt_hs && cnt_hs == 800 - 1;
always @(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
cnt_vs <= 0;
end
else if(add_cnt_vs) //加一条件
begin
if(end_cnt_vs) //结束条件
cnt_vs <= 0;
else
cnt_vs <= cnt_vs + 1'b1;
end
end
assign add_cnt_vs = end_cnt_hs;
assign end_cnt_vs = add_cnt_vs && cnt_vs == 525 - 1;
//功能代码
assign hs_rise = add_cnt_hs && cnt_hs == 10'd95;
assign hs_down = add_cnt_hs && cnt_hs == 10'd799;
always @(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
hys <= 1'b0;
end
else if(hs_rise)
begin
hys <= 1'b1;
end
else if (hs_down)
begin
hys <= 1'b0
end
end
assign vs_rise = add_cnt_vs && cnt_vs = 10'd1;
assign vs_down = add_cnt_vs && cnt_vs = 10'd523;
always @(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
vys <= 1'b0;
end
else if(vs_rise)
begin
vys <= 1'b1;
end
else if(vs_down)
begin
vys <= 1'b0;
end
end
parameter X0 = 141;
parameter X1 = 787;
parameter Y0 = 32;
parameter Y1 = 516;
parameter X_CENT = 464;
parameter Y_CENT = 274;
parameter GREEN = 8'b000_111_00;
parameter BLACK = 8'b000_000_00;
assign valid_area = add_cnt_hs && cnt_hs >= X0 && cnt_hs < X1 && cnt_vs >= Y0 && cnt_vs < Y1;
assign green_area = valid_area && (cnt_hs >= X_CENT - 100 && cnt_hs <X_CENT + 100 && cnt_vs >= Y_CENT - 100 && cnt_vs < Y_CENT + 100);
always @(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
rga_data =8'h00;
end
else if(valid_area)
begin
if(green_area)
begin
rga_data <= GREEN;
end
else
begin
rga_data <= BLACK;
end
end
else
begin
rga_data = 8'h00;
end
end