你的VHDL設計描述中有很多錯誤。兩個過程語句驅動相同的信號(Q1
和Q2
)。第二個進程有三個錯誤(沒有進程聲明標籤,而在關閉中指定了標籤,併發信號分配聲明中順序信號分配聲明是合適的)。看來第二個流程聲明應該被全部刪除。
如果意圖在Q1
,Q2
寄存器的輸入上具有多路複用器,則第一個進程不起作用。您無法將值分配給塊內的正式輸入。
你應該分配B
選擇值Q1
和Q2
直接的過程語句內(內clk
elsif
)。
您對D(11)的分配有缺陷(使用==
而不是<=
)。
如果您只將一個值分配給特定信號(例如最長的靜態前綴D1
和D2
),它不是多路複用器。請注意,所提供的Q2
沒有重置值。
沒有指定地點的數據。
如果你正在爲課堂工作做這件事,那麼在沒有學習VHDL的情況下提供答案的人幾乎沒有什麼好處。如果你正在認真地學習VHDL,你需要更多的和逐步的構建練習。
如果我理解你正在嘗試做正確,將是這個樣子:
architecture Behavioral of basculeD is
-- signal Q1, Q2 : std_logic_vector(11 downto 0);
begin
-- process(clk,rst)
-- begin
-- if (rst='1') then Q1<="000000000000";
-- elsif (clk'event and clk='1') then
-- if (B='0') then
-- D1(11) =='0'; -- i want to fix the 3MSB of D1 in the "000" ...
-- D1(10) <='0';
-- D1(9) <='0';
-- Q1<= D1;
-- elsif (B='1') then
-- D2(2)<= '1'; -- the 3LSB are fixed to 111 , and defaut value ...
-- D2(1)<='1';
-- D2(0)<='1';
-- Q2<=D2;
-- end if;
-- end if;
-- end process;
-- description MUX : select D1 when B=0, else select D2 when B= 1
-- process(B)
-- begin
-- Q1 <= D1 when B='0' else
-- Q2<=D2 when B='1' ;
-- end process MUX;
MUXED_REG:
process (clk,rst)
begin
if rst = '1' then
data <= (others => '0'); -- equivalent to "000000000000"
elsif clk'event and clk = '1' then
-- the actual multiplexer:
if B = '0' then
data <= ("000" & D1(8 downto 0));
else -- B = '1', or other values
data <= (D2(11 downto 3) & "111");
end if;
end if;
end process;
end Behavioral;
你當然可以保留的中介信號,說Q
和地方數據的上述使用它,用併發信號分配從Q
到data
(輸出)。
使用上述體系結構代替您的分析。
隨着測試平臺:
library ieee;
use ieee.std_logic_1164.all;
entity basculeD_test is
end entity;
architecture test of basculeD_test is
component basculeD is
port (
d1, d2: in std_logic_vector(11 downto 0);
clk: in std_logic;
rst: in std_logic;
b: in std_logic;
data: out std_logic_vector(11 downto 0)
);
end component;
signal d1: std_logic_vector(11 downto 0) := (others => '1');
signal d2: std_logic_vector(11 downto 0) := (others => '0');
signal clk: std_logic := '0';
signal rst: std_logic := '1';
signal b: std_logic := '0';
signal data: std_logic_vector(11 downto 0);
begin
CLOCK:
process
begin
wait for 10 ns;
clk <= not clk;
if Now > 100 ns then
wait;
end if;
end process;
RESET:
process
begin
wait for 31 ns;
rst <= '0';
wait;
end process;
DUT:
basculeD
port map (
d1 => d1,
d2 => d2,
clk => clk,
rst => rst,
b => b,
data => data
);
STIMULUS:
process
begin
wait for 65 ns;
b <= '1';
wait;
end process;
end architecture;
並使用basculeD更換架構與MUXED_REG
過程:
david_koontz @的Macbook:ghdl -a basculeD.vhdl
david_koontz @的Macbook: ghdl -e basculeD_test
david_koontz @Macbook:ghdl -r basculeD_test --wave = basculeD_test.ghw
david_koontz @Macbook:o筆basculeD_test.gtkw(以前保存的保存文件)
給出:
當然還有你是從複試圖單獨的存儲完全它說,你可以使用Q1
可能性,作爲寄存器(並且僅需要9位)的Q2
,獨立的多路複用器(如原始basculeD
architecture
中所暗示的)允許B
在經修改的Q1
和Q2
之間引導寄存器值在o輸出data
。
這將是這個樣子:
architecture Behavioral of basculeD is
signal Q1: std_logic_vector(8 downto 0);
signal Q2: std_logic_vector(11 downto 3);
begin
REGS:
process (clk, rst)
begin
if rst = '1' then
Q1 <= (others => '0');
Q2 <= (others => '0');
elsif clk'event and clk = '1' then
Q1 <= D1 (8 downto 0);
Q2 <= D2(11 downto 3);
end if;
end process;
MUX:
process (B,Q1,Q2)
begin
if B = '0' then
data <= ("000" & Q1);
else
data <= (Q2 & "111");
end if;
end process;
,給你這樣的事情:
VHDL是爲了傳達設計規範給讀者,這是比較容易當使用一些約定進行大小寫時(VHDL不區分大小寫,除了擴展標識符)和縮進。
只是一個簡單的提示:在VHDL 2008中,當和選擇語句作爲順序語句添加時。其餘答案是大! – FRob
@FRob - 是的,條件波形和選定的信號分配已添加到-2008年的順序信號分配語句中。請讓我們知道1076-2008得到普遍支持,特別是合成。 – user1155120
Synplify可以做到這一點,Quartus也是如此。賽靈思可能會等到VHDL-2026 tho;) – FRob