我希望通过VGA在系统verilog中显示一条具有负斜率的线(正确显示正斜率的线)
所以基本上我希望我的显示器显示一条负斜率的线。我编写的当前代码完美地显示了任何正斜线,但是如果我尝试使其为负,它不会出现或变成虚线。 我有一个模糊的想法,为什么它不工作,但如果有人能给我指出正确的方向,它将不胜感激 (注意:我的VGA驱动程序和VGA包装器一样工作正常) 代码如下:我希望通过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
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,我怀疑有某种整数溢出错误。啊,非常感谢您的反馈!这对我来说真的很清楚,我很感激:)很高兴这对我有帮助。如果你认为我的解释足够的话,请随意接受答案。