Quartus 2 编译 Verilog 时的“module XXXX cannot be declared more than once ” 跑马灯程序
先声明,不是跑马灯这个工程不能运行,这个工程的sof文件和pof文件都能在下载到fpga开发板上跑。就是在quartus2上运行的时候报这个错误。下面是这两段程序和错误图...
先声明,不是跑马灯这个工程不能运行,这个工程的sof文件和pof文件都能在下载到fpga开发板上跑。就是在quartus 2上运行的时候报这个错误。下面是这两段程序和错误图片,下面的程序都是直接从别人的教程里面复制过来的。所以应该不是程序本身的问题,但是我是一个初级开发者,不知道怎么解决这个问题,还望大神搭救。
一:led_v_dir.v
`include "gen_divd.v"
module led_w_dir
(
ClkIn,
KeyIn,
Resetb,
LedOut
);
input ClkIn,Resetb;
input [2:0] KeyIn;
output [2:0] LedOut;
reg [2:0] LedOut;
wire ClkLed;
reg [2:0] Cnt;
defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频
gen_divd Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));
always @ (posedge ClkLed or negedge Resetb)
if(Resetb==1'b0)
begin
LedOut<=3'b111;
Cnt<=3'd0;
end
else
begin
if(KeyIn==3'b000)
begin
if(Cnt<=3'd2)
begin
Cnt<=Cnt+1'b1;
LedOut<={LedOut[1:0],1'b0};//拼接
end
else
begin
Cnt<=3'd0;
LedOut<=3'b001;
end
end
else if(KeyIn==3'b111)
begin
if(Cnt<=3'd2)
begin
Cnt<=Cnt+1'b1;
LedOut<={1'b0,LedOut[2:1]};
end
else
begin
Cnt<=3'd0;
LedOut<=3'b100;
end
end
end
endmodule
二:gen_divd.v
//偶数分频器,外部带入两个参数决定分频系数。默认是2分频
//divdFACTOR--分频系数,实际分频数为divdFACTOR*2
//divdWIDTH--分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR
module gen_divd(reset,clkin,clkout);
input reset,clkin;
output clkout;
parameter divdWIDTH=1;//分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR
parameter divdFACTOR=1;//分频系数是divdFACTOR*2
reg clkout;
reg [divdWIDTH:0] cnt;
always @ (negedge reset or posedge clkin)
if(reset==1'b0)
begin
cnt=0;
clkout=0;
end
else
begin
cnt=cnt+1'b1;//常数1要指定位数,否则默认是32位的
if(cnt>=divdFACTOR)
begin
cnt=0;
clkout=~clkout;
end
end
endmodule 展开
一:led_v_dir.v
`include "gen_divd.v"
module led_w_dir
(
ClkIn,
KeyIn,
Resetb,
LedOut
);
input ClkIn,Resetb;
input [2:0] KeyIn;
output [2:0] LedOut;
reg [2:0] LedOut;
wire ClkLed;
reg [2:0] Cnt;
defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频
gen_divd Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));
always @ (posedge ClkLed or negedge Resetb)
if(Resetb==1'b0)
begin
LedOut<=3'b111;
Cnt<=3'd0;
end
else
begin
if(KeyIn==3'b000)
begin
if(Cnt<=3'd2)
begin
Cnt<=Cnt+1'b1;
LedOut<={LedOut[1:0],1'b0};//拼接
end
else
begin
Cnt<=3'd0;
LedOut<=3'b001;
end
end
else if(KeyIn==3'b111)
begin
if(Cnt<=3'd2)
begin
Cnt<=Cnt+1'b1;
LedOut<={1'b0,LedOut[2:1]};
end
else
begin
Cnt<=3'd0;
LedOut<=3'b100;
end
end
end
endmodule
二:gen_divd.v
//偶数分频器,外部带入两个参数决定分频系数。默认是2分频
//divdFACTOR--分频系数,实际分频数为divdFACTOR*2
//divdWIDTH--分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR
module gen_divd(reset,clkin,clkout);
input reset,clkin;
output clkout;
parameter divdWIDTH=1;//分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR
parameter divdFACTOR=1;//分频系数是divdFACTOR*2
reg clkout;
reg [divdWIDTH:0] cnt;
always @ (negedge reset or posedge clkin)
if(reset==1'b0)
begin
cnt=0;
clkout=0;
end
else
begin
cnt=cnt+1'b1;//常数1要指定位数,否则默认是32位的
if(cnt>=divdFACTOR)
begin
cnt=0;
clkout=~clkout;
end
end
endmodule 展开
1个回答
展开全部
因为你把两个文件都添加到文件列表里 而且led_v_dir.v里面有`include "gen_divd.v"
导致编译两次gen_divd.v
要不删掉这句 要不就只添加led_v_dir.v这一个文件(并且保证两个文件在相同目录)
导致编译两次gen_divd.v
要不删掉这句 要不就只添加led_v_dir.v这一个文件(并且保证两个文件在相同目录)
追问
这是quartus2 版本12,用你的方法就轻松解决了 ,但是我在版本9的quartus 2上,如果不写“include“gen_divd.v””或者不把gen_divd.v 添加到文件列表中,那么编译器会报 module gen_divd 没有找到的异常,如果我把这两个步骤都做了,又会报上述错误。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询