微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 太奇怪啦!不可能!

太奇怪啦!不可能!

时间:10-02 整理:3721RD 点击:
CLK 100K的方波。 BUFY1 STD_logic_VECTOR(13 DOWNTO 0);
OUT 为脉冲输出口,BUFY1减两次,输出一个脉冲。REST为输入口。
不停的记数,当BUFY1为空,REST为高,停止记数。但是,我频繁的停止记数,OUT输出口的脉冲数不准。有多有少。 为何?求高人指点,我都快没信心了!
PROCESS(CLK,BUFY1)
BEGIN
IF BUFY1="00000000000000" THEN
IF REST='1' THEN
BUFY1<="00000000000000";
ELSE
BUFY1<="00000011001000";--200
END IF;
ELSIF CLK' EVENT AND CLK='1' THEN
BUFY1<=BUFY1-1;
XAXA2<=NOT XAXA2;
END IF;
END PROCESS;

OUT<=XAXA2;

太奇怪啦!不可能!
PROCESS(CLK,REST)
BEGIN
IF REST='0' THEN
BUFY1<="00000011001000";--200
XAXA2<='0'
ELSIF CLK' EVENT AND CLK='1' THEN
IF(BUFY1 = "00000000000000")
BUFY1 = "00000000000000";
XAXA2<='0';
ELSE
BUFY1<=BUFY1-1;
XAXA2<=NOT XAXA2;
END IF;
END IF;
END IF;
END PROCESS;

OUT<=XAXA2;

太奇怪啦!不可能!
你的思路有问题
VHDL好久不用,不知道是否有错误

太奇怪啦!不可能!
是啊,,你没弄明白异步!

太奇怪啦!不可能!
PROCESS(CLK,REST)
BEGIN
IF REST='0' THEN
BUFY1<="00000011001000";--200
XAXA2<='0'
ELSIF CLK' EVENT AND CLK='1' THEN
IF(BUFY1 = "00000000000000")
BUFY1 = "00000000000000";
XAXA2<='0';
ELSE
BUFY1<=BUFY1-1;
XAXA2<=NOT XAXA2;
END IF;
END IF;
END IF;
END PROCESS;

OUT<=XAXA2;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我试了一下,不行。我觉的你的思路和我的一样。思路有问题?能不能说明白点?

太奇怪啦!不可能!
是啊,,你没弄明白异步!
…………………………………………………………………………
同步和异步我都试过。效果都一样。
PROCESS(CLK,BUFY1)--异步?
BEGIN
IF BUFY1="00000000000000" THEN
IF REST='1' THEN
BUFY1<="00000000000000";
ELSE
BUFY1<="00000011001000";--200
END IF;
ELSIF CLK' EVENT AND CLK='1' THEN
BUFY1<=BUFY1-1;
XAXA2<=NOT XAXA2;
END IF;
END PROCESS;

OUT<=XAXA2;

PROCESS(CLK,BUFY1)--同步?
BEGIN
IF CLK' EVENT AND CLK='1' THEN
IF BUFY1="00000000000000" THEN
IF REST='1' THEN
BUFY1<="00000000000000";
ELSE
BUFY1<="00000011001000";--200
END IF;
ELSE
BUFY1<=BUFY1-1;
XAXA2<=NOT XAXA2;
END IF;
END IF;
END PROCESS;

OUT<=XAXA2;

太奇怪啦!不可能!
PROCESS(CLK)--同步?
BEGIN
IF CLK' EVENT AND CLK='1' THEN
IF BUFY1="00000000000000" THEN
IF REST='1' THEN
BUFY1<="00000000000000";
ELSE
BUFY1<="00000011001000";--200
XAXA2<=‘0’;
END IF;
ELSE
BUFY1<=BUFY1-1;
XAXA2<=NOT XAXA2;
END IF;
END IF;
END PROCESS;

OUT<=XAXA2;
在时钟信号CLK的上升沿,假如BUFY1=0 AND REST=‘1’ 停止记数;
假如BUFY1=0 AND REST=‘0’ 计数器输入初值200;
假如BUFY1/=0 计数器减一;
在时钟信号CLK的上升沿,假如BUFY1/=0,REST不论为高还是低,都不应该影响 BUFY1的记数。但是我如果频繁的改变REST,计数器输出的值就不对。这如何解释?

太奇怪啦!不可能!
PROCESS(CLK,REST)
BEGIN
IF REST='0' THEN
BUFY1<="00000011001000";--200
XAXA2<='0'
ELSIF CLK' EVENT AND CLK='1' THEN
IF BUFY1 /= "00000000000000" THEN
BUFY1<=BUFY1-1;
XAXA2<=NOT XAXA2;
END IF;
END IF;
END IF;
END PROCESS;

OUT<=XAXA2;

REST='1' 才记数,但是,假如BUFY1不为0,REST='0' ,那不就不对了吗?

太奇怪啦!不可能!
REST是计数使能信号还是复位信号

太奇怪啦!不可能!
REST是计数使能信号还是复位信号
…………………………………………………………
REST为高复位(为高就停止记数),REST为低初始化。

那什么时候计数呢

太奇怪啦!不可能!
PROCESS(CLK)--同步
BEGIN
IF CLK' EVENT AND CLK='1' THEN
IF BUFY1="00000000000000" THEN
IF REST='1' THEN
BUFY1<="00000000000000";
ELSE
BUFY1<="00000011001000";--200
XAXA2<=‘0’;
END IF;
ELSE
BUFY1<=BUFY1-1;
XAXA2<=NOT XAXA2;
END IF;
END IF;
END PROCESS;

假如,REST为高复位(为高就停止记数),REST为低初始化。初始化后BUFY1/=0,
下一个CLK来的时候就记数。BUFY1/=0,REST没有用。

太奇怪啦!不可能!
entity pulse is
Port (reset: in std_logic;
clk: in std_logic;
bufy1ut std_logic_vector(0 to 13);
outt: out std_logic );
end pulse;
architecture Behavioral of pulse is
signal regoutt: std_logic;
signal bufferr:std_logic_vector(13 downto 0);
begin
PROCESS(clk,reset)
BEGIN
if reset='1' then
bufferr<="00000011001000";
regoutt<='0';
elsif clk' event and clk='1'then
if(bufferr>"00000000000000")then
bufferr<=bufferr-'1';
regoutt<=not regoutt;
end if;
end if;

END PROCESS;

outt<=regoutt;
bufy1<=bufferr;
end Behavioral;
你看这样行么?大致写了一下,,而且我也一直没用vhdl了,,,

太奇怪啦!不可能!
PROCESS(clk,reset)
BEGIN
if reset='1' then
bufferr<="00000011001000";
regoutt<='0';
elsif clk' event and clk='1'then
if(bufferr>"00000000000000")then
bufferr<=bufferr-'1';
regoutt<=not regoutt;
end if;
end if;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我必须等到bufferr=0的时候才对bufferr赋值。才能保证每次都只有100个脉冲输出。
并且reset是随机的。
PROCESS(clk,reset)
BEGIN
IF bufferr="000000000000" THEN
if reset='1' then
bufferr<="00000011001000";
regoutt<='0';
END IF;
elsif clk' event and clk='1'then
if(bufferr>"00000000000000")then
bufferr<=bufferr-'1';
regoutt<=not regoutt;
end if;
end if;
这样没有问题吧?

太奇怪啦!不可能!
我把同样的程序写到CPLD上,但是效果一样,是不是可以排除硬件问题,就是软件出错。
我还是不明白错在那里?就这十几段程序。

太奇怪啦!不可能!
是不是毛刺问题?
我改成同步复位,效果要比异步复位好一点,但是还是要出错。
加个触发器可以去毛刺?

太奇怪啦!不可能!
将包括同步复位在内的所有逻辑都放到if clk' event and clk='1'then下去,就不会有任何问题了。

太奇怪啦!不可能!
将包括同步复位在内的所有逻辑都放到if clk' event and clk='1'then下去,就不会有任何问题了

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PROCESS(CLK)--同步
BEGIN
IF CLK' EVENT AND CLK='1' THEN
IF BUFY1="00000000000000" THEN
IF REST='1' THEN
BUFY1<="00000000000000";
ELSE
BUFY1<="00000011001000";--200
END IF;
ELSE
BUFY1<=BUFY1-1;
XAXA2<=NOT XAXA2;
END IF;
END IF;
END PROCESS;

OUT<=XAXA2;
这样?我试过,也不对。

太奇怪啦!不可能!
REST为组合逻辑产生的信号,有毛刺,用来复位和置位,很危险。
CLK也是组合逻辑产生的,也可能有毛刺。
毛刺真是个头痛的问题。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top