写了个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追问
成了。老哥,稳。
////////////////////////////////////////////////////////////////
`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一直提示子模块重复定义。的主要内容,如果未能解决你的问题,请参考以下文章