繁体   English   中英

Verilog-编译FPGA Rom之后Quartus编译错误

[英]Verilog - Quartus compilation error after compiling FPGA Rom

对于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

“多驱动程序”错误消息表示您在两个不同的位置驱动相同的信号。 在两个Always块中,或者在两个分配中,或者在系统Verilog中,一个Always块和一个分配。

通常,编译器错误消息应告诉您错误发生在哪里。 但是我不了解Quartus,所以事实并非如此。

您必须查看代码中的每个变量,并检查在何处为其分配值,然后检查是否还在其他位置(在不同的Always中或在Assign中)分配了值。

我用您的代码进行了此操作,发现在两个不同的Always块中为变量数据分配了一个值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM