如何在VHDL中实现链接列表?

时间:2018-11-15 01:28:19

标签: linked-list vhdl

是否可以在VHDL中创建链接列表? (例如,在零时间读取文件并将所有值加载到文件中吗?)

1 个答案:

答案 0 :(得分:0)

我认为有可能。不仅是注释中提到的静态列表,而且还是动态列表。 我的解决方案是使用RAM(很可能是Block RAM,但这实际上取决于体系结构),然后在其中存储所需数据以及指向下一项的指针以及有效位(可选)和“ last”标志。看起来像这样:

                     RAM 
  Addr0   -> | Valid0 & Last0 & Data0 & Pointer0 |
  Addr1   -> | Valid1 & Last1 & Data1 & Pointer1 |
               ...
  AddrN   -> | ValidN & LastN & DataN & PointerN |

因此,例如,在初始化之后,假设一些随机数据并且链表已按N个值(和非循环列表)的顺序加载,则它可能类似于:

                        RAM 
                        V   L   Data     Pointer
  Addr0(0000000)   -> | 1 & 0 & XXXXXX & 0000001 |
  Addr1(0000001)   -> | 1 & 0 & YYYYYY & 0000010 |
                       ...
  AddrN(xxxxxx0)   -> | 1 & 1 & ZZZZZZ & 0000000 |

此后,可以根据需要更改RAM的内容。例如,要“删除”元素1(在addr = Addr1中),应更改Pointer0和Valid1:

                        RAM 
                        V   L   Data     Pointer
  Addr0(0000000)   -> | 1 & 0 & XXXXXX & 0000010 |
  Addr1(0000001)   -> | 0 & 0 & YYYYYY & 0000010 |
  Addr1(0000010)   -> | 1 & 0 & MMMMMM & 0000011 |
               ...
  AddrN(xxxxxx0)   -> | 1 & 1 & ZZZZZZ & 0000000 |

或在element0和element1之间添加元素:

                        RAM 
                        V   L   Data     Pointer
  Addr0(0000000)   -> | 1 & 0 & XXXXXX & xxxxxx1 |
  Addr1(0000001)   -> | 1 & 0 & YYYYYY & 0000010 |
  Addr1(0000010)   -> | 1 & 0 & MMMMMM & 0000011 |
               ...
  AddrN(xxxxxx0)   -> | 1 & 1 & ZZZZZZ & 0000000 |
  AddrN(xxxxxx1)   -> | 1 & 0 & ZZZZZZ & 0000001 |

同样,这只是一个想法,可以进行一些改进。其中一种方法是使用记录类型,而不是进行串联以便于使用(如果使用块Ram,则必须将其转换为普通的std_logic_vector,但这取决于体系结构)。

祝你好运!