原创 同步FIFO之VHDL描述5(大结局)

2007-2-4 20:37 3978 11 14 分类: FPGA/CPLD

同步FIFOVHDL描述5


       昨天晚上把所有的模块描述都完成了,同时还完成了双端口RAM的后仿真,从目前的仿真结果来看,应该没有什么问题。今天的任务就是把这些模块组装起来并完成前后仿真,这样同步FIFOVHDL描述就算全部完成了。按照前面的思路和框图,把这些模块组装起来应该很简单,下面就直接给出VHDL代码。当然组装的过程还要排查除了双口RAM以外电路的代码描述有没有问题,如果有问题的话就就地改正了,呵呵。


       在代码的集成和仿真的时候还真发现了一些问题,主要包括数据的寄存,以及空满状态判断上,最后的代码使用Quartus II6.0综合和布局布线,选用的是CycloneII系列的器件,并用Modelsim进行了功能仿真和时序仿真,两种仿真均通过。下面主要是集成的定层文件和时序仿真图(图1,图2,图3,图4,图5


 


---------------------------------------------------------------------------------------------------------<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


-- Designer            :      skycanny


-- Date                  :      2007-2-4


-- Description :      Synchronous FIFO created by VHDL


library ieee;


use ieee.std_logic_1164.all;


use ieee.std_logic_unsigned.all;


use ieee.std_logic_arith.all;


 


entity sfifo is


       generic


       (


              width      :      positive   := 16;


              depth      :      positive   := 8


       );


       port


       (


              clk          :      in     std_logic;


              rst          :      in     std_logic;


              wq          :      in     std_logic;


              rq           :      in     std_logic;


              data :      in     std_logic_vector(width - 1 downto 0);


              q            :      out   std_logic_vector(width - 1 downto 0);


              empty     :      out   std_logic;


              full   :      out   std_logic


       );


end entity sfifo;


-----------------------------------------------------------------------------------------------------------


architecture structure of sfifo is


signal      empty_t   :      std_logic;


signal      full_t       :      std_logic;


signal      wr_pt      :      std_logic_vector(depth - 1 downto 0);


signal      rd_pt       :      std_logic_vector(depth - 1 downto 0);


signal      wr          :      std_logic;


signal      rd           :      std_logic;


component write_pointer


       generic


       (


              depth      :      positive   :=8  


       );


       port


       (


              clk          :      in     std_logic;


              rst          :      in     std_logic;


              wq          :      in     std_logic;


              full          :      in     std_logic;


              wr          :      out   std_logic;


              wr_pt      :      out   std_logic_vector(depth - 1 downto 0)         


       );


end component;


component read_pointer


       generic


       (


              depth      :      positive   :=8  


       );


       port


       (


              clk          :      in     std_logic;


              rst          :      in     std_logic;


              rq           :      in     std_logic;


              empty     :      in     std_logic;


              rd           :      out   std_logic;


              rd_pt       :      out   std_logic_vector(depth - 1 downto 0)         


       );


end component;


 


component judge_status


       generic


       (


              depth      :      positive :=8


       );


       port


       (


              clk          :      in     std_logic;


              rst          :      in     std_logic;


              wr_pt      :      in     std_logic_vector(depth - 1 downto 0);


              rd_pt       :      in     std_logic_vector(depth - 1 downto 0);


              empty     :      out   std_logic;


              full   :      out   std_logic


       );


end component;


component dualram


       generic


       (


              width      :      positive   := 16;


              depth      :      positive   := 8


       );


       port


       (


              ------------------------- port a is only for writing -------------------------------


              clka :      in     std_logic;


              wr          :      in     std_logic;


              addra      :      in     std_logic_vector(depth - 1 downto 0);


              datain      :      in     std_logic_vector(width - 1 downto 0);


              ------------------------------------------------------------------------------------


              ------------------------- port b is only for reading -------------------------------


              clkb :      in     std_logic;


              rd           :      in     std_logic;


              addrb      :      in     std_logic_vector(depth - 1 downto 0);


              dataout    :      out   std_logic_vector(width - 1 downto 0)         


              ------------------------------------------------------------------------------------


       );


end component;


begin


       empty <= empty_t;


       full <= full_t;


       u0    :      dualram


       generic map


       (


              width => width,


              depth => depth


       )


       port map


       (


              --------=>


        clka        => clk,


        wr          => wr,


        addra      => wr_pt,


        datain      => data,


        --------=>


        --------=>


        clkb => clk,


        rd           => rd,


        addrb      => rd_pt,


        dataout    => q


       );


u1    :      write_pointer


       generic map


       (


              depth => depth


       )


       port map


       (


              clk          => clk,


           rst          => rst,


           wq          => wq,


           full          => full_t,


           wr          => wr,


           wr_pt      => wr_pt


       );


      


       u2    :      read_pointer


       generic map


       (


              depth => depth


       )


       port map


       (


              clk          => clk,   


           rst          => rst,


           rq           => rq,


           empty     => empty_t,


           rd           => rd,


           rd_pt       => rd_pt                       


       );


      


       u3    :      judge_status


       generic map


       (


              depth => depth


       )


       port map


       (


              clk          => clk,


           rst          => rst,


           wr_pt      => wr_pt,


           rd_pt       => rd_pt,


           empty     => empty_t,


           full   => full_t 


       );


       end structure;


 


点击看大图


                                                                


                                                          图1 时序仿真图全貌


 


点击看大图


 


                                                                2写数据到空的FIFO


 


点击看大图


                                                                                                                               3 FIFO被写满


 


点击看大图


                                                                                                                             4 FIFO被读空


 


点击看大图


                                                                       


                                                                   图5 同时对FIFO进行读写


 


从上面的时序仿真图来看,同步FIFOVHDL描述满足设计要求,可以在需要应用到的地方直接调用,同时支持参数话的调用,以满足不同的应用需求。大家如果有什么关于这个FIFO实现的问题可以直接提问,我回尽快回复,另外不要忘了投票哟。最后欢迎大家访问skycanny的笔记(副站)


 


 


 


 


 


 

文章评论3条评论)

