15.基礎實驗(4)vga顯示影象動態移動
阿新 • • 發佈:2021-01-09
vga顯示影象動態移動
一、實驗內容
實現vga顯示中心200x200的方塊動態移動。
二、系統框圖
解析度保持為640x480保持不變,200x200方塊在螢幕上移動,總共有5個狀態,將3個狀態列出,繪製如下框圖。
state1:200x200的方塊在顯示屏上正常移動。
state2:200x200的方塊到達顯示屏的底部,下一步開始從下往上移動。
state3:200x200的方塊到達顯示屏的右部,下一步開始從右往左移動。
三、設計分析
簡單來說,就是200x200的方塊移動到顯示屏的邊緣時變換方向,可以設計如下的時序。
用兩個暫存器作為上下、左右方向控制的變數,初始狀態,200x200的方塊是從左往右,從上往下移動的,碰到顯示器的邊沿後,方向改變。200x200的方塊替換為相應的顯示影象,就可以實現類似螢幕保護程式的功能。
x和y為顯示偏移量,設定為每一幀資料改變顯示的方向,當顯示影象觸碰到顯示屏的邊沿位置時,改變顯示的方向。
四、實驗步驟
根據設計的時序圖,編寫實現的程式碼。
//h_add_flag
always @(posedge clk)
begin
if (rst == 1'b1)
h_add_flag <= 1'b0;
else if (x == 'd1) //state change
h_add_flag <= 1'b0;
else if (x == H_ADDR_TIME - H_BASIC - 'd1) //state change
h_add_flag <= 1 'b1;
end
//v_add_flag
always @(posedge clk)
begin
if (rst == 1'b1)
v_add_flag <= 1'b0;
else if (y == 'd1) //state change
v_add_flag <= 1'b0;
else if (y == V_ADDR_TIME - V_BASIC - 'd1) //state change
v_add_flag <= 1'b1;
end
//x
always @(posedge clk)
begin
if (rst == 1'b1)
x <= 'd0;
else if (vcnt == (V_TOTAL_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1) && h_add_flag == 1'b0)
x <= x + 'd1;
else if (vcnt == (V_TOTAL_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1) && h_add_flag == 1'b1)
x <= x - 'd1;
end
//y
always @(posedge clk)
begin
if (rst == 1'b1)
y <= 'd0;
else if (vcnt == (V_TOTAL_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1) && v_add_flag == 1'b0)
y <= y + 'd1;
else if (vcnt == (V_TOTAL_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1) && v_add_flag == 1'b1)
y <= y - 'd1;
end
//rgb
always @(posedge clk)
begin
if (rst == 1'b1)
rgb <= 'd0;
else if (h_valid == 1'b1 && v_valid == 1'b1)
begin
if (h_valid_cnt >= x && h_valid_cnt < x+'d200 && v_valid_cnt >= y && v_valid_cnt < y+'d200)
rgb <= 3'b111;
else if (v_valid_cnt < 'd120)
rgb <= 3'b100;
else if (v_valid_cnt < 'd240)
rgb <= 3'b010;
else if (v_valid_cnt < 'd360)
rgb <= 3'b001;
else
rgb <= 3'b101;
end
else
rgb <= 'd0;
end
x,y代表的是偏移量,且只有在一幀顯示完畢之後,才會有影象的移動。
程式碼量很少,關鍵在於設計的思想。
五、實際波形模擬
模擬就不必了,直接上結果。
結果如下。
六、總結與討論*
1.涉及到優先順序的問題,方塊的顯示為最高優先順序,其餘靠邊站。
2.每一幀影象顯示完畢後,才進行影象的偏移,且水平和垂直方向同步變化。