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 static/image/common/back.gif
没必要啊!
如果没复位,综合后仿真不行啊 后仿真不行,是因为count 和clk_data没有赋初值,你可以在声明这两个变量时,给个初始值,那后仿真就对了,而且就不用复位也是可以的。 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';
这样试也不行哦。是不是综合工具有问提。看到被人很多程序都没有复位的,而我的却要。 kandy286 发表于 2013-11-11 09:35 static/image/common/back.gif
如果没复位,综合后仿真不行啊
我也有做过分频,我没有用复位端的 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
进行清零。 王的秋天 发表于 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;
有的,有计数器的 kandy286 发表于 2013-11-11 16:57 static/image/common/back.gif
IF(count = 255) THEN
count
我仿真了你的程序,没有错啊 王的秋天 发表于 2013-11-11 17:05 static/image/common/back.gif
我仿真了你的程序,没有错啊
上面没有复位端,另外这个250的值太大了,如果end time选的太小了,就看不了全部的波形了 王的秋天 发表于 2013-11-11 17:06 static/image/common/back.gif
上面没有复位端,另外这个250的值太大了,如果end time选的太小了,就看不了全部的波形了 ...
你是直接仿真的还是综合后再仿真? kandy286 发表于 2013-11-11 18:17 static/image/common/back.gif
你是直接仿真的还是综合后再仿真?
直接仿真的了,综合后应该也一样的,里面又没有不可综合语句 王的秋天 发表于 2013-11-11 19:29 static/image/common/back.gif
直接仿真的了,综合后应该也一样的,里面又没有不可综合语句
我用这个就是前方真可以,综合后就不行了。。{:mad:} kandy286 发表于 2013-11-11 21:43 static/image/common/back.gif
我用这个就是前方真可以,综合后就不行了。。
我综合后再仿真,波形也很漂亮啊 王的秋天 发表于 2013-11-11 21:52 static/image/common/back.gif
我综合后再仿真,波形也很漂亮啊
我综合的结果是这样的。用的是synthesis综合工具。 kandy286 发表于 2013-11-11 23:00 static/image/common/back.gif
我综合的结果是这样的。用的是synthesis综合工具。
你时钟周期多少,end time 多少
王的秋天 发表于 2013-11-11 23:08 static/image/common/back.gif
你时钟周期多少,end time 多少
跟这个没多大关系,我用的是50ns时钟, END TIME是50000 NS。 kandy286 发表于 2013-11-12 09:50 static/image/common/back.gif
跟这个没多大关系,我用的是50ns时钟, END TIME是50000 NS。
呃……这个我就不知道了,不好意思,不过觉得不是程序问题的啦{:smile:} 王的秋天 发表于 2013-11-12 12:14 static/image/common/back.gif
呃……这个我就不知道了,不好意思,不过觉得不是程序问题的啦
哈哈,谢谢,我再研究一下。 kandy286 发表于 2013-11-12 19:30
哈哈,谢谢,我再研究一下。
刚开始用modelsim仿真也碰到了类似的问题。好像没有复位信号的话,需把VHDL中定义的信号赋初值就可以了。但如果是QUARTUS中的波形仿真就不用给信号赋初值。
页:
[1]