verilog这段代码的输出怎样去掉毛刺
library ieee;use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter8 is
port( clk_Mfo: in std_logic;
rst : in std_logic;
clk_out_2Nfo : out std_logic);
end entity;
architecture behave of counter8 is
signal cq : std_logic_vector(2 downto 0);
signal temp : std_logic;
begin
P1:process(clk_Mfo,rst,cq)
begin
if rst = '0' then cq <= "000";
elsif clk_Mfo'event and clk_Mfo = '1' then
cq <= cq + 1;
if cq = "111" then
cq <= "000";
end if;
end if;
end process P1;
P2:process(clk_Mfo,cq)
begin
if cq(0) = '0' then temp <= '0';
elsif cq(1) = '0' then temp <= '0';
elsif cq(2) = '0' then temp <= '0';
else temp <= clk_Mfo;
end if;
end process P2;
clk_out_2Nfo <= temp;
end behave;
从000开始计数,到111输出一个正脉冲,且保证正脉冲的宽度和输入时钟正脉冲宽度一致 if (cp==3'b111)<br>
clk_out2 <= clk_in<br>
you can try 现在知道了 由于<br>
P4:process(clk_Mfo,cq)<br>
begin<br>
if cqa(0) = '0' then tempa <= '0';<br>
elsif cqa(1) = '0' then tempa <= '0';<br>
elsif cqa(2) = '0' then tempa <= '0';<br>
else tempa <= clk_Mfo;<br>
end if;<br>
end process P4;<br>
毛刺在计数器转态时有可能出现<br>
<br>
<br>
更改如下:<br>
P4:process(clk_Mfo,cq)<br>
begin<br>
if rst = '0' then <br>
tempa <= '0';<br>
elsif clk_Mfo'event and clk_Mfo = '1' then<br>
case cq is<br>
when "000" => tempa <= '0'; <br>
when "001" => tempa <= '0'; <br>
when "010" => tempa <= '0'; <br>
when "011" => tempa <= '0'; <br>
when "100" => tempa <= '0'; <br>
when "101" => tempa <= '0'; <br>
when "110" => tempa <= '0'; <br>
when others => null; <br>
end case; <br>
<br>
end if;<br>
end process P4;<br>
<br>
temp <= clk_Mfo when cq="111" else tempa; <br>
<br>
<br>
output只有在 clk_Mfo变化才改变,不受计数器转态时的瞬间电平影响。 楼上的也不一定可行,谁仿真一下贴来结果看看<br>
应该是在011变100,111变000时多位变化引起的毛刺<br>
其实,计数方式改成格雷码,约翰逊计数方式就不会产生毛刺了<br>
<br>
[ 本帖最后由 dieyi31 于 2006-9-11 22:43 编辑 ] 回帖挣钱,帮你顶。 试了试,改成下面这样,还有毛刺!<br>
library ieee;<br>
use ieee.std_logic_1164.all;<br>
use ieee.std_logic_unsigned.all;<br>
<br>
entity count8 is<br>
port( clk_Mfo : in std_logic;<br>
rst : in std_logic;<br>
clk_out_2Nfo : out std_logic);<br>
end entity;<br>
<br>
architecture behave of count8 is<br>
signal cq : std_logic_vector(2 downto 0);<br>
signal temp,tempa : std_logic;<br>
begin<br>
<br>
P1:process(clk_Mfo,rst,cq)<br>
begin<br>
if rst = '0' then cq <= "000";<br>
elsif clk_Mfo'event and clk_Mfo = '1' then<br>
cq <= cq + 1;<br>
if cq = "111" then <br>
cq <= "000";<br>
<br>
end if;<br>
end if;<br>
end process P1;<br>
<br>
P4:process(clk_Mfo,cq)<br>
begin<br>
if rst = '0' then <br>
tempa <= '0';<br>
elsif clk_Mfo'event and clk_Mfo = '1' then<br>
case cq is<br>
when "000" => tempa <= '0'; <br>
when "001" => tempa <= '0'; <br>
when "010" => tempa <= '0'; <br>
when "011" => tempa <= '0'; <br>
when "100" => tempa <= '0'; <br>
when "101" => tempa <= '0'; <br>
when "110" => tempa <= '0'; <br>
when others => null; <br>
end case; <br>
<br>
end if;<br>
end process P4;<br>
<br>
temp <= clk_Mfo when cq="111" else tempa; <br>
<br>
clk_out_2Nfo <= temp;<br>
end behave; 一般的如果是在组合逻辑中,<br>
有计数器输出的不同位的计算操作的时候,<br>
正常计数由于可能会一次变化多个位,可能会使电路产生毛刺<br>
比如楼主帖子的正常输出高电平脉冲前面那个毛刺,<br>
就是在计数器由101->110的时候,可能cq新值尚未到达(仍为1),<br>
但此时cq新值1已经到达,则会产生一个 111,产生一个毛刺。(别的地方没有产生不知道为什么,可能小延迟不同。)<br>
这种毛刺问题,解决的最好的方法,就是用gray码计数,使得计数输出每次只变化一位。 但是楼主帖子中后面的那个由111->000 变化时产生的毛刺,用gray码应该是无法避免的。<br>
原因很清楚,因为你的cq的变化取决于clk的变化,所以cq从111变化到000总是在clk一个上升沿变化之后<br>
此时,clk的变化引起了p4的运行,则产生了一个毛刺。<br>
<br>
上面是我针对这个题目的想法,不知道对否,欢迎讨论。 斑竹的裹脚,又长又臭
页:
[1]
2