写了个verilog流水灯程序,quartus一直提示子模块重复定义。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写了个verilog流水灯程序,quartus一直提示子模块重复定义。相关的知识,希望对你有一定的参考价值。

顶层模块:`include"divd.v"module liushuideng( input rst, input [2:0]swt, input sysclk, output [2:0]led ); reg clkled = 0; initial begin led = 3'b111; end //reg sysclk = 0; //defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频 divd divd_call(.sysclk(sysclk),.clkled(clkled)); always@(posedge clkled) begin if(!rst) begin case(swt) 3'b000: led<=led[1:0],1'b0; 3'b001: led<=swt; 3'b010: led<=swt; 3'b011: led<=swt; 3'b100:led<=swt; 3'b101: led<=swt; 3'b110: led<=swt; 3'b111: led<=1'b0,led[2:1]; endcase end else led = 3'b000; end endmodule分频器:module divd( sysclk, clkled ); input sysclk; output clkled; reg clkled; parameter N=10000000; //reg[23:0]cnt=0; //wire clkled = 0; always@(posedge sysclk) begin if(cnt<=N) cnt<=cnt+1'b1; else cnt = 0; clkled<=~clkled; endendmodule在这里面quartus一直报错:Error (10228): Verilog HDL error at divd.v(1): module "divd" cannot be declared more than once求大神指点,错误在子模块的第一行即:"module divd(...)"!!!!!这程序我在vivado里面也试了,两个软件对参数的定义要求不太一样,但没有不识别子模块的情况。

参考技术A 这是你交叉`include出现的问题
推荐你在divd.v
开头写上
`ifndef DIVD_V
`define DIVD_V

在最后写上
`endif
这样只要文件之前被include过了,就会有DVID_V这个define,这样就能避免同一个文件在不同的地方被include造成的重复declare追问

成了。老哥,稳。

本回答被提问者和网友采纳
参考技术B 把你的代码贴一下.追问

////////////////////////////////////////////////////////////////

`include"equal.v"

module frequence(

ino,

outo);

input ino;

output outo;

//reg ino;

//wire outo;

equal eqqq(.ini(ino),.outi(outo));

endmodule

追答

这种的话,你可以把equal添加到工程里直接实例化就行,

FPGA实验流水灯实验

流水灯通常是硬件领域的”Hello World”,本次将使用正点原子的开拓者FPGA开发板来实现简单的流水灯。

Quartus Ⅱ芯片选择设置

Verilog代码


module flow_light(
    input               sys_clk  ,  //系统时钟
    input               sys_rst_n,  //系统复位,低电平有效
	 
    output  reg  [3:0]  led         //4个LED灯
    );

//reg define
reg [23:0] counter;

//*****************************************************
//**                    main code
//***************************************************** 
                                                                                                                                                                                                                         
//计数器对系统时钟计数,计时0.2秒
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        counter <= 24'd0;
    else if (counter < 24'd1000_0000)
        counter <= counter + 1'b1;
    else
        counter <= 24'd0;
end

//通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led <= 4'b0001;
    else if(counter == 24'd1000_0000) 
        led[3:0] <= {led[2:0],led[3]};
    else
        led <= led;
end

endmodule 

这里注明一下0.2秒实现的思路:
开发板的时钟频率为50Hz,时钟周期是20ns,0.2s/20ns=10^7。
因此,计数器counter的值累加到10^7即为0.2秒。
通过计算器的程序员模式,可以查看10^7次方需要的寄存器位数。

因此,寄存器定义时就设定为24位。

管脚绑定

管脚绑定参照正点原子给的管脚图:

实验效果

以上是关于写了个verilog流水灯程序,quartus一直提示子模块重复定义。的主要内容,如果未能解决你的问题,请参考以下文章

verilog语言quartus功能仿真,计数错误!

verilog学习笔记- 1)Quartus软件的使用

FPGA实验流水灯实验

软件:Quartus II,语言:VHDL或verilog HDL?

如何用verilog写8个流水灯

Verilog的IDE Quartus II