2017-03-10 5 views
-2

[編集]私は今、DMAコントローラモデルに取り組んでおり、同じクロックで並行して動作する3つのプロセスを作成しています。 2つのメインプロセスが同じレジスタにアクセスしますが、コンフリクト "特定の値を確認するために"場合、 "clr"信号を使用してレジスタのデータをクリアする最初のケース ここでの問題は、値が常に "xxxx"であり、そこの2番目のプロセス常にtrueです。[編集:信号 'x'はif条件が真か偽かを判別するために使用され、波形の出力は '1'です。この条件はdata_outと競合しませんdata_outはまだXですから、何が矛盾していますか?vhdlでどのようにプロセスが正確に並行して動作するのですか? 2つのプロセスが競合する原因は何ですか?

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; 
+1

問題の原因となっているコードの種類の最小限の例を投稿することから始めます。 –

+1

質問タイトルについては、http://stackoverflow.com/questions/13954193/is-process-in-vhdl-reentrant/13956532#13956532を参照してください。質問体については、Jeffが言っているように、あなたが本当に求めていることを知るためのコードを見なければならないので、それを[MCVE]に簡素化する必要があります –

+0

Brianのリンクに加えて、解決されたタイプの信号を割り当てる各プロセスは、その信号のために。シグナルの実効値はドライバの「解決済み」(http://stackoverflow.com/search?q=%5Bvhdl%5D+resolution)値で、「X」を生成することができます。あなたのifステートメントは、std_ulogicの位置の値(メタ値を含む)を使って不等式や関係をテストするように聞こえます。デバッガの前に「仮想ハードウェア」のトラブルシューティングを行う波形表示を使用できます。サイズのために抽象化されたMCVeを表示すると、問題が発生している可能性があり、読者が推測する必要はありません。 – user1155120

答えて

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)); 

代入文のために私たちを見ていることにより、他のドライバーを探していることで彼らはまた、ロジックプロセスによって駆動されている見つける:2つのドライバがあることを理解し

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"; 

は精巧な設計モデルは、信号によって相互接続されたプロセスで構成されていることを理解することから来ています。

これらのXの生成方法は、複数のドライバを解決するためです。これは、IEEE Std 1076-2008 14.7.2と14.7.3で、モデルの実行の詳細を記述する複雑な説明です(14.7)。

data_outが宣言されているのは、要素タイプがstd_logic_vectorの解決済みテーブルであるArr40x32型として宣言されています。

std_logic_vectorの各要素を解決するための解決関数は、std_logic_vectorパッケージの本体にあります。

それが解決に使用するテーブルである:ドライバが現在解決された値と、追加のドライバ値と一度に2つ取られstd_logic_valueの各STD_LOGIC要素について

------------------------------------------------------------------- 
-- 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') -- | - | 
    ); 

。 2つの入力は、上記の表の行と列を選択するために使用され、これらの2つの信号の解決された値を示します。この場合、std_logic_vector値のこれまでのstd_logic要素のために、すべてのドライバに対してこれが行われます。

ラッチ(論理プロセス)を使用してすべて '0'に割り当てたドライバの1つです。他のドライバは、特定のRegister32の出力です。一方のドライバが '0'を出力し、もう一方のドライバ出力が '32'のレジスタに '1'を出力すると、 'X'が出力されます。

2つのドライバを単に短絡するのではなく、特定の時刻にdata_outの値をゼロにゲートする方法があるハードウェアで実現可能なことを本質的に説明しました。

MCVeがなくても、実際にデザインが表示されている場合は、適切な修正を提案できないことがあります。

+0

さて、私は自分の問題を記述するのに最適なMCVeを書こうとしていますが、どこでエラーが発生し、コードが複雑すぎるのかを特定する問題に直面しています。 あなたが言ったように、示唆された問題を使用しましょう: "すべての '0'にラッチ(ロジックプロセス)を割り当てたドライバのうちの1つ、他のドライバは特定のRegister32の出力です。 '0'となり、他のドライバ出力はレジスタ32ビットで '1'にな​​ります。 'X'が表示されます。 " このステートメントを入力するケースが偽であっても、これらのドライバは相互に干渉しますか? –

+0

ドライバが値をドライブすると、ドライバが接続されていないか値が更新されない限り、値が使用されます。解決済みのタイプの場合、ネット上のすべてのドライバが寄与します。解決されたタイプでない場合は、複数のドライバがある場合はエラーになります。これは、1つのプロセスからの信号のみをドライブするように指示する必要があります。デザインに問題があります。 – user1155120

関連する問題