[編集]私は今、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;
問題の原因となっているコードの種類の最小限の例を投稿することから始めます。 –
質問タイトルについては、http://stackoverflow.com/questions/13954193/is-process-in-vhdl-reentrant/13956532#13956532を参照してください。質問体については、Jeffが言っているように、あなたが本当に求めていることを知るためのコードを見なければならないので、それを[MCVE]に簡素化する必要があります –
Brianのリンクに加えて、解決されたタイプの信号を割り当てる各プロセスは、その信号のために。シグナルの実効値はドライバの「解決済み」(http://stackoverflow.com/search?q=%5Bvhdl%5D+resolution)値で、「X」を生成することができます。あなたのifステートメントは、std_ulogicの位置の値(メタ値を含む)を使って不等式や関係をテストするように聞こえます。デバッガの前に「仮想ハードウェア」のトラブルシューティングを行う波形表示を使用できます。サイズのために抽象化されたMCVeを表示すると、問題が発生している可能性があり、読者が推測する必要はありません。 – user1155120