小弟想编个三分频的程序,思想如下:利用计数器,进行模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[1:0] 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;
else b<=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[1:0] 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
感谢各位帮解决一下! |