三分频的verilog程序
小弟想编个三分频的程序,思想如下:利用计数器,进行模3计数,当第一个上升沿计数器计数到2时,使分频输出信号翻转,当这个计数器计数到3时,再回到0开始计数;再当第二个下降沿计数器计数到3时,再让分频输出信号翻转,同时将这个计数置0,从新开始计数!如此反复,形成三分频!(不知思路对不?)以下是程序:
module threediv(divclk,a,b,clk,rst);//divclk是分频输出信号,a计数器一,b计数器二,clk时钟
input clk,rst; //rst复位信号
output divclk,a,b;
reg divclk;
reg a,b;
always @(posedge clk or negedge rst)//第一个计数器按思路的实现
begin
if(~rst) a<=2'b00;
else a<=a+1;
begin
if(a==2'b10) divclk<=~divclk;
if(a==2'b11) a<=2'b00;
end
end
always @(negedge clk or negedge rst)//第二个计数器按思路的实现
begin
if(~rst)b<=2'b00;
elseb<=b+1;
begin
if(b==2'b11)
begin
divclk<=~divclk;
b<=2'b00;
end
end
end
endmodule
以下是测试模块
module Tthreediv;
reg clk,rst;
reg divclk;
reg a,b;
threediv d(divclk,a,b,clk,rst);
initial
begin
clk<=0;
rst<=0;
a=2'b00;
b=2'b00;
divclk=0;
end
always
begin
#3 clk=~clk;
#30 rst=~rst;
end
initial
$monitor($time,clk,rst,divclk);
endmodule
我在ModelSim软件上仿真,编译通过了,可是要simulate就出现了下面的问题:
# Loading work.Tthreediv
# Loading work.threediv
# ** Error: (vsim-3053) G:/threediv/Tthreediv.v(5): Illegal output or inout port connection (port 'divclk').
# Region: /Tthreediv/d
# ** Error: (vsim-3053) G:/threediv/Tthreediv.v(5): Illegal output or inout port connection (port 'a').
# Region: /Tthreediv/d
# ** Error: (vsim-3053) G:/threediv/Tthreediv.v(5): Illegal output or inout port connection (port 'b').
# Region: /Tthreediv/d
# Error loading design
感谢各位帮解决一下! 老大,那几个信号是输出啊 恩,你的testbench写的有问题 怎么解决呢?楼上的,帮小弟一下 你的output没有定义a,b的位宽!!! 还有你的clkdiv不能在两个模块中都赋值 补充一点:不要在一个module里用时钟上升沿和下降沿分别采样数据,应该放在不同模块里。这样做有利于在划分不同扫描链时把下降沿触发的触发器方便的分离开来,也有利于后端布局布线。 恩,楼上的说的对, 开始没注意到 问题多多啊,^_^ 感谢回帖的所有人,谢谢!同时希望后来者踊跃发言