因此,基本上我希望我的监视器显示一个负面倾斜的线路。我编写的当前代码显示了任何正面倾斜的线路,但是如果我试图使其变为负,则不会出现或点缀。我对为什么它不起作用的原因有一个模糊的想法,但是如果有人可以将我指向正确的方向,这将不胜感激。
(注意:我的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中可能非常棘手。
要记住的两个主要规则是:
- 请确保为符号位分配一个额外的位。虽然可以代表10B中的0..1023未签名。那将变成-512..511签名。
- 在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
要注意的几件事:
- localparams中的" s"表示签名常数
- $签名的系统任务迫使要签名的值。请注意如何添加领先的零,因此,如果设置了传入信号的高位,我们不会无意中获得负数。