|
第二章、组合逻辑电路
1、监视交通信号工作状态的逻辑电路
library ieee; use ieee.std_logic_1164.all;
entity hld is port(r,a,g:in std_login; z:out std_logic); end hld;
architecture rtl of hld is begin process(r,a,g) variable conb:std_logic_vector(2 downto 0); begin comb:=r&a&g; case comb is when"000"=>z<='1'; when"001"=>z<='0'; when"010"=>z<='0'; when"011"=>z<='1'; when"100"=>z<='0'; when"101"=>z<='1'; when"110"=>z<='1'; when others=>z<='1'; end case; end process; end rtl;
2、8线---3线编码器的设计
library ieee; use ieee.std_logic_1164.all;
entity bm8_3 is port(a:in std_logic_vector(7 downto 0); b:out std_logic_vector(2 downto 0)); end bm8_3; architecture rtl ofbm8_3 is begin process(a) begin case a is when"00000001"=>b<="000"; when"00000010"=>b<="001"; when"00000100"=>b<="010"; when"00001000"=>b<="011"; when"00010000"=>b<="100"; when"00100000"=>b<="101"; when"01000000"=>b<="110"; when others=>b<="111"; end case; end process; end rtl;
3、8线---3线优先编码器的设计
library ieee; use ieee.std_logic_1164.all;
entity yxbm8_3 is port(i:in std_logic_vector(7 downto 0); s:in std_logic; y:out std_logic_vector(2 cownto 0); ys,yex:out std_logic); end yxbm8_3
architecture rtl of yxbm8_3 is begin process(i,s) begin if s='1'then y<="111"; ys<='1'; ysx<='0'; else if i(7)='0'then y<="001"; ys<='1'; ysx<='0'; else if i(6)='0'then y<="001"; ys<='1'; ysx<='0'; else if i(5)='0'then y<="010"; ys<='1'; ysx<='0'; else if i(4)='0'then y<="011"; ys<='1'; ysx<='0'; else if i(3)='0'then y<="100"; ys<='1'; ysx<='0'; else if i(2)='0'then y<="101"; ys<='1'; ysx<='0'; else if i(1)='0'then y<="110"; ys<='1'; ysx<='0'; else if i(0)='0'then y<="111"; ys<='1'; ysx<='0'; else if i='11111111'then y<="111"; ys<='1'; ysx<='0'; end if; end if; end process; end rtl;
4、二---十进制编码器的设计
library ieee; use ieee.std_logic_1164.all;
entity bmq is port(i:in std_logic_vector(8 downto 0); yLout std_logic_vctor(3 downto 0)); end bmq;
architecture rtl of bmq is begin process(i); begin if i(8)='0'then y<="0110"; elsif i(7)='0'then y<="0111"; elsif i(6)='0'then y<="1000"; elsif i(5)='0'then y<="1001"; elsif i(4)='0'then y<="1010"; elsif i(3)='0'then y<="1011"; elsif i(2)='0'then y<="1100"; elsif i(1)='0'then y<="1101"; elsif i(0)='0'then y<="1110"; elsif i='11111111'then y<="1111"; end if; end process; end rtl;
5、译码器(3线---8线)的设计
library ieee; use ieee.std_logic_1164.all; entity ym3_8 is port(A0,A1,A2:in bit; s1,s2,s3:in bit; y0,y1,y2,y3,y4,y5,y6,y7:out bit); end ym3_8;
architecture rtl of ym3_8 is signal s:bit; signal A:bit_vector(2 downto 0); signal y:bit_vector(7 downto 0); begin process(A,s1,s2,s3) begin s<=s2 or s3; A<=A2&A1&A0; if s1='0'then y<="11111111" elsif s='1'then y<="11111111"; else case A 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; end if; end process; y0<=y(0); y1<=y(1); y2<=y(2); y3<=y(3); y4<=y(4); y5<=y(5); y6<=y(6); y7<=y(7); end rtl;
6、二---十进制译码器的设计
library ieee; use ieee.std_logic_1164.all;
entity ym2_10 is port(a:in atd_logic_vector(3 downto 0); y:out atd_logic_vector(9 downto 0)); end ym2_10:
architecture rtl of ym2_10 is bigin process(a) bigin case a is when"0000"=>y<="1111111110"; when"0001"=>y<="1111111101"; when"0010"=>y<="1111111011"; when"0011"=>y<="1111110111"; when"0100"=>y<="1111101111"; when"0101"=>y<="1111011111"; when"0110"=>y<="1110111111"; when"0111"=>y<="1101111111"; when"1000"=>y<="1011111111"; when"1001"=>y<="0111111111"; when pthers=>y<="11111111"; end case; end process; end rtl;
7、BCD七段显示译码器的设计
library ieee; use ieee.std_logic_1164.all;
entity qdym is port(a:in atd_logic_vector(3 downto 0); y:out atd_logic_vector(6 downto 0)); end qdym;
architecture rtl of qdym is begin process(a) begin case a is when"0000"=>Y<="0111111"; when"0001"=>Y<="0000110"; when"0010"=>Y<="1011011"; when"0011"=>Y<="1001111"; when"0100"=>Y<="1100110"; when"0101"=>Y<="1101101"; when"0110"=>Y<="1111101"; when"0111"=>Y<="0100111"; when"1000"=>Y<="1111111"; when"1001"=>Y<="1101111"; when"1010"=>Y<="1110111"; when"1011"=>Y<="1111100"; when"1100"=>Y<="0111001"; when"1101"=>Y<="1011110"; when"1110"=>Y<="1111001"; when OTHERS=>Y<="1110001"; end case; end process; end rtl;
8、代码转换
library ieee; use ieee.std_logic_1164.all;
entity zhuanhuan is port(x0,x1,x2,x3:in std_logic; c:in std_logic; y0,y1,y2,y3:out std_logic); end zhuanhuan;
architecture rtl of zhuanhuan is begin y3<=x3; y2<=(x3 and(not x2))or((not x3)and x2); y1<=((not c)and((x3 and x2 and x1)or((not x3)and(not x2)andx1)or((not x3)and x2 and(not x1))or(x3 and(out x2)and(out x1))))or(c and((x2 and(notx1))or((not x2)and x1))); y0<=((not c)and(((not x3)and(not x2)and(not x1)and x0)or((not x3)and(not x2)and(not x0) and x1)or((notand(not x0)and(not x1)and x2)or((not x3)and x2 and x1 and x0)or(x3 and x2 and (not x1)and x0)or((not x0)and x2 and x1 and x3)or((not x0)and(not x2)and(not x1)and x3)0r(x3 and(not x2)and x1 and x0)))or(c and((x1 and(not x0))or((not x1)and x0))); end rtl;
9、四选一数据选择器的设计
library ieee; use ieee.std_logic_1164.all;
entity cxy is port(d0,d1,d2,d3,a0,a1,s:in std_logic; y:out std_logic); end cxy; architecture rtl of cxy is signal a:std_logic_vector(1 downto 0); begin process(a0,a1) begin a<=a1&a0; if(s='0')then case a is when"00"=>y<=d0; when"01"=>y<=d1; when"10"=>y<=d2; when others=>y<=d3; end case; end if; end process; end rtl;
10、八选一数据选择器的设计
library ieee; use ieee.std_logic_1164.all;
entity 1334 is port(d0,d1,d2,d3,d4,d5,d6,d7,a0,a1,a2:in std_logic; y:out std_logic); end 1334;
architecture rtl of 1334 is signal a:std_logic_vector(2 downto 0); begin process(a0,a1,a2) begin a<=a2&a1&a0; case a is when"000"=>y<=d0; when"001"=>y<=d1; when"010"=>y<=d2; when"011"=>y<=d3; when"100"=>y<=d4; when"101"=>y<=d5; when"110"=>y<=d6; when others=>y<=d7; end case; end process; end rtl;
11、4位全加器的设计 (1)1位全加器
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity qjq is port(a,b:in std_logic; ci:in std_logic; co:out std_logic; s:out std_logic); end qjq;
architecture rtl of qjq is begin process(a,b,ci); begin if(a='0'and b='0'and ci='0')then s<='0'; so<='0'; elsif(a='1'and b='0'and ci='0')then s<='1'; so<='0'; elsif(a='0'and b='1'and ci='0')then s<='1'; so<='0'; elsif(a='1'and b='1'and ci='0')then s<='0'; so<='1'; elsif(a='0'and b='0'and ci='1')then s<='1'; so<='0'; elsif(a='0'and b='1'and ci='1')then s<='0'; so<='1'; elsif(a='1'and b='0'and ci='1')then s<='0'; so<='1'; else s<='1'; co<='1'; end if; end process; end rtl;
12、8位加法器的设计
程序一:
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity adder4b is port (cin:in std_logic; a,b:in std_logic_vector(3 downto 0); s:out std_logic_vector(3 downto 0); cout:out std_logic); end adder4b;
architecture behav of adder4b is signal sint:std_logic_vector(4 downto 0); signal aa:std_logic_vector(4 downto 0); begin aa<='0'&a(3 downto 0); bb<='0'&b(3 downto 0); sint<=aa+bb+cin; s(3 downto 0)<=sint(3 downto 0); cout<=sint(4) end behav;
程序二:
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity adder8b is port (cin:in std_logic; a,b:in std_logic_vector(7 downto 0); s:out std_logic_vector(7 downto 0); cout:out std_logic); end adder8b;
architecture behav of adder8b is component adder4b port (cin:in std_logic; a,b:in std_logic_vector(3 downto 0); s:out std_logic_vector(3 downto 0); cout:out std_logic); end component; signal carry_out:std_logic; begin u1:adder4b port map(cin=>cin,a=>a(3 downto 0),b=>b(3 downto 0),s=>(3 downto 0), cout=>carry_out); u2:adder4b port map(cin=>carry_out,a=>a(7 downto 4),b=>b(7 downto 4),s=>s(7 downto 4),cout=>cout); end struc;
13、多位数值比较器的设计
library ieee; use ieee.std_logic_1164.all; entity cc14585 is port(a,b:in std_logic_vector(3 downto 0); cc14585y1,y2,y3:out std_logic); end cc14585;
architecture rtl of cc14585 is begin process(a,b) begin if(a>b)then y1<='1'; y2<='0'; y3<='0'; elsif(a=b)then y1<='0'; y2<='1'; y3<='0'; else y1<='0'; y2<='0'; y3<='1'; end if; end process; end rtl;
|