原创 枚举类型到逻辑向量的转换(VHDL)

2009-3-21 12:10 4522 6 7 分类: FPGA/CPLD

SOPC下面挂了一个I2C Slave的外设,用了几天之后发现经常会发生I2C Slave的状态机死锁,发生时间在几天到几周,想到了用Virtual JTAG来观察状态机的跳转以及其他寄存器在死锁之后的值,问题就是,RTL描述采用VHDL,其状态机的状态值用枚举变量描述,无法对应到确定位宽的逻辑向量,查阅了一些VHDL书籍之后,可以用下述方法把枚举值转化到逻辑向量,不需要将原先的枚举值换成常量值:


type state is (one, two, three);


signal cursts : state;


signal stsout1: std_logic_vector(2 downto 0);


 


type sts2slv is array(state) of std_logic_vector(2 downto
0);


constant val_sts2slv : sts2slv := (


  "001",        -- one


  "010",        -- two


"100");              --
three


下面的进程将cursts的当前状态转换至std_logic_vector(2 downto 0)


  process (clk,
rst)


  begin  -- process


    if rst = '1' then                   -- asynchronous reset
(active high)


      stsout1 <= (others
=> '0');


    elsif rising_edge(clk)
then


      stsout1 <=
val_sts2slv(cursts);


    end if;


end process;


RTL Viewer如下:

点击开大图

QuartusII的综合结果描述如下:


1、     
综合器为状态机cursts选定状态编码,可以是001010100,也可以不是;


2、     
状态编码值到val_sts2slv的组合逻辑转换;


3、     
锁存输出;


利用上面的做法,将状态值转换到确定的逻辑向量,不需要更改原先State枚举类型定义,当我们不需要监视状态时,直接将上述代码注释掉即可,较为灵活。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户187793 2009-10-4 18:38

写的很好!:)
相关推荐阅读
用户1122702 2015-12-20 21:29
在Emacs中应用Ctags
适宜人群 具备Emacs使用经验的程序员 什么是Tag? Tag,即标记,记录了程序重要信息(如函数、变量、宏定义等)的位置和相应的文件,方便程序浏览器进行跳转。 ...
用户1122702 2015-12-13 22:23
可综合的SystemVerilog:命名空间
关键名词解释: 编译单元(compilation unit):SystemVerilog 源代码的集合 编译单元域(compilation-unit scope):即编...
用户1122702 2015-12-13 22:15
可综合的SystemVerilog:参数化函数/任务
在Verilog中,参数化模块被广泛应用。参数可重新定义保证模块的可配置性及可复用性。但是,函数及任务并无法像模块一样被参数化,减弱了Verilog的描述化能力。 SystemVer...
用户1122702 2010-10-28 11:34
基于SOPC下RapidIO调试方法
RapidIO的一个难点在于地址转换方法,即将远端的Memory映射到当前Avalon-MM总线,所以地址需要一个转换过程——Local Avalon-MM<->RapidIO Addr&...
用户1122702 2010-08-24 14:22
西行重庆
八月初时离开生活并工作四年的深圳,来到求学四年的重庆。已经过去三周时间,对自己的将来也随之变的不可琢磨。重庆的生活水平并不如想象的低,除了房价不像沿海城市高企,其他诸如公共交通,生活日常用品基本都是一...
用户1122702 2010-07-07 18:05
Tcl用后感
                    Tcl用后感 (by Wind330)    Tcl - Tool Command Language近期做了一个Tcl脚本用于Modelsim仿真,完成如下功能...
我要评论
1
6
关闭 站长推荐上一条 /1 下一条