大家看看这个用D触发器的3分频器 哪个地方错了 谢谢
大家看看这个用D触发器的3分频器哪个地方错了 谢谢module div3(div1,div2,div,clk,reset);
input clk;
input reset;
output div1,div2,div;
reg div1,div2;
reg div;
reg i,j;
always@(posedge clk)
begin
if (!reset)
begin
i<=0;
div1<=0;
end
else
begin
div1<=~div1;
if (i==0)
div1<=~div1;
else if (i==2)
div1<=~div1;
else
i<=i+1;
end
end
always@(negedge clk)
begin
if (!reset)
begin
j<=0;
div2<=0;
end
else
begin
div2<=~div2;
if (i==1)
div2<=~div2;
else if (i==2)
div2<=~div2;
else
i<=i+1;
end
end
assign div=div1|div2;
endmodule
占空比1:1
谢谢指教 div是reg,可以assign吗 用wire用wire div1 div2 在同一个always语句中先被赋值 后又引用 等于起到的是线的作用 应该是wire吧不晓得对不对 首先,div是reg,怎么能assign呢?
第二,你的i,j是做计数器的,一位的,怎么记到2?
第三,你的上升沿和下降沿的else里,为何上来先有一个取反?这个是不是有问题?直接记到0时转一下,到2时再转一下 分频器不是这样写的,问题很多 本帖最后由 wjjxyn 于 2010-10-18 16:17 编辑
回复 1# vvt
/***filename:clk_div3.v***/
/***function:对时钟频率进行三分频(50%占空比),采用两个分频时钟相与实现***/
/***time:Oct 18th 2010***/
module clk_div3(
clk,
rst_n,
clkout);
inputclk;
inputrst_n;
output clkout;
/*****************************************/
reg cnt1; //时钟计数器1
//计数进程
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt1<=2'd0;
else if(cnt1==2'd2)
cnt1<=2'd0;
else
cnt1<=cnt1+1'b1;
end
/****************************************/
reg clkout1;
//第一个时钟分频
always @(posedge clk or negedge rst_n) //上升沿触发
begin
if(!rst_n)
clkout1<=1'b0;
else
if(cnt1==2'd0)
clkout1<=~clkout1;
else if(cnt1==2'd2)
begin
clkout1<=~clkout1;
end
end
/*****************************************/
reg cnt2; //时钟计数器2
//计数进程
always @(negedge clk or negedge rst_n)
begin
if(!rst_n)
cnt2<=2'd0;
else if(cnt2==2'd2)
cnt2<=2'd0;
else
cnt2<=cnt2+1'b1;
end
/****************************************/
reg clkout2;
//第二个时钟产生进程
always @(negedge clk or negedge rst_n) //下降沿触发
begin
if(!rst_n)
clkout2<=1'b0;
else
if(cnt2==2'd0)
clkout2<=~clkout2;
else if(cnt2==2'd2)
begin
clkout2<=~clkout2;
end
end
/*****************************************/
assign clkout=clkout1 & clkout2;
endmodule 回复 1# vvt
上面是源代码,,下面是测试程序和仿真波形。
/***a testbench for clk_div3 module***/
`timescale 1ns/1ns
module clk_div3_t;
reg clk;
reg rst_n;
wire clkout;
clk_div3 m(.clk(clk),.rst_n(rst_n),.clkout(clkout));
initial
begin
clk=1'b0;
rst_n=1'b1;
#20
rst_n=1'b0;
#20
rst_n=1'b1;
#10000 $stop;
end
always #50 clk=~clk;
endmodule
页:
[1]
