kandy286 发表于 2013-11-11 00:25:52

VHDL设计分频器,为什么不用复位端?

用VHDL设计了一个分频器,程序如下:
-- CLK100K.vhd

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CLK100K IS
PORT(CLK   : IN STD_LOGIC;
   --RESET   : IN STD_LOGIC;
   CLKOUT: OUT STD_LOGIC);
END CLK100K;

ARCHITECTURE BEHAV OF CLK100K IS

SIGNAL count : INTEGER RANGE 0 TO 256;
SIGNAL clk_data : std_logic := '0';

BEGIN
PROCESS(CLK)
BEGIN
    IF(CLK'EVENT AND CLK='1') THEN
      --IF(RESET = '0') THEN             --这里先去掉复位
            --count <= 0;
            --clk_data <= '0';
       -- ELSE
            IF(count = 255) THEN         
                count <= 0;   
                clk_data <= NOT clk_data;
            ELSE
                clk_data <= clk_data;
                count <= count + 1;
            END IF;
      --END IF;
   END IF;
   CLKOUT <= clk_data;
END PROCESS;

END BEHAV;



先去掉复位部分,这样做前方真是可以,正确的,但是综合后仿真就输出就是红色的一根线了。加上复位,则综合后仿真输出有波形。看网上大多数的分频器都没有加复位,一定能行吗?

王的秋天 发表于 2013-11-11 01:04:50

没必要啊!

kandy286 发表于 2013-11-11 09:35:12

王的秋天 发表于 2013-11-11 01:04 static/image/common/back.gif
没必要啊!

如果没复位,综合后仿真不行啊

tangkuan660 发表于 2013-11-11 10:35:26

后仿真不行,是因为count 和clk_data没有赋初值,你可以在声明这两个变量时,给个初始值,那后仿真就对了,而且就不用复位也是可以的。

kandy286 发表于 2013-11-11 14:34:15

tangkuan660 发表于 2013-11-11 10:35 static/image/common/back.gif
后仿真不行,是因为count 和clk_data没有赋初值,你可以在声明这两个变量时,给个初始值,那后仿真就对了, ...

SIGNAL count : INTEGER RANGE 0 TO 256 := 0;
SIGNAL clk_data : std_logic := '0';

这样试也不行哦。是不是综合工具有问提。看到被人很多程序都没有复位的,而我的却要。

王的秋天 发表于 2013-11-11 16:37:13

kandy286 发表于 2013-11-11 09:35 static/image/common/back.gif
如果没复位,综合后仿真不行啊

我也有做过分频,我没有用复位端的

王的秋天 发表于 2013-11-11 16:45:58

module tfour(clk,clk1);
       
input clk;

output clk1;

parameter count_time=24;

integer time1;

reg clk1;

always@(posedge clk)

begin
       
        time1=time1+1;
       
        if(time1<=count_time/2)
       
                begin
               
                clk1=0;
               
                end
               
        else if(time1>count_time/2)
       
                begin
               
                clk1=1;
               
                if(time1==count_time)
               
                time1=0;
               
                end
        end
endmodule
这是用verilog 写的分频,楼主可以看一下,两种语言差不多的,我看楼主你的程序里面没有对count进行累加运算,怎么可能计算分频。思路应该是clk信号的每个脉冲上来,计数,然后当达到要分频的1/2时对count
进行清零。

kandy286 发表于 2013-11-11 16:57:02

王的秋天 发表于 2013-11-11 16:45 static/image/common/back.gif
module tfour(clk,clk1);
       
input clk;


IF(count = 255) THEN         
                count <= 0;   
                clk_data <= NOT clk_data;
            ELSE
                clk_data <= clk_data;
                count <= count + 1;
有的,有计数器的

王的秋天 发表于 2013-11-11 17:05:25

kandy286 发表于 2013-11-11 16:57 static/image/common/back.gif
IF(count = 255) THEN         
                count

我仿真了你的程序,没有错啊

王的秋天 发表于 2013-11-11 17:06:36

王的秋天 发表于 2013-11-11 17:05 static/image/common/back.gif
我仿真了你的程序,没有错啊

上面没有复位端,另外这个250的值太大了,如果end time选的太小了,就看不了全部的波形了

kandy286 发表于 2013-11-11 18:17:47

王的秋天 发表于 2013-11-11 17:06 static/image/common/back.gif
上面没有复位端,另外这个250的值太大了,如果end time选的太小了,就看不了全部的波形了 ...

你是直接仿真的还是综合后再仿真?

王的秋天 发表于 2013-11-11 19:29:43

kandy286 发表于 2013-11-11 18:17 static/image/common/back.gif
你是直接仿真的还是综合后再仿真?

直接仿真的了,综合后应该也一样的,里面又没有不可综合语句

kandy286 发表于 2013-11-11 21:43:34

王的秋天 发表于 2013-11-11 19:29 static/image/common/back.gif
直接仿真的了,综合后应该也一样的,里面又没有不可综合语句

我用这个就是前方真可以,综合后就不行了。。{:mad:}

王的秋天 发表于 2013-11-11 21:52:35

kandy286 发表于 2013-11-11 21:43 static/image/common/back.gif
我用这个就是前方真可以,综合后就不行了。。

我综合后再仿真,波形也很漂亮啊

kandy286 发表于 2013-11-11 23:00:27

王的秋天 发表于 2013-11-11 21:52 static/image/common/back.gif
我综合后再仿真,波形也很漂亮啊

我综合的结果是这样的。用的是synthesis综合工具。

王的秋天 发表于 2013-11-11 23:08:57

kandy286 发表于 2013-11-11 23:00 static/image/common/back.gif
我综合的结果是这样的。用的是synthesis综合工具。

你时钟周期多少,end time 多少

kandy286 发表于 2013-11-12 09:50:40

王的秋天 发表于 2013-11-11 23:08 static/image/common/back.gif
你时钟周期多少,end time 多少

跟这个没多大关系,我用的是50ns时钟, END TIME是50000 NS。

王的秋天 发表于 2013-11-12 12:14:53

kandy286 发表于 2013-11-12 09:50 static/image/common/back.gif
跟这个没多大关系,我用的是50ns时钟, END TIME是50000 NS。

呃……这个我就不知道了,不好意思,不过觉得不是程序问题的啦{:smile:}

kandy286 发表于 2013-11-12 19:30:53

王的秋天 发表于 2013-11-12 12:14 static/image/common/back.gif
呃……这个我就不知道了,不好意思,不过觉得不是程序问题的啦

哈哈,谢谢,我再研究一下。

avrwoo 发表于 2014-1-22 21:28:43

kandy286 发表于 2013-11-12 19:30
哈哈,谢谢,我再研究一下。

刚开始用modelsim仿真也碰到了类似的问题。好像没有复位信号的话,需把VHDL中定义的信号赋初值就可以了。但如果是QUARTUS中的波形仿真就不用给信号赋初值。
页: [1]
查看完整版本: VHDL设计分频器,为什么不用复位端?