我希望通过VGA在系统verilog中显示一条具有负斜率的线(正确显示正斜率的线)

我希望通过VGA在系统verilog中显示一条具有负斜率的线(正确显示正斜率的线),verilog,system-verilog,vga,Verilog,System Verilog,Vga,所以基本上我希望我的显示器显示一条负斜率的线。我编写的当前代码完美地显示了任何正斜线,但是如果我尝试使其为负,它不会出现或变成虚线。 我有一个模糊的想法,为什么它不工作,但如果有人能给我指出正确的方向,它将不胜感激 (注意:我的VGA驱动程序和VGA包装器一样工作正常) 代码如下: module vga_rgb( input logic [8:0] row_o, input logic [9:0] column_o, input logic clk_i,reset_i

所以基本上我希望我的显示器显示一条负斜率的线。我编写的当前代码完美地显示了任何正斜线,但是如果我尝试使其为负,它不会出现或变成虚线。 我有一个模糊的想法,为什么它不工作,但如果有人能给我指出正确的方向,它将不胜感激

(注意:我的VGA驱动程序和VGA包装器一样工作正常)

代码如下:

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));

  always@(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;
模块vga\U rgb(
输入逻辑[8:0]第0行,
输入逻辑[9:0]列,
输入逻辑时钟i,复位i,
输出逻辑[15:0]rgb_i
);
localparam X1=10'd200;
localparam Y1=9'd100;
localparam X2=10'd400;
localparam Y2=9'd300;
导线[15:0]斜率=((Y2-Y1)/(X2-X1));
始终@(posedge clk_i、posedge reset_i)
如果(重置i)

你就快到了。负斜率的问题是,你现在处理的是有符号的量,这在Verilog中可能非常棘手

要记住的两个主要规则是:

  • 确保为符号位分配额外的位。只要你能 在10b中表示0..1023,无符号。当 签名
  • 在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));
    
      always@(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
    
    模块vga\U rgb(
    输入线[8:0]第0行,
    输入线[9:0]列_o,
    输入逻辑时钟i,复位i,
    输出逻辑rgb_i
    );
    localparam X1=11'sd200;
    localparam Y1=10'sd100;
    localparam X2=11'sd400;
    localparam Y2=10'sd300;
    线符号[15:0]斜率=((Y2-Y1)/(X2-X1));
    始终@(posedge clk_i、posedge reset_i)
    如果(重置i)
    
    我应该提到的是,显示器是640B480,我怀疑有某种整数溢出错误。啊,非常感谢您的反馈!这对我来说真的很清楚,我很感激:)很高兴这对我有帮助。如果你认为我的解释足够的话,请随意接受答案。