我希望通过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));
  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;

你快到了。问题在于,负面的斜率是,您现在正在处理签名的数量,这在Verilog中可能非常棘手。

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

  1. 请确保为符号位分配一个额外的位。虽然可以代表10B中的0..1023未签名。那将变成-512..511签名。
  2. 在Verilog中,数学opreation的结果未签名除非两个操作数签名。这通常是深层的对于新移民来说,这是令人惊讶的行为,但这就是语言的运作方式。

因此,有几个签名的注释,固定常数的宽度,将输出减少到一位,并修复我假设的剪切和糊状错误,我最终得到了:

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

要注意的几件事:

  1. localparams中的" s"表示签名常数
  2. $签名的系统任务迫使要签名的值。请注意如何添加领先的零,因此,如果设置了传入信号的高位,我们不会无意中获得负数。

相关内容

  • 没有找到相关文章

最新更新