1 / 92

可编程 ASIC

可编程 ASIC. 核心语法与基础电路设计 学时分配:4. 进度. 1. 绪论 。 2. 设计流程 。 3. 模块化硬件与进程模型 。 4. 信号传输模型 。 5. 核心语法与基础电路设计 。 6. 状态机设计 。 7. 可靠设计与高速设计 。 8. 可编程逻辑器件。 9. 数字信号处理的 fpga 实现 。 10. 数字系统的 RTL 设计 。. 程序结构. Library …;-- 库,包等的说明 Entity …;-- 实体说明 Architecture…;-- 结构体描述. 程序例子. u1. a.

teenie
Download Presentation

可编程 ASIC

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 可编程ASIC 核心语法与基础电路设计 学时分配:4 电子科技大学

  2. 进度 • 1.绪论 。 • 2.设计流程 。 • 3.模块化硬件与进程模型 。 • 4.信号传输模型 。 • 5.核心语法与基础电路设计 。 • 6.状态机设计 。 • 7.可靠设计与高速设计 。 • 8. 可编程逻辑器件。 • 9.数字信号处理的fpga实现。 • 10.数字系统的RTL设计。 电子科技大学

  3. 程序结构 • Library …;-- 库,包等的说明 • Entity …;-- 实体说明 • Architecture…;-- 结构体描述 电子科技大学

  4. 程序例子 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 电子科技大学

  5. 程序例子 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代码都使用这个库。 电子科技大学

  6. 程序例子 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; 电子科技大学

  7. 关于unsigned与signed库 • 如果use IEEE.STD_LOGIC_UNSIGNED.ALL;则矢量被看作无符号整数; • 如果use IEEE.STD_LOGIC_SIGNED.ALL;则矢量被看作带符号整数。 • 对于前者,有 (“1001” > “0000”)成立; • 对于后者,有(“1001” < “0000”)成立; 电子科技大学

  8. 程序例子 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 <实体名字>; 电子科技大学

  9. 程序例子 注意最后一个端口说明语句不要加分号! 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 元件的外部端口。 语法: 端口名 : 信号方向 数据类型; 电子科技大学

  10. 程序例子 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 电子科技大学

  11. 程序例子 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,其敏感信号为右边所有信号。 电子科技大学

  12. 程序例子 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 电子科技大学

  13. 关于信号方向 IN OUT BUFFER IN INOUT IN OUT 电子科技大学

  14. VHDL常用数据类型 • Std_logic, std_logic_vector; • Integer。 电子科技大学

  15. 常用的语法1: if条件判断 • IF 条件THEN • 顺序处理语句; • ELSE • 顺序处理语句; • END IF ; 注意,if语句只能用在process,函数,子过程之中! 电子科技大学

  16. If的例子 • Process( a ) • Begin • if( a = ‘1’ ) then • b <= ‘0’; • else • b <= ‘1’; • end if; • End process; 电子科技大学

  17. 常用的语法2:case分支判断 • CASE 表达式 IS • WHEN 条件表达式 =〉顺序处理语句 • END CASE; 注意,if语句只能用在process,函数,子过程之中! 电子科技大学

  18. 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; 电子科技大学

  19. CASE语句和IF语句的比较 • CASE语句和IF语句都可以完成多选择控制,但是在功能上还是有所区别的。 • 1、在IF语句中,多条件是有优先级区别的。总是先处理最起始的条件,如果不满足再依次处理后面的条件;在CASE语句里所有条件是并行处理的,不存在优先级关系。 • 2、CASE语句应将表达式的所有可能值全部列出来,否则在语法认为是错的。CASE语句中的WHEN OTHERS,即可以使它包含表达式的所有缺省值。 电子科技大学

  20. 由于CASE语句和IF的特点,它们在某些场合下是可以互换的,例如3-8译码器的例子。但是对于下面这个例子就不能使用CASE语句。由于CASE语句和IF的特点,它们在某些场合下是可以互换的,例如3-8译码器的例子。但是对于下面这个例子就不能使用CASE语句。 • 例: 电子科技大学

  21. 上表是一个优先级编码器的真值表,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; 电子科技大学

  22. 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; 电子科技大学

  23. 在IF语句中首先判断的是input(0),其次是input(1)……这正好体现了input(0)的优先级最高,只要input(0)=‘0’就优先对它编码。在IF语句中首先判断的是input(0),其次是input(1)……这正好体现了input(0)的优先级最高,只要input(0)=‘0’就优先对它编码。 电子科技大学

  24. 常用语法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 … 电子科技大学

  25. 时钟沿的例子 • Process( clk ) • Begin • if( clk’event and clk = ‘1’ ) then • dout <= din; • end if; • End process; 电子科技大学

  26. 常用语法4:port map • 语法: InstanceName: componentName port map ( 端口影射表 ); • 例子(位置影射法): u1:u_and2 port map ( din1, din2, dout); 电子科技大学

  27. 或者(名称影射法) • U1: u_and2 port map • ( a => din1, b=> din2, c=> dout ); din1 a dout c din2 b 电子科技大学

  28. 其他内容 • Vhdl的数据类型 • Vhdl的运算(逻辑运算,算术 运算,关系运算,并置运算) • Vhdl的信号类属性 • 等等。 电子科技大学

  29. 基础电路设计 • 描述风格; • 基础组合电路设计; 二选一电路,三八译码器,缓冲器,加法器。 • 基础时序电路设计: • 寄存器 • 计数器 电子科技大学

  30. 基础组合电路设计 电子科技大学

  31. 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); 电子科技大学

  32. Zero Y One S • ARCHITECTURE behavior OF MUX2to1 IS • Begin • Process(S, Zero, One ) • Begin • …… -- 下一页讲述 • End process • END behavior; 电子科技大学

  33. Zero Y One S 方法1:直接逻辑运算 • Process( S, Zero, One ) • Begin • Y <= (not S and Zero ) or ( S and One ); • End process; 电子科技大学

  34. Zero Y One S 方法2:if语句 • Process( S, Zero, One ) • Begin • if( S = ‘0’) then • Y <= Zero; • else • Y <= One; • end if; • End process; 电子科技大学

  35. 方法3: case语句 • Process( S, Zero, One ) • Begin case S is when ‘0’ => Y <= Zero; when others => Y <= One; end case; end process; 电子科技大学

  36. 三种方法对比 • 第一种方法(逻辑运算式)是硬件一一对应的方法,要求设计者对具体硬件电路比较熟悉。 • 后两种方法利用条件分支,比较符合人的常规思维,利于加快设计及减轻维护负担。 • 一般情况下推荐使用后两种的风格。 电子科技大学

  37. 例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 电子科技大学

  38. 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; 注意不要漏掉此句 电子科技大学

  39. 例3三态门 三态门电路 电子科技大学

  40. 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; 电子科技大学

  41. 例4:四位全加器设计 4 dina 4 4 dout dinb cout cin Dina和dinb为两路4 bit的输入,cin为进位输入; Dout为4bit的输出,cout为进位输出。 电子科技大学

  42. 则描述为: • 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; 电子科技大学

  43. 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; 电子科技大学

  44. 代码评析 • 该代码用5bit半加运算来完成4bit全加,在代码上非常简洁。 • 由综合器自己选择元件库中现成的加法部件来实现加法运算,设计者不必关心其内部电路细节。 • 但是其弱点是,综合器会用5bit加法器来实现,容易造成资源消耗过大。 电子科技大学

  45. a d b cout cin 改进方法 • 使用1bit全加器构建 FullAdder1b 电子科技大学

  46. 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; 电子科技大学

  47. 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全加器 电子科技大学

  48. 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; 电子科技大学

  49. 代码实现 • 总框架: • Entity FullAdder4b is • …. • End FullAdder4b; • Architecture struct of FullAdder4b is • Signal temp1, temp2,temp3: std_logic_vector( 3 downto 0 ); • Begin • -- 此处代码下一页说明. • End struct; 电子科技大学

  50. 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 ); 电子科技大学

More Related