2017-06-28 76 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

高兴,这是有益的。如果你认为我的解释是充分的,请随时接受答案。 –