[编辑]我现在正在研究一个DMA控制器模型,我正在编写3个与同一时钟并行工作的进程, 两个主要进程访问相同的寄存器,但我确保它们永远不会使用“if”情况来检查某些值, 第一种使用“clr”信号清除寄存器数据的情况 这里的问题是值总是“xxxx”而第二个过程中的If条件总是为真[编辑:信号'x'用于确定if条件是真还是假,波形输出是'1'这意味着这个条件不是与data_out冲突的条件,虽然data_out仍然是X,所以是什么导致冲突?
library ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.numeric_std.ALL;
ENTITY DMAC_CHANNEL_REG_BANK IS
port(
clr : IN STD_LOGIC; -- async. clear.
clk : IN STD_LOGIC; -- clock.
-- Slave Signals
HRData : OUT STD_LOGIC_vector(31 downto 0); -- Data to be READ by the AHB SLAVE INTERFACE
HWData : in std_logic_vector(31 DOWNTO 0); -- data to be written in the REGISTER from the AHB SLAVE INTERFACE
HAddr : in std_logic_vector(9 downto 0); -- Address for the Register to be programmed -- from AHB SLAVE INTERFACE
);
END DMAC_CHANNEL_REG_BANK;
ARCHITECTURE description OF DMAC_CHANNEL_REG_BANK IS
Component Register32 is
PORT(
input : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- input.
enable : IN STD_LOGIC; -- Write/enable.
clr : IN STD_LOGIC; -- async. clear.
clk : IN STD_LOGIC; -- clock.
output : OUT STD_LOGIC_vector(31 downto 0)
); -- end of port
end component;
type Arr40x32 is array (39 downto 0) of std_logic_vector(31 downto 0);
signal data_out : Arr40x32;
signal data_in : STD_LOGIC_vector(31 downto 0);
type State_type_logic is (IDLELOGIC);
signal PresentStateLOGIC, NextStateLOGIC : State_type_logic := IDLELOGIC;
signal C0Config: std_logic_vector(31 downto 0);
signal x : std_logic := '0';
BEGIN
--CHANNEL 0 REGISTERS--
DMACC0_SRCADD : Register32 port map (data_in,channel_enable(0),clr,clk,data_out(0));
DMACC0_Config : Register32 port map (data_in,channel_enable(1),clr,clk,data_out(1));
Logic : process (clk,PresentStateLogic,DMAC_ENABLE)
begin
case PresentStateLogic is
when IDLELOGIC =>
C0Config <= data_out(1);
--- Cleaning data of the inactive channels
if C0CONFIG(0) = '0' and C0CONFIG(17) = '0' and C0CONFIG(18) = '0' and PresentStateREG /= WRITE1 and clr /= '0' then -- checking for Enable , Halt , and Active
data_out(0) <= x"00000000";
else
x <= '1';
end if;
end case;
end process Logic ;
process (clk)
begin
if (rising_edge(clk)) then
PresentStateREG <= NextStateREG;
PresentStateLogic <= NextStateLogic;
end if;
end process;
END description;
答案 0 :(得分:1)
MCVe还有一点。
如果没有测试平台或波形显示问题,您的问题就无法验证。
但是在这种情况下,可以通过在代码中搜索驱动程序找到问题。
注意到你在这些中使用了位置关联,有正确数量的关联,最后一个值是连接到data_out元素的输出:
--CHANNEL 0 REGISTERS--
DMACC0_SRCADD : Register32 port map (data_in,channel_enable(0),clr,clk,data_out(0));
DMACC0_DESTADD : Register32 port map (data_in,channel_enable(1),clr,clk,data_out(1));
DMACC0_LLI : Register32 port map (data_in,channel_enable(2),clr,clk,data_out(2));
DMACC0_CONTROL : Register32 port map (data_in,channel_enable(3),clr,clk,data_out(3));
DMACC0_CONFIG : Register32 port map (data_in,channel_enable(4),clr,clk,data_out(4));
通过查找赋值语句来查找其他驱动程序,我们发现它们也是由逻辑进程驱动的:
data_out(0) <= x"00000000";
data_out(1) <= x"00000000";
data_out(2) <= x"00000000";
data_out(3) <= x"00000000";
data_out(4) <= x"00000000";
了解有两个驱动因素来自于理解精心设计的模型由信号互连的过程组成。
如何生成这些&#39; X是由于解决了多个驱动程序。这是IEEE Std 1076-2008 14.7.2和14.7.3中描述的复杂解释,描述了模型执行的细节(14.7)。
声明的data_out声明为Arr40x32类型,其元素类型为std_logic_vector,它是一个已解析的表。
解析std_logic_vector的每个元素的解析函数可以在包std_logic_vector的主体中找到。
它用于解决的表是:
-------------------------------------------------------------------
-- resolution function
-------------------------------------------------------------------
CONSTANT resolution_table : stdlogic_table := (
-- ---------------------------------------------------------
-- | U X 0 1 Z W L H - | |
-- ---------------------------------------------------------
( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | - |
);
对于std_logic_value的每个std_logic元素,驱动程序一次取两个,具有当前解析值和附加驱动程序值。用于选择上表中行和列的两个输入将告诉您这两个信号的分辨值。在这种情况下,std_logic_vector值的std_logic元素的所有驱动程序都已完成。
您使用闩锁(逻辑进程)分配给所有&#39; 0的其中一个驱动程序。另一个驱动程序是特定Register32的输出。一个驱动程序输出&#39; 0,另一个驱动程序输出&#39; 1&#39;在32位注册表中,您将获得一个&#39; X&#39;。
您已经基本上描述了可以在硬件中实现的内容,其中一个解决方案可能是在特定时间将data_out值设置为零,而不是简单地将两个驱动程序短接在一起。
如果没有MCVe并且看到您的设计在行动,则可能无法建议正确的修复。