920 likes | 1.09k Views
å¯ç¼–程 ASIC. æ ¸å¿ƒè¯æ³•ä¸ŽåŸºç¡€ç”µè·¯è®¾è®¡ å¦æ—¶åˆ†é…:4. 进度. 1. 绪论 。 2. 设计æµç¨‹ 。 3. 模å—化硬件与进程模型 。 4. ä¿¡å·ä¼ 输模型 。 5. æ ¸å¿ƒè¯æ³•ä¸ŽåŸºç¡€ç”µè·¯è®¾è®¡ 。 6. 状æ€æœºè®¾è®¡ 。 7. å¯é 设计与高速设计 。 8. å¯ç¼–程逻辑器件。 9. æ•°å—ä¿¡å·å¤„ç†çš„ fpga 实现 。 10. æ•°å—系统的 RTL 设计 。. 程åºç»“æž„. Library …;-- 库,包ç‰çš„说明 Entity …;-- 实体说明 Architecture…;-- 结构体æè¿°. 程åºä¾‹å. u1. a.
E N D
可编程ASIC 核心语法与基础电路设计 学时分配:4 电子科技大学
进度 • 1.绪论 。 • 2.设计流程 。 • 3.模块化硬件与进程模型 。 • 4.信号传输模型 。 • 5.核心语法与基础电路设计 。 • 6.状态机设计 。 • 7.可靠设计与高速设计 。 • 8. 可编程逻辑器件。 • 9.数字信号处理的fpga实现。 • 10.数字系统的RTL设计。 电子科技大学
程序结构 • Library …;-- 库,包等的说明 • Entity …;-- 实体说明 • Architecture…;-- 结构体描述 电子科技大学
程序例子 u1 a Library ieee; Use ieee.std_logic_1164.all; Entity u1 is Port( a : in std_logic; b : in std_logic; c : out std_logic); End u1; Architecture behv of u1 is Begin c <= a and b; End behv; c b 电子科技大学
程序例子 u1 a Library ieee; Use ieee.std_logic_1164.all; Entity u1 is Port( a : in std_logic; b : in std_logic; c : out std_logic); End u1; Architecture behv of u1 is Begin c <= a and b; End behv; c b 表示使用 ieee库。这是最常用的库说明,绝大多数的VHDL代码都使用这个库。 电子科技大学
程序例子 u1 a Library ieee; Use ieee.std_logic_1164.all; Entity u1 is Port( a : in std_logic; b : in std_logic; c : out std_logic); End u1; Architecture behv of u1 is Begin c <= a and b; End behv; c b 表示使用 ieee库中的std_logic_1164包。 最常用的包说明: use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; --或 USE IEEE.STD_LOGIC_SIGNED.ALL; 电子科技大学
关于unsigned与signed库 • 如果use IEEE.STD_LOGIC_UNSIGNED.ALL;则矢量被看作无符号整数; • 如果use IEEE.STD_LOGIC_SIGNED.ALL;则矢量被看作带符号整数。 • 对于前者,有 (“1001” > “0000”)成立; • 对于后者,有(“1001” < “0000”)成立; 电子科技大学
程序例子 u1 a Library ieee; Use ieee.std_logic_1164.all; Entity u_and2 is Port( a : in std_logic; b : in std_logic; c : out std_logic); End u_and2; Architecture behv of u_and2 is Begin c <= a and b; End behv; c b 声明元件的实体。 语法: Entity <实体名字> is …. End <实体名字>; 电子科技大学
程序例子 注意最后一个端口说明语句不要加分号! u1 a Library ieee; Use ieee.std_logic_1164.all; Entity u_and2 is Port( a : in std_logic; b : in std_logic; c : out std_logic); End u_and2; Architecture behv of u_and2 is Begin c <= a and b; End behv; c b 元件的外部端口。 语法: 端口名 : 信号方向 数据类型; 电子科技大学
程序例子 u1 a Library ieee; Use ieee.std_logic_1164.all; Entity u_and2 is Port( a : in std_logic; b : in std_logic; c : out std_logic); End u_and2; Architecture behv of u_and2 is Begin c <= a and b; End behv; 元件的结构体说明。 语法: Architecture <结构体名> of <实体名字> is Begin … End <结构体名>; c b 电子科技大学
程序例子 u1 a Library ieee; Use ieee.std_logic_1164.all; Entity u_and2 is Port( a : in std_logic; b : in std_logic; c : out std_logic); End u_and2; Architecture behv of u_and2 is Begin c <= a and b; End behv; c b 结构体描述。 绝大多数情况下由process构成; 一条“光秃”的信号赋值实际上就是一个process,其敏感信号为右边所有信号。 电子科技大学
程序例子 u1 a Library ieee; Use ieee.std_logic_1164.all; Entity u_and2 is Port( a : in std_logic; b : in std_logic; c : out std_logic); End u_and2; Architecture behv of u_and2 is Begin c <= a and b; End behv; c b 电子科技大学
关于信号方向 IN OUT BUFFER IN INOUT IN OUT 电子科技大学
VHDL常用数据类型 • Std_logic, std_logic_vector; • Integer。 电子科技大学
常用的语法1: if条件判断 • IF 条件THEN • 顺序处理语句; • ELSE • 顺序处理语句; • END IF ; 注意,if语句只能用在process,函数,子过程之中! 电子科技大学
If的例子 • Process( a ) • Begin • if( a = ‘1’ ) then • b <= ‘0’; • else • b <= ‘1’; • end if; • End process; 电子科技大学
常用的语法2:case分支判断 • CASE 表达式 IS • WHEN 条件表达式 =〉顺序处理语句 • END CASE; 注意,if语句只能用在process,函数,子过程之中! 电子科技大学
A的声明: Signal a : std_logic; Case的例子 注意,case的分支必须包含a的所有取值。所以一般最后一个分支往往用others来包含。 • Process( a ) • Begin • case a is • when ‘1’ => b <= ‘0’; • when others => b <= ‘1’; • end case; • End process; 电子科技大学
CASE语句和IF语句的比较 • CASE语句和IF语句都可以完成多选择控制,但是在功能上还是有所区别的。 • 1、在IF语句中,多条件是有优先级区别的。总是先处理最起始的条件,如果不满足再依次处理后面的条件;在CASE语句里所有条件是并行处理的,不存在优先级关系。 • 2、CASE语句应将表达式的所有可能值全部列出来,否则在语法认为是错的。CASE语句中的WHEN OTHERS,即可以使它包含表达式的所有缺省值。 电子科技大学
由于CASE语句和IF的特点,它们在某些场合下是可以互换的,例如3-8译码器的例子。但是对于下面这个例子就不能使用CASE语句。由于CASE语句和IF的特点,它们在某些场合下是可以互换的,例如3-8译码器的例子。但是对于下面这个例子就不能使用CASE语句。 • 例: 电子科技大学
上表是一个优先级编码器的真值表,4个输入之间优先级的大小关系是b0>b1>b2>b3,即当b0、b1同为0时,输出编码为00。换言之,当b0=0时,其余3个输入任意值该编码器的输出均为”00“。因为CASE语句没有对输入为任意的表示法,故不能使用下面的语句:上表是一个优先级编码器的真值表,4个输入之间优先级的大小关系是b0>b1>b2>b3,即当b0、b1同为0时,输出编码为00。换言之,当b0=0时,其余3个输入任意值该编码器的输出均为”00“。因为CASE语句没有对输入为任意的表示法,故不能使用下面的语句: • 即:WHEN “XX01“=>y<=“01”是错误的。 • 所以要正确描述输入之间的这种优先级关系就应选用IF语句。程序如下: • LIBRARY IEEE; • USE IEEE.STD_LOGIC_1164.ALL; 电子科技大学
ENTITY encoder IS PORT (input:IN STD_LOGIC_VECTOR(3 DOWNTO 0); y :OUT STD_LOGIC_VECTOR(1 DOWNTO 0);) END encoder; • ARCHITECTURE rtl OF encoder IS BEGIN PROCESS (input) BEGIN • IF (input(0)=‘0’) then y<=“00”:; ELSIF (input(1)=‘0’) then y<=“01”; ELSIF (input(2)=‘0’) then y<=“10”; ELSE y<=“11”; END IF; • END PROCESS; END rtl; 电子科技大学
在IF语句中首先判断的是input(0),其次是input(1)……这正好体现了input(0)的优先级最高,只要input(0)=‘0’就优先对它编码。在IF语句中首先判断的是input(0),其次是input(1)……这正好体现了input(0)的优先级最高,只要input(0)=‘0’就优先对它编码。 电子科技大学
常用语法3:时钟沿判断 • 上升沿:If( clk’event and clk = ‘1’ ) then… • 或者 if( rising_edge( clk ) ) then … • 下降沿:if( clk’event and clk = ‘0’ ) then… • 或者 if( falling_edge( clk ) ) then … 电子科技大学
时钟沿的例子 • Process( clk ) • Begin • if( clk’event and clk = ‘1’ ) then • dout <= din; • end if; • End process; 电子科技大学
常用语法4:port map • 语法: InstanceName: componentName port map ( 端口影射表 ); • 例子(位置影射法): u1:u_and2 port map ( din1, din2, dout); 电子科技大学
或者(名称影射法) • U1: u_and2 port map • ( a => din1, b=> din2, c=> dout ); din1 a dout c din2 b 电子科技大学
其他内容 • Vhdl的数据类型 • Vhdl的运算(逻辑运算,算术 运算,关系运算,并置运算) • Vhdl的信号类属性 • 等等。 电子科技大学
基础电路设计 • 描述风格; • 基础组合电路设计; 二选一电路,三八译码器,缓冲器,加法器。 • 基础时序电路设计: • 寄存器 • 计数器 电子科技大学
基础组合电路设计 电子科技大学
Zero Y One S 例1: 二选一电路设计 • LIBRARY IEEE; • USE IEEE.STD_LOGIC_1164.ALL; • ENTITY MUX2to1 IS • PORT (S: IN STD_LOGIC; • Zero: IN STD_LOGIC; • One: IN STD_LOGIC; • Y: OUT STD_LOGIC); 电子科技大学
Zero Y One S • ARCHITECTURE behavior OF MUX2to1 IS • Begin • Process(S, Zero, One ) • Begin • …… -- 下一页讲述 • End process • END behavior; 电子科技大学
Zero Y One S 方法1:直接逻辑运算 • Process( S, Zero, One ) • Begin • Y <= (not S and Zero ) or ( S and One ); • End process; 电子科技大学
Zero Y One S 方法2:if语句 • Process( S, Zero, One ) • Begin • if( S = ‘0’) then • Y <= Zero; • else • Y <= One; • end if; • End process; 电子科技大学
方法3: case语句 • Process( S, Zero, One ) • Begin case S is when ‘0’ => Y <= Zero; when others => Y <= One; end case; end process; 电子科技大学
三种方法对比 • 第一种方法(逻辑运算式)是硬件一一对应的方法,要求设计者对具体硬件电路比较熟悉。 • 后两种方法利用条件分支,比较符合人的常规思维,利于加快设计及减轻维护负担。 • 一般情况下推荐使用后两种的风格。 电子科技大学
例2: 3-8译码器 • LIBRARY IEEE; • USE IEEE.std_logic_1164.all; • ENTITY dec3to8 IS PORT ( sel : IN STD_LOGIC_VECTOR (2 DOWNTO 0); en : IN STD_LOGIC; Y : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END dec3to8; • ARCHITECTURE behavior OF dec3to8 IS • BEGIN 电子科技大学
PROCESS(sel,en) • BEGIN IF (en='1') THEN CASE sel IS WHEN "000" => Y <= “11111110”; WHEN "001" => Y <= ‘11111101”; WHEN "010" => Y <= “11111011”; WHEN "011" => Y <= “11110111”; WHEN "100" => Y <= “11101111”; WHEN "101" => Y <= “11011111”; WHEN "110" => Y <= “10111111”; WHEN others => Y <= “01111111”; END CASE; ELSE Y <= “11111111”; END IF; • END PROCESS; • END behavior; 注意不要漏掉此句 电子科技大学
例3三态门 三态门电路 电子科技大学
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; • ENTITY rei_gate IS PORT (din,en:IN STD_LOGIC; dout:OUT STD_LOGIC); END tri_gate; • ARCHITECTURE tri_gate OF tri_gate IS BEGIN tri_gate1:PROCESS(din,en) BEGIN • IF (en = ’1’) THEN dout <= din; ELSE dout <= ’Z’; END IF; • END PROCESS; • END tri_gate; 电子科技大学
例4:四位全加器设计 4 dina 4 4 dout dinb cout cin Dina和dinb为两路4 bit的输入,cin为进位输入; Dout为4bit的输出,cout为进位输出。 电子科技大学
则描述为: • Architecture behav of u_FullAdder is • Signal atemp, btemp, tempout : std_logic_vector( 4 downto 0); • Begin • Process( cin, dina, dinb, atemp, btemp, tempout ) …. • End behav; 电子科技大学
Process( cin, dina, dinb, atemp, btemp, tempout) • Begin • atemp <= ‘0’ & dina; • btemp <= ‘0’ & dinb; • tempout <= cin + atemp + btemp; • dout <= tempout( 3 downto 0 ); • cout <= tempout(4); • End process; 电子科技大学
代码评析 • 该代码用5bit半加运算来完成4bit全加,在代码上非常简洁。 • 由综合器自己选择元件库中现成的加法部件来实现加法运算,设计者不必关心其内部电路细节。 • 但是其弱点是,综合器会用5bit加法器来实现,容易造成资源消耗过大。 电子科技大学
a d b cout cin 改进方法 • 使用1bit全加器构建 FullAdder1b 电子科技大学
1bit全加器 • Process( a, b, cin ) • Begin • d <= a xor b xor cin; • cout <= (a and cin ) or (b and cin) • or (a and b); • End process; 电子科技大学
d(0) a(0) b(0) temp1 cin a(1) d(1) a a a a b(1) d d d d temp2 b b b b cout cout cout cout a(2) d(2) cin cin cin cin b(2) temp3 a(3) d(3) b(3) cout 4bit全加器 电子科技大学
Port( a : in std_logic_vector( 3 downto 0 ); b : in std_logic_vector( 3 downto 0 ); cin : in std_logic; d : out std_logic_vector( 3 downto 0 ); cout : out std_logic; ); 代码实现 • 总框架: • Entity FullAdder4b is • …. • End FullAdder4b; • Architecture struct of FullAdder4b is] • Signal temp1, temp2,temp3: std_logic_vector( 3 downto 0 ); • Begin • -- 此处代码下一页说明. • End struct; 电子科技大学
代码实现 • 总框架: • Entity FullAdder4b is • …. • End FullAdder4b; • Architecture struct of FullAdder4b is • Signal temp1, temp2,temp3: std_logic_vector( 3 downto 0 ); • Begin • -- 此处代码下一页说明. • End struct; 电子科技大学
U0 : FullAdder1b port map( • a(0), b(0), cin, d(0), temp1 ); • U1 : FullAdder1b port map( • a(1), b(1), temp1, d(0), temp2 ); • U2 : FullAdder1b port map( • a(2), b(2), temp2, d(0), temp3 ); • U3 : FullAdder1b port map( • a(3), b(3), temp3, d(0), cout ); 电子科技大学