【问题标题】:Verilog - Quartus compilation error after compiling FPGA RomVerilog - 编译 FPGA Rom 后出现 Quartus 编译错误
【发布时间】:2018-03-20 11:44:11
【问题描述】:

对于一个 uni 的项目,我应该在 FPGA 中打印一个迷宫,数据应该首先写入 ROM,然后从中读取。从 32 位数据中,我将它们分成 2 个一组,并根据它们的编码给它们一些特定的颜色。

当我在 quartus 中运行我的代码时出现编译错误:

错误:“无法解析多个常量驱动程序”。

我的 rom 代码是这样的:

module thirdLab(

  input logic clk,
  input logic rst,
  input logic [3:0] address,
  output logic [31:0] data,
  output logic hsync,
  output logic vsync,
  output logic [3:0] red,
  output logic [3:0] green,
  output logic [3:0] blue);


  logic half_clock;
  logic [9:0] x;
  logic [9:0] y;


  //Decision help variables.
  logic [1:0] decBits0;
  logic [1:0] decBits1;
  logic [1:0] decBits2;
  logic [1:0] decBits3;
  logic [1:0] decBits4;
  logic [1:0] decBits5;
  logic [1:0] decBits6;
  logic [1:0] decBits7;
  logic [1:0] decBits8;
  logic [1:0] decBits9;
  logic [1:0] decBits10;
  logic [1:0] decBits11;
  logic [1:0] decBits12;
  logic [1:0] decBits13;
  logic [1:0] decBits14;
  logic [1:0] decBits15;


  always_ff @(posedge clk)
  begin
   if(!rst)
     half_clock <=0;
   else
      if(half_clock)
       half_clock <=0;
      else
       half_clock <=1;
  end


  always_ff @(posedge clk)
  begin
   if(!rst)
     x <=0;
   else
     if (half_clock)
       if (x==799)
         x <= 0;
       else
         x <= x+1;
  end


  always_ff @(posedge clk)
  begin
   if(!rst)
     y <=0;
   else
     if (half_clock)
       if (x==799)
         if (y==523)
           y <=0;
         else
           y <= y+1;
  end


  always_comb
  begin
   if (x>=655 && x<752)
     hsync =0;
   else
     hsync =1;
   if (y>=490 && y<493)
     vsync =0;
   else
     vsync =1;
  end


  //Initialize rom memory.
  always_comb
  begin
  case (address)

    4'b0000: data = 32'b00_00_01_10_00_00_00_01_00_01_00_00_01_01_01_00;
    4'b0001: data = 32'b00_00_01_00_00_00_00_01_01_01_00_01_00_00_01_00;
    4'b0011: data = 32'b01_00_00_00_00_00_00_00_01_00_00_01_00_00_01_00;
    4'b0100: data = 32'b00_01_00_00_00_00_00_01_00_00_01_01_01_01_01_01;
    4'b0101: data = 32'b00_00_01_00_00_00_00_00_00_00_00_01_00_01_01_01;
    4'b0110: data = 32'b01_01_01_01_01_01_01_01_01_00_00_01_00_00_00_00;
    4'b0111: data = 32'b00_01_01_00_01_01_00_01_00_01_00_00_00_00_01_00;
    4'b1000: data = 32'b01_00_01_01_00_00_01_01_01_00_00_01_00_00_01_00;
    4'b1001: data = 32'b11_00_00_00_00_01_01_01_01_00_00_01_01_00_01_00;
    4'b1010: data = 32'b00_00_01_00_01_00_01_01_01_01_00_00_00_00_01_00;
    4'b1011: data = 32'b01_01_01_00_10_00_00_01_01_01_00_01_01_01_01_00;
    default: data = 32'b00_01_01_00_00_00_00_00_01_00_00_01_00_00_01_00;

    endcase
  end

  //Internal memory, accessed through address only.
  reg [31:0] mem [12];

  always_ff @(posedge clk)
  begin

  data <= mem[address];
  decBits0 <= data[1:0];
  decBits1 <= data[3:2];
  decBits2 <= data[5:4];
  decBits3 <= data[7:6];
  decBits4 <= data[9:8];
  decBits5 <= data[11:10];
  decBits6 <= data[13:12];
  decBits7 <= data[15:14];
  decBits8 <= data[17:16];
  decBits9 <= data[19:18];
  decBits10 <= data[21:20];
  decBits11 <= data[23:22];
  decBits12 <= data[25:24];
  decBits13 <= data[27:26];
  decBits14 <= data[29:28];
  decBits15 <= data[31:30];

  end

【问题讨论】:

标签: verilog fpga


【解决方案1】:

“多个驱动程序”错误消息意味着您在两个不同的地方驱动相同的信号。在两个 always 块中,或在两个分配中,或者在系统 Verilog 中,一个 always 块和一个分配。

通常编译器错误消息应该告诉您错误发生在哪里。但我不了解 Quartus,所以可能不是这样。

您必须查看代码中的每个变量并检查您为它分配值的位置,然后检查您是否还在不同的位置(在不同的始终或在分配中)分配了值。

我对您的代码进行了该操作,发现变量 data 在两个不同的 always 块中分配了一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2021-05-21
    • 2023-04-11
    相关资源
    最近更新 更多