亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

用VHDL受保护类型和访问指针实现动态链表

链表是一种动态数据结构,随元素增删而扩缩。VHDL的面向对象特性——访问类型、记录和受保护类型——使其能清晰高效地实现此结构。

创建DataStructures包

我们将所有链表逻辑封装在专用VHDL包DataStructures中。这个面向未来的名字便于日后扩展树、哈希图等结构。

package DataStructures is -- Public declarations go here end package DataStructures; package body DataStructures is -- Private declarations and implementations go here end package body DataStructures; 

VHDL包包含声明区(公共接口)和包体(私有实现)。声明区对用户可见;包体保持内部。

定义受保护类型

受保护类型在VHDL中如轻量级类。可包含子程序、类型声明和变量。我们定义名为LinkedList的受保护类型,暴露三个操作:Push、Pop和IsEmpty。

package DataStructures is type LinkedList is protected procedure Push(constant Data : in integer); impure function Pop return integer; impure function IsEmpty return boolean; end protected; end package DataStructures; package body DataStructures is type LinkedList is protected body end protected body; end package body DataStructures; 

引入Item记录

在包体内声明record表示节点。记录包含数据载荷和指向下一节点的指针。

type LinkedList is protected body type Item is record Data : integer; NextItem : Ptr; end record; end protected body; 

因受保护类型不能在声明区声明新类型,Item记录定义在包体内。

用访问类型处理指针

用访问类型Ptr动态引用Item实例。这种两步声明避免循环依赖。

type Item; type Ptr is access Item; type Item is record Data : integer; NextItem : Ptr; end record; 

根指针跟踪首节点。链表为空时Root为null。

variable Root : Ptr; 

实现链表操作

Push过程

追加新元素很简单:分配新Item,填充数据,链接到末尾。

procedure Push(Data : in integer) is variable NewItem : Ptr; variable Node : Ptr; begin NewItem := new Item; NewItem.Data := Data; if Root = null then Root := NewItem; else Node := Root; while Node.NextItem /= null loop Node := Node.NextItem; end loop; Node.NextItem := NewItem; end if; end; 

Pop函数

移除首元素需谨慎内存管理。VHDL无垃圾回收(2017前),显式释放被移除节点。

impure function Pop return integer is variable Node : Ptr; variable RetVal : integer; begin Node := Root; Root := Root.NextItem; RetVal := Node.Data; deallocate(Node); return RetVal; end; 

IsEmpty函数

impure function IsEmpty return boolean is begin return Root = null; end; 

测试链表

虽访问类型不可综合,但非常适合验证。测试平台演示链表行为。

导入包

library work; use work.DataStructures.LinkedList; 

使用共享变量

信号不能是受保护类型,故用共享变量允许多进程与链表交互。

architecture sim of LinkedListTb is shared variable List : LinkedList; begin -- Test process end architecture; 

完整测试平台

library work; use work.DataStructures.LinkedList; entity LinkedListTb is end entity; architecture sim of LinkedListTb is shared variable List : LinkedList; begin process is begin for i in 1 to 5 loop report "Pushing " & integer'image(i); List.Push(i); end loop; while not List.IsEmpty loop report "Popping " & integer'image(List.Pop); end loop; wait; end process; end architecture; 

DataStructures完整包

package DataStructures is type LinkedList is protected procedure Push(constant Data : in integer); impure function Pop return integer; impure function IsEmpty return boolean; end protected; end package DataStructures; package body DataStructures is type LinkedList is protected body type Item; type Ptr is access Item; type Item is record Data : integer; NextItem : Ptr; end record; variable Root : Ptr; procedure Push(Data : in integer) is variable NewItem : Ptr; variable Node : Ptr; begin NewItem := new Item; NewItem.Data := Data; if Root = null then Root := NewItem; else Node := Root; while Node.NextItem /= null loop Node := Node.NextItem; end loop; Node.NextItem := NewItem; end if; end; impure function Pop return integer is variable Node : Ptr; variable RetVal : integer; begin Node := Root; Root := Root.NextItem; RetVal := Node.Data; deallocate(Node); return RetVal; end; impure function IsEmpty return boolean is begin return Root = null; end; end protected body; end package body DataStructures; 

运行测试

在ModelSim执行时控制台显示:

# ** Note: Pushing 1 # ** Note: Pushing 2 # ** Note: Pushing 3 # ** Note: Pushing 4 # ** Note: Pushing 5 # ** Note: Popping 1 # ** Note: Popping 2 # ** Note: Popping 3 # ** Note: Popping 4 # ** Note: Popping 5 

输出确认链表正确按FIFO顺序存取值。

VHDL

  1. VHDL 字符串列表创建:最佳实践与示例
  2. 基于 Tcl 驱动的 VHDL 密码锁模块测试平台
  3. 优雅结束 VHDL 测试平台仿真
  4. VHDL 实现 PWM 控制器:设计、仿真与 FPGA 演示
  5. VHDL 生成随机数:从均匀分布到 OSVVM
  6. 在块RAM中设计健壮的VHDL环形缓冲区FIFO
  7. 构建VHDL自检测试平台实战指南
  8. 利用进程内过程简化VHDL状态机设计
  9. 使用VHDL不纯函数提升FSM可读性与可维护性
  10. 掌握VHDL函数:高效设计实战指南
  11. 用VHDL设计有限状态机:红绿灯实战范例
  12. 在VHDL中使用过程:用可复用代码简化设计