登录后参与讨论

用户413787 2012-4-22 09:49

帮忙发一份电子原理图2860600927@qq.com,谢谢

用户1603976 2008-12-18 16:28

可以把文中出现的图片发一份给我吗?想进一步学习 先谢谢了 邮箱:jzd19851102@126.com

用户1603976 2008-12-18 16:27

可以把文中出现的图片发一份给我吗?想进一步学习 先谢谢了 邮箱:jzd19851102@126.com 谢谢啦!

用户1603976 2008-12-18 16:26

可以把文中出现的图片发一份给我吗?想进一步学习 先谢谢了 邮箱:jzd19851102@126.com 谢谢啦!

用户182190 2008-12-14 13:33

可以把文中出现的图片发一份给我吗?想进一步了解。写的很好奥!邮箱:zjnuist@126.com 谢谢啦!

用户1318941 2008-10-30 18:13

正在学习测温,太感谢了~加油!

用户1318941 2008-10-30 18:13

正在学习测温,太感谢了~加油!

用户1542863 2008-8-27 14:49

帮忙发一份吧 需要电路图 谢谢了! 期待……

用户1542863 2008-8-27 14:48

帮忙发一份吧 谢谢了! 期待……

用户37261 2008-4-17 07:22

急求那几张图片,请给我发一份吧 francesco1127@yeah.com 感谢!
相关推荐阅读
用户60452 2008-11-14 20:53
原创java连载--泛型(7)
类型擦除(Type Erasure)       当我们实例化一个泛型的时候,编译器使用一种叫做类型擦除(type erasure)的技术。在类型擦除的过程中,编译器会去除掉 类与接口中所有和类型参数...
用户60452 2008-11-13 22:08
原创java连载--泛型(6)
通配符       在泛型中,我们可以用一个通配符”?”来代替一个未知的类型。例如,使用下面的代码为某种animal指定一个cage:Cage<? extends Animal> some...
用户60452 2008-11-12 20:59
原创java连载--泛型(5)
泛型的子类型       只要两种类型能够相符,我们可以把一种类型的对象赋给另外一种类型的对象。例如,可以把一个Integer赋给一个Object,因为Object是Integer的父类之一。    ...
用户60452 2008-11-10 22:20
原创java连载--泛型(4)
受限的类型参数(Bounded Type Parameters)       有时候,我们要限制传递给类型参数的具体参数。例如,对数进行操作的方法就只能接受Number或者其子类的对象作为改方法的参数...
用户60452 2008-11-09 21:49
原创java连载--泛型(3)
泛型方法和构造器       如果在申明方法或者构造器的时候使用类型参数的话,就可以定义泛型方法和泛型构造器。这和定义一个普通的泛型基本上无二样,除了类型参数的作用范围只是在定义它的方法或者构造器之中...
用户60452 2008-11-08 19:13
原创java连载--泛型(2)
我们可以通过将"public class Box" 修改为 "public class Box<T>"而定义一个泛型,在这个定义中,使用了一个类型变量(type variable) T,而...
我要评论
3
11
关闭 站长推荐上一条 /2 下一条