原创 重写异步复位同步释放之VHDL

2012-12-3 12:33 5056 9 9 分类: FPGA/CPLD 文集: ALTERA FPGA

        之前有两篇关于异步复位同步释放的帖子,其中讨论用VHDL实现的想再在此议议。


        我们确定在此只讨论复位信号‘1’有效的情况。


        最初那篇帖子里代码如下:


library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;



entity Rst_Async2Sync is  
    port (
      clkin :            in std_logic;
    async_rst :          in std_logic; 
    sync_rst :         out std_logic  
     ); 
end Rst_Async2Sync;
       
architecture rtl of Rst_Async2Sync is
signal Sync_rst1,Sync_rst2: std_logic;
begin


process(clkin,async_rst)
begin
   if async_rst='1' then
      Sync_rst1 <= '1';
   elsif clkin'event and clkin='1' then
      Sync_rst1 <= '0';
   end if;  
end process;
process(clkin,async_rst)
begin
   if async_rst='1' then
      Sync_rst2 <= '1';
   elsif clkin'event and clkin='1' then
      Sync_rst2 <= Sync_rst1;
   end if;  
end process;
sync_rst <= Sync_rst2;


end ;


上述代码编译后map view如下:


点击看大图



从上图我们可以看到工具插入了三个not gates(如红方格)。


 


 


把上述代码稍作修改如下:


process(clkin,async_rst)
begin
   if async_rst='0' then
      Sync_rst1 <= '0';
   elsif clkin'event and clkin='1' then
      Sync_rst1 <= '1';
   end if;  
end process;
process(clkin,async_rst)
begin
   if async_rst='0' then
      Sync_rst2 <= '0';
   elsif clkin'event and clkin='1' then
      Sync_rst2 <= Sync_rst1;
   end if;  
end process;
sync_rst <= Sync_rst2;


那么编译后map view看到:


点击看大图


这次工具没有插入任何not gates。


 


 


上面两段代码实现的功能一样,显然我们更推荐第一种写法。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /3 下一条