哦豁!别卷了 2024-12-03 19:42 采纳率: 83.3%
浏览 4
已结题

为什么在运行代码时,显示器上无法显示图像?

在运行代码时,显示器上无法显示图像,是线的问题?电脑的问题?还的代码问题?
vivado代码:

module clk_unit( //4分频
    input clock,
    input rst,
    output vga_clk
    );
    reg vga_clk;
    reg clk_tmp;
    always @(posedge clk_tmp or posedge rst) begin
       if (rst)
        vga_clk <= 0;
      else
        vga_clk <= ~vga_clk;
    end
    always @(posedge clock or posedge rst) begin
        if (rst)
            clk_tmp <= 0;
        else
            clk_tmp <= ~clk_tmp;
    end
endmodule

module lab_VGA(
input clock, //系统时钟100MHZ
input rst, //时钟复位端
    input [1:0] switch, //显示模式选择
    output [2:0] disp_RGB, // VGA数据输出   
output hsync, // VGA行同步信号   
output vsync // VGA场同步信号  
);
wire clock, rst;
wire hsync,vsync;
reg[9:0] hcount; // 行扫描计数器
reg[9:0] vcount; // 场扫描计数器
reg [2:0] data;  //数据端
reg [2:0] h_data; //横彩条
reg [2:0] v_data; //竖彩条
wire vga_clk;   //25M的VGA时钟
wire hcount_ov; //行扫描结束标志位
wire vcount_ov; //帧扫描结束标志位
wire data_act; //激活标志,当这个信号为1时RGB的数据可以显示在屏幕上

   //分辨率为640*480时行、场时序各个参数定义
parameter hsync_end = 10'd95,  //a行同步信号(低电平)结束
hdata_begin = 10'd143, //b显示后延结束,c行显示开始(144)
hdata_end   = 10'd783, //行显示结束
hpixel_end  = 10'd799, //行显示前延结束
vsync_end  = 10'd1,//o结束
vdata_begin = 10'd34,//p结束
vdata_end = 10'd514,//q结束
vline_end =10'd524;//f结束
//生成VGA时钟
clk_unit myclk( 
        .clock(clock),
        .rst(rst),
        .vga_clk(vga_clk)
);
//VGA驱动程序
//行扫描
assign hcount_ov = (hcount == hpixel_end); 
//行计数器=799,扫描一行结束,给出标志位 1
always@(posedge vga_clk)  //最好加上rst信号!
begin
if(hcount_ov)  //若行扫描标志位为1,换行
hcount<=10'd0; //行扫描计数器置0
else
hcount<= hcount +10'd1; //行扫描计数器+1
end
 
//场扫描
assign vcount_ov = (vcount == vline_end); 
//场计数器=524,一帧显示结束,给出标志位 1
always@(posedge vga_clk)
begin
if(hcount_ov) //行扫描标志位有效
begin
if(vcount_ov) //帧扫描标志位有效,场扫描计数器置零,重新计数
vcount<=10'd0;
else
vcount<= vcount +10'd1; //场扫描计数器加1
end
end
//数据、同步信号输出
assign data_act = ((hcount>hdata_begin) && (hcount<=hdata_end))&& 
((vcount>vdata_begin)&& (vcount<=vdata_end)); //显示阶段 
assign hsync = (hcount > hsync_end);//行计数器大于95,行同步信号置1
assign vsync = (vcount > vsync_end); //场计数器大于1,场同步信号置1
assign disp_RGB = (data_act) ? data : 3'b000;
//显示阶段,输出数据,否则输出0(不显示)
always@(posedge vga_clk)
begin
case(switch[1:0])
2'd0: data<=h_data; //选择横彩条
2'd1: data<=v_data; //选择竖彩条
2'd2: data<=(v_data ^ h_data); //产生棋格 异或 不同为1
2'd3: data<=(v_data ~^ h_data); //产生棋格 同或 相同为1
endcase
end
always@(posedge vga_clk)  //产生竖彩条
begin
        if(hcount <=223) //96+48-1+640/8=223
v_data<=3'h7;
else if(hcount <=303) //223+80=303
v_data<=3'h6;
else if(hcount <=383) //303+80=383
v_data<=3'h5;
else if(hcount <=463) //383+80=463
v_data<=3'h4;
else if(hcount <=543) //463+80=543
v_data<=3'h3;
else if(hcount <=623) //543+80=623
v_data<=3'h2;
else if(hcount <=703) //623+80=703
v_data<=3'h1;
else
v_data<=3'h0;
end
always@(posedge vga_clk)  //产生横彩条
begin
      if(vcount <=94) //2+33-1+480/8=94
h_data<=3'h7;
else if(vcount <=154)
h_data<=3'h6;
else if(vcount <=214)
h_data<=3'h5;
else if(vcount <=274)
h_data<=3'h4;
else if(vcount <=334)
h_data<=3'h3;
else if(vcount <=394)
h_data<=3'h2;
else if(vcount <=454)
h_data<=3'h1;
else
h_data<=3'h0;
end
endmodule

约束条件:

set_property IOSTANDARD LVCMOS33 [get_ports {disp_RGB[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {disp_RGB[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {disp_RGB[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports clock]
set_property IOSTANDARD LVCMOS33 [get_ports hsync]
set_property IOSTANDARD LVCMOS33 [get_ports rst]
set_property IOSTANDARD LVCMOS33 [get_ports vsync]
set_property PACKAGE_PIN A4 [get_ports {disp_RGB[0]}]
set_property PACKAGE_PIN A6 [get_ports {disp_RGB[1]}]
set_property PACKAGE_PIN D8 [get_ports {disp_RGB[2]}]
set_property PACKAGE_PIN J15 [get_ports {switch[0]}]
set_property PACKAGE_PIN L16 [get_ports {switch[1]}]
set_property PACKAGE_PIN E3 [get_ports clock]
set_property PACKAGE_PIN B11 [get_ports hsync]
set_property PACKAGE_PIN B12 [get_ports vsync]
set_property PACKAGE_PIN N17 [get_ports rst]

代码是ls发的,应该是没什么问题
线用的是vga转hdmi线
最后要呈现出下面的形式:

img

img

img

img


但我最后显示器却不会显示。

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的信息和代码,如果在运行代码时显示器无法显示图像,可能的原因有很多。以下是一些可能的问题及其解决方案:

    1. 线的问题:您提到了使用了VGA到HDMI的转换线。请确保该转换线工作正常,没有损坏,并且与您的显示器兼容。尝试更换一个已知的好的VGA线来排除这个问题。
    2. 电脑的问题:检查您的电脑是否支持VGA输出,并且电脑的显卡驱动是否安装正确。有时候,显卡驱动的问题可能会导致显示问题。
    3. 代码问题:虽然您认为代码应该没问题,但仍然值得再次检查。确保您的Vivado代码正确实现了VGA驱动,并且与您的硬件(单片机)兼容。特别检查VGA时钟生成、行扫描和场扫描逻辑以及数据输出部分。
    4. 单片机的问题:确保单片机正常工作,其输出与代码中的预期输出一致。您可以使用逻辑分析仪或示波器来检查单片的输出信号。
    5. 显示器设置问题:有些显示器需要设置为接受VGA信号,或者调整分辨率和刷新率以匹配VGA输出。检查并调整显示器的设置。
    6. 时序和同步问题:确保您的代码中的时序和同步信号(如hsync和vsync)正确生成并与显示器的要求匹配。错误的时序或同步可能导致显示器无法正确显示图像。
    7. 其它硬件问题:除了线和电脑之外,还要检查其他与VGA相关的硬件(如转换器)是否正常工作。

    为了进一步诊断问题,您可以尝试以下步骤:

    • 使用已知工作的代码和线在另一台电脑上测试。
    • 使用逻辑分析仪捕获单片机的输出信号,然后与代码的预期输出进行比较。
    • 检查显示器的设置,确保它们与您的输出信号匹配。
    • 逐步检查代码逻辑,特别是与显示相关的部分,确保它们正确工作。

    希望这些建议能帮助您解决问题。如果问题仍然存在,可能需要更详细的调试和检查。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月4日
  • 已采纳回答 10月27日
  • 创建了问题 12月3日