Verilog не может понять, почему рег всегда X - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь сделать вывод VGA, используя verilog, но я не могу понять, почему 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

Вот результат моделирования. Ошибка r_hcount ... Код должен установить оба счетчика на 0, когда сброс равен 1, но по какой-то причине он не сбрасывается на 0. Пожалуйста, помогите.

Wavefrorm

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Поработав немного больше с кодом, я обнаружил, что это произошло потому, что r_hcount <= 0 переопределялся с помощью r_hcount <= r_hcount + 1, который установит для r_hcount значение X. Это было вызвано тем, что оба тактовых входа были оба такая же частота. </p>

Я должен быть более осторожным в будущем ...

0 голосов
/ 31 октября 2018

Из вашей работы я замечаю, что одна точка может вызвать проблему

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_hcount может быть ошибочно здесь. Я предлагаю сделать это следующим образом

 else if (iw_pix_stb) <=== else if here

Удачи.

...