?? 92_wss_stringreg.vhd
字號:
--the mem_string
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.all;
--unsigned.ALL;
USE work.pkg_types.ALL;
USE work.pkg_components.ALL;
ENTITY mem_string IS
PORT ( clk : IN bit1 ;
reset : IN bit1 ;
sel_read : IN bit1 ;
s_sel : IN bit1 ;
burst : IN bit2_r ;
s_req : OUT bit1 ;
s_ack : IN bit1 ;
s_valid : IN bit1 ;
data_in : IN bit8 ;
s_ad : IN bit5 ;
s : out bit8 ;
s_done : out bit1 );
END mem_string;
ARCHITECTURE behavior OF mem_string IS
SIGNAL a1,addr : bit5_r;
SIGNAL sel_write : bit1;
BEGIN
PROCESS
--地址初始化
PROCEDURE init (burst : IN bit2_r;SIGNAL a1 : OUT bit5_r) IS
BEGIN
addr <= burst & "000";
a1 <= burst & "000";
END init;
--寫RAM,即更新相應地址信號
PROCEDURE write_ram ( sel_write : IN bit1; data : IN bit8) IS
BEGIN
a1 <= addr;
END write_ram;
BEGIN
--初始化信號值
s_req <= '0';
s_done <= '1';
addr <= "00000";
sel_write <= '0';
--直到mem_string為工作狀態且被選中,當時鐘上升沿到來時,
WAIT UNTIL (s_sel = '1' AND rising_edge(clk) AND reset='1');
--找到相應burst的開始位置,并且置mem_string為寫入狀態
init(burst,addr);
s_done <= '0';
s_req <= '1';
WAIT UNTIL ((s_ack='1' AND rising_edge(CLK)) OR reset/='1');
--得到應答信號s_ack后,撤消s_req信號
s_req <= '0';
write_loop : LOOP
--等到addr有效且地址信號不為邊界
--因為一個burst設定為8個字符
IF s_valid/='1' AND addr/=7 AND addr/=15 AND addr<23 THEN
WAIT UNTIL ((s_valid='1' AND rising_edge(clk)) OR reset/='1');
--復位則退出
IF reset/='1' THEN
EXIT write_loop;
END IF;
END IF;
--寫入8個字符,一個字符為8位
addr <= addr +1;
write_ram(sel_write,data_in);
--寫入完成后,寫信號置位防止寫入不正確的數據
sel_write <= '1';
--當地址達到邊界或mem_string復位時退出
IF addr=7 OR addr=15 OR addr>=23 OR reset/='1' THEN
WAIT UNTIL rising_edge(clk);
EXIT write_loop;
END IF;
WAIT UNTIL rising_edge(clk);
sel_write <='0';
END LOOP write_loop;
END PROCESS;
string_mem :mem_24x8
PORT MAP (s,data_in,s_ad,a1,sel_read,sel_write,clk);
END behavior;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -