VHDL程序翻译

讲解一下程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity duAD is
port (
fosc : in std_logic;
adwr : out std_logic;
addatain: in std_logic_vector(7 downto 0);
addataout : out std_logic_vector(7 downto 0);
oe: out std_logic;
glbrst : out std_logic;
AD_addr: out std_logic_vector(3 downto 0);
JSTART: in std_logic;
fifo1_wr : out std_logic;
adcs: out std_logic;
adrd: out std_logic;
adgen : out std_logic;
convst : out std_logic;
adwb: out std_logic;
fifo1datain : out std_logic_vector(7 downto 0)
);
end duAD;
architecture Behavioral of duAD is
signal AD_cnt : integer range 0 to 127:=0; -- 时钟分频
signal fifo1_wr1 : std_logic;
signal adgen1 : std_logic;
signal rst : std_logic;
signal number : integer range 0 to 2000:=0;
signal AD_ch : std_logic_vector(3 downto 0);
signal ADdatain1 : std_logic_vector(7 downto 0);
begin
process(fosc)
begin
if fosc 'event and fosc= '1' then
if number=999then
number<=number;
rst<='1';
else
number<=number+1;
rst<='0'; ----低电平复位
end if;
end if;
end process;
glbrst<=rst;
fifo1_wr<=fifo1_wr1;
AD_addr<=AD_ch;
process(fosc,JSTART,rst)
begin
if rst='0'then
AD_cnt<=0;
elsif fosc 'event and fosc= '1' then
if JSTART='0'then
if AD_cnt=127 then
AD_cnt<=0;
else
AD_cnt<=AD_cnt+1; --计数,
end if;
end if;
end if;
end process ;
process(fosc,JSTART,rst)
begin
if rst='0'then
adgen1<='0';
elsif fosc 'event and fosc= '1' then
if JSTART='0'then
adgen1<='1';
else
adgen1<='0';
end if;
end if;
adgen<=adgen1;
end process ;
process(fosc,JSTART,rst)
begin
if fosc 'event and fosc= '1' then
if rst='0'then
AD_ch<="0000";
fifo1_wr1<='1';
casenumber is
when 50=>
convst<='1';
adwb<='1';
adcs<='0';
adwr<='0';
adrd<='1';
oe<='0';
when 51=>
addataout<="00010000";
when 52=>
adwr<='1';
when 53=>
adcs<='1';
oe<='1';
when others=>
end case;
elsif rst='1' then
if JSTART='0'then
caseAD_cnt is
when 2=>
convst<='1';
adwb<='1';
adcs<='0';
adwr<='0';
adrd<='1';
oe<='0';
when 3=>
addataout<="00010000";
when 4=> ---3----
adwr<='1';
when 5=> ---4----
adcs<='1';
convst<='0';
oe<='1';
when 19=>
convst<='1';
adcs<='0';
adrd<='0';
when 30=>
ADdatain1<=ADdatain;
when 45=>
fifo1_wr1<='0';
fifo1datain<="0000"&AD_ch;
when 46=>
fifo1_wr1<='1';
when 74=>
when 79=>
fifo1_wr1<='0';
fifo1datain<=ADdatain1;
AD_ch<=AD_ch+1;
when 80=>
fifo1_wr1<='1';
when others=>
end case;
end if;
end if;
end if;
end process ;
--<=ADdata_reg;
end Behavioral;

第1个回答  2014-06-13
你的程序没粘贴完;
我只能给你解释一下,在你的程序中你首先定义了一个实体top,他拥有一个

32mhz的时钟输入口,一个单输入口handletoauto,一个7位向量输出口code1,以

及8位的向量输入口index1,单输出口high1和spkout,这些都是的卢的外部端口

。而后又定义了top的结构体behavior,他是反应top的内部结构的,在这其中又

调用了automusic组件,他是你在后面定义的一个实体,后面的component tone,

component speaker,也是和 automusic一样,signal tone2是一个整形信号变量

它的范围是从0到2047,接下来u0是将automusic组件的各个端口信号从左到右进

行一次映像,即将automusic的各端口值传送给top的外端口clk32MHZ,index1,

indx,handtoauto,u1,u2也是同样的意思。而在下面你就是定义了一个tone实

体,就是你上面调用的tone组件的实体,对应的端口定义就不解释了,我直接给

你分析process进程吧:它相当于一个无限循环,每次循环事都探测index信号,
当index取when后面的条件值时,那么tone0,code,high获得相应的赋值,当

index取值不是when后面的值时,那么执行when others。其实这很简单的,你仔细揣摩很容易。
相似回答