[英]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.