2017-06-28 75 views
0

所以基本上我希望我的監視器顯示負斜率線。目前的代碼,我寫了顯示任何正斜線完美但是如果我試圖將其變爲負數,它不會出現或變成一片。 我爲什麼它不工作,但如果任何人都可以在正確的方向,將不勝感激指向我一個模糊的概念。我想顯示通過VGA系統的Verilog負斜率的直線(正斜線正確顯示)

(注:我的VGA驅動程序工作正常,還有VGAWrapper)

這是代碼:

module vga_rgb(
    input logic [8:0] row_o, 
    input logic [9:0] column_o, 
    input logic clk_i,reset_i, 
    output logic [15:0]rgb_i 
    ); 

    localparam X1 = 10'd200; 
    localparam Y1 = 9'd100; 

    localparam X2 = 10'd400; 
    localparam Y2 = 9'd300; 

    wire [15:0] slope = ((Y2-Y1)/(X2-X1)); 

    [email protected](posedge clk_i, posedge reset_i) 
    if (reset_i) 
     rgb_i <= 16'b0; 
    else 
     if (((row_o-Y1) == (slope * (column_o-X1))) && ((row_o < 300) && (row_o > 100/))) 
     rgb_i <= 16'b0; 
     else   
     rgb_i <= 16'b11111_111111_11111; 
+0

我應該提到,顯示器是640by480 – DIB98

+0

我懷疑某種整數溢出錯誤。 – mkrieger1

回答

0

你幾乎沒有。問題是,負斜率是,現在你正在處理簽名量,這在Verilog中可能非常棘手。

牢記

兩個主要規則是:

  1. 一定要額外撥款位作爲符號位。雖然你可以在 代表0..1023的10b無符號。當 簽名時,這變成-512..511。
  2. 在Verilog中,數學運算的結果是無符號的 ,除非兩個操作數都被簽名。這通常是深深 令人驚訝的行爲新人,但是這就是語言的工作方式。

於是與幾個簽署的註釋,修復您的常量的寬度,減少了輸出到一個位,和修理什麼我相信什麼是剪切和粘貼錯誤我結束了這一點:

module vga_rgb(
    input wire [8:0] row_o, 
    input wire [9:0] column_o, 
    input logic clk_i,reset_i, 
    output logic rgb_i 
    ); 

    localparam X1 = 11'sd200; 
    localparam Y1 = 10'sd100; 

    localparam X2 = 11'sd400; 
    localparam Y2 = 10'sd300; 

    wire signed [15:0] slope = ((Y2-Y1)/(X2-X1)); 

    [email protected](posedge clk_i, posedge reset_i) 
    if (reset_i) 
     rgb_i <= 16'b0; 
    else 
     if ((($signed({1'b0, row_o})-Y1) == (slope * ($signed({1'b0, column_o})-X1))) && ((row_o < Y2) && (row_o > Y1))) 
     rgb_i <= 1'b1; 
     else 
     rgb_i <= 1'b0; 

endmodule 

有幾件事情需要注意:

  1. 的「s」在localparams表示一個有符號常
  2. 的$簽約系統,迫使作爲簽約待處理的值的任務。注意我如何添加一個前導零,所以如果輸入信號的高位被設置,我們不會無意中得到一個負數。
+0

啊,非常感謝您的反饋!這真是茅塞頓開對我來說,我很感激:) – DIB98

+0

高興,這是有益的。如果你認爲我的解釋是充分的,請隨時接受答案。 –