集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 4420|回复: 7

大家看看这个用D触发器的3分频器 哪个地方错了 谢谢

[复制链接]
vvt 发表于 2010-9-21 10:18:28 | 显示全部楼层 |阅读模式
大家看看这个用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
谢谢指教
 楼主| vvt 发表于 2010-9-21 10:22:55 | 显示全部楼层
div是reg,可以assign吗
 楼主| vvt 发表于 2010-9-21 10:24:49 | 显示全部楼层
用wire用wire
maxizong 发表于 2010-9-21 10:54:39 | 显示全部楼层
div1 div2 在同一个always语句中先被赋值 后又引用 等于起到的是线的作用 应该是wire吧不晓得对不对
rainybyf 发表于 2010-9-26 09:34:11 | 显示全部楼层
首先,div是reg,怎么能assign呢?
第二,你的i,j是做计数器的,一位的,怎么记到2?
第三,你的上升沿和下降沿的else里,为何上来先有一个取反?这个是不是有问题?直接记到0时转一下,到2时再转一下
liyujie 发表于 2010-10-18 11:36:57 | 显示全部楼层
分频器不是这样写的,问题很多
wjjxyn 发表于 2010-10-18 16:16:09 | 显示全部楼层
本帖最后由 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);
input  clk;
input  rst_n;
output clkout;
/*****************************************/
reg [1:0]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 [1:0]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
wjjxyn 发表于 2010-10-18 16:26:43 | 显示全部楼层
回复 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 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-5 08:36 , Processed in 0.151346 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表