所以基本上我希望我的显示器显示负斜率线。我写的当前代码完全显示任何正斜率线,但如果我试图使其为负,它不会出现或变成点状。 我有一个模糊的想法,为什么它不起作用,但如果有人能指出我正确的方向,将非常感激。
(注意:我的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;
答案 0 :(得分:0)
你快到了。问题是负斜率是,你现在正在处理签名数量,这在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
有几点需要注意: