Verilog can';我不明白为什么一个注册表总是X

Verilog can';我不明白为什么一个注册表总是X,verilog,fpga,waveform,Verilog,Fpga,Waveform,我试图使用verilog进行VGA输出,但我似乎不明白为什么r_hcount保持为X。模拟波形显示r_vcount被正确重置为0,但由于某些原因,r_hcount从未重置为0。我不明白为什么 Verilog代码: module m_VGA640x480( input wire iw_clock, input wire iw_pix_stb, input wire iw_rst, output wire ow_hs,

我试图使用verilog进行VGA输出,但我似乎不明白为什么r_hcount保持为X。模拟波形显示r_vcount被正确重置为0,但由于某些原因,r_hcount从未重置为0。我不明白为什么

Verilog代码:

module m_VGA640x480(
  input  wire        iw_clock,
  input  wire        iw_pix_stb,
  input  wire        iw_rst,
  output wire        ow_hs,
  output wire        ow_vs,
  output wire        ow_blanking,
  output wire        ow_active,
  output wire        ow_screenend,
  output wire        ow_animate,
  output wire  [9:0] ow_x,
  output wire  [9:0] ow_y
  );
  localparam HS_STA = 16;
  localparam HS_END = 16 + 96;
  localparam HA_STA = 16 + 96 + 48;
  localparam VS_STA = 480 + 11;
  localparam VS_END = 400 + 11 + 2;
  localparam VA_END = 480;
  localparam LINE   = 800;
  localparam SCREEN = 524;

  reg [9:0] r_hcount;
  reg [9:0] r_vcount;

  assign ow_hs = ~((r_hcount >= HS_STA) & (r_hcount < HS_END));
  assign ow_vs = ~((r_vcount >= VS_STA) & (r_vcount < VS_END));

  assign ow_x = (r_hcount <  HA_STA) ? 0 : (r_hcount - HA_STA);
  assign ow_y = (r_vcount >= VA_END) ? (VA_END - 1) : (r_vcount);

  assign ow_blanking = ((r_hcount < HA_STA) | (r_vcount > VA_END - 1));

  assign ow_active = ~((r_hcount < HA_STA) | (r_vcount > VA_END - 1));

  assign ow_screenend = ((r_vcount == SCREEN - 1) & (r_hcount == LINE));

  assign ow_animate = ((r_vcount ==VA_END - 1) & (r_hcount == LINE));

  always @(posedge iw_clock)
  begin
    if (iw_rst)
    begin
      r_hcount <= 0;
      r_vcount <= 0;
    end
    if (iw_pix_stb)
    begin
      if (r_hcount == LINE)
      begin
        r_hcount <= 0;
        r_vcount <= r_vcount + 1;
      end
      else
        r_hcount <= r_hcount + 1;

      if (r_vcount == SCREEN)
        r_vcount <= 0;
    end
  end
endmodule
模块m_VGA640x480(
输入线iw_时钟,
输入线iw_pix_机顶盒,
输入线iw_rst,
输出线ow_hs,
输出线ow\U vs,
输出线下料,
输出线ow_激活,
输出线ow_screenend,
输出线ow_动画,
输出线[9:0]ow_x,
输出线[9:0]OWUy
);
localparam HS_STA=16;
localparam HS_END=16+96;
localparam HA_STA=16+96+48;
localparam VS_STA=480+11;
localparam VS_END=400+11+2;
localparam VA_END=480;
localparam行=800;
localparam屏幕=524;
reg[9:0]r\u hcount;
注册[9:0]注册计数;
分配ow_hs=~((r_hcount>=hs_STA)和(r_hcount=vs_STA)和(r_vcount=VA_END)?(VA_END-1):(r_vcount);
分配ow_消隐=((r_hcountVA_END-1));
分配ow_active=~((r_hcountVA_END-1));
分配ow_screenend=((r_vcount==屏幕-1)和(r_hcount==行));
指定ow_animate=((r_vcount==VA_END-1)和(r_hcount==LINE));
始终@(posedge iw_时钟)
开始
如果(iw_rst)
开始

从你的工作中,我注意到有一点可能导致这个问题

always @(posedge iw_clock)
begin
    if (iw_rst)
    //you define r_hcount <= 0 here
    .....
    if (iw_pix_stb) //<== another condition
    // r_hcount <= 0 is also defined here

祝你好运。

在对代码进行了更多的修改之后,我发现这是因为r\u hcount在对代码进行了更多的修改之后,我发现这是因为r\u hcount是的。就是这样。我应该早点意识到这一点。多谢各位@funnypig运行了很长一段时间,我不接触Verilog代码。我仍然明白,哈哈哈,祝你编码愉快:)谢谢。我对verilog还是新手,所以我还是会犯一些愚蠢的错误。希望在我目前的项目结束时,我会在这方面做得更好。
 else if (iw_pix_stb) <=== else if here