1、3-3 给出一个4选1多路选择器的VHDL描述。选通控制端有四个输入:S0、S1、S2、S3。当且仅当S0=0时:Y=A;S1=0时:Y=B;S2=0时:Y=C;S3=0时:Y=D。 --解:4选1多路选择器VHDL程序设计。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41a IS PORT( A,B,C,D : IN STD_LOGIC; S0,S1,S2,S3 : IN STD_LOGIC; Y :
2、 OUT STD_LOGIC); END ENTITY mux41a; ARCHITECTURE one OF mux41a IS SIGNAL S0_3 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN S0_3<=S0&S1&S2&S3; y<=A WHEN S0_3="0111" ELSE B WHEN S0_3="1011" ELSE C WHEN S0_3="1101" ELSE D WHEN S0_3="1110" E
3、LSE
'Z';
END ARCHITECTURE one;
3-4 给出1位全减器的VHDL描述;最终实现8位全减器。要求:
1)首先设计1位半减器,然后用例化语句将它们连接起来,图4-20中h_suber是半减器,diff是输出差(diff=x-y),s_out是借位输出(s_out=1,x 4、 USE IEEE.STD_LOGIC_1164.ALL;
ENTITY h_suber IS
PORT( x,y: IN STD_LOGIC;
diff,s_out: OUT STD_LOGIC);
END ENTITY h_suber;
ARCHITECTURE hs1 OF h_suber IS
BEGIN
Diff <= x XOR (NOT y);
s_out <= (NOT x) AND y;
END ARCHITECTURE hs1;
--解(1 5、2):采用例化实现图4-20的1位全减器
LIBRARY IEEE; --1位二进制全减器顺层设计描述
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY f_suber IS
PORT(xin,yin,sub_in: IN STD_LOGIC;
sub_out,diff_out: OUT STD_LOGIC);
END ENTITY f_suber;
ARCHITECTURE fs1 OF f_suber IS
COMPONENT h_suber 6、调用半减器声明语句
PORT(x, y: IN STD_LOGIC;
diff,s_out: OUT STD_LOGIC);
END COMPONENT;
SIGNAL a,b,c: STD_LOGIC; --定义1个信号作为内部的连接线。
BEGIN
u1: h_suber PORT MAP(x=>xin,y=>yin, diff=>a, s_out=>b);
u2: h_suber PORT MAP(x=>a, y=>sub_in, diff=>diff_ 7、out,s_out=>c);
sub_out <= c OR b;
END ARCHITECTURE fs1;
(2)以1位全减器为基本硬件,构成串行借位的8位减法器,要求用例化语句来完成此项设计(减法运算是x-y-sun_in=difft)。
xin sub_out
yin u0
sub_in diff_out
x0
y0
sin
diff0
xin sub_out
yin u1
sub_in diff_out
x1
y1
diff1
xin sub_out
yin u7
sub 8、in diff_out
x7
y7
sout
diff7
……………….
……………….
串行借位的8位减法器
a0
a1
a6
--解(2):采用例化方法,以1位全减器为基本硬件;实现串行借位的8位减法器(上图所示)。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY suber_8 IS
PORT(x0,x1,x2,x3,x4,x5,x6,x7: IN STD_LOGIC;
y0,y1,y2,y3,y4,y5,y6,y7,sin 9、 IN STD_LOGIC;
diff0,diff1,diff2,diff3: OUT STD_LOGIC;
diff4,diff5,diff6,diff7,sout: OUT STD_LOGIC);
END ENTITY suber_8;
ARCHITECTURE s8 OF suber_8 IS
COMPONENT f_suber --调用全减器声明语句
PORT(xin,yin,sub_in: IN STD_LOGIC;
sub_ou 10、t,diff_out: OUT STD_LOGIC);
END COMPONENT;
SIGNAL a0,a1,a2,a3,a4,a5,a6: STD_LOGIC; --定义1个信号作为内部的连接线。
BEGIN
u0:f_suber PORT MAP(xin=>x0,yin=>y0,diff_out=>diff0,sub_in=>sin,sub_out=>a0);
u1:f_suber PORT MAP(xin=>x1,yin=>y1,diff_out=>diff1,sub_in=>a0,sub_out=>a1);
u2:f_suber PORT 11、 MAP(xin=>x2,yin=>y2,diff_out=>diff2,sub_in=>a1,sub_out=>a2);
u3:f_suber PORT MAP(xin=>x3,yin=>y3,diff_out=>diff3,sub_in=>a2,sub_out=>a3);
u4:f_suber PORT MAP(xin=>x4,yin=>y4,diff_out=>diff4,sub_in=>a3,sub_out=>a4);
u5:f_suber PORT MAP(xin=>x5,yin=>y5,diff_out=>diff5,sub_in=>a4,sub_out=>a5);
u6: 12、f_suber PORT MAP(xin=>x6,yin=>y6,diff_out=>diff6,sub_in=>a5,sub_out=>a6);
u7:f_suber PORT MAP(xin=>x7,yin=>y7,diff_out=>diff7,sub_in=>a6,sub_out=>sout);
END ARCHITECTURE s8;
3-8 设计一个求补码的程序,输入数据是一个有符号的8位二进制(原码)数。
--解:5-9 设计一个求补码的程序,输入数据是一个有符号的8位二进制数。
LIBRARY IEEE;
USE IEEE.STD_L 13、OGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY org_patch IS
PORT( org_data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--原码输入
patch_data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--补码输出
END org_patch;
ARCHITECTURE BHV OF org_patch IS
BEGIN
PROCESS(org_dat 14、a)
BEGIN
IF(org_data(7)='0') THEN
patch_data<=org_data; --org_data>=0,补码=原码。
else
patch_data<=org_data(7)&(not org_data(6 DOWNTO 0))+1;--org_data<0,补码=|原码|取反+1。
END IF;
END PROCESS;
END BHV;
3—10
library ieee;
use ieee.std_logic 15、1164.all;
use ieee.std_logic_unsigned.all;
entity add is
port(a:in std_logic_vector(7 downto 0);
b:in std_logic_vector(7 downto 0);
ci:in std_logic;
co:out std_logic;
count:out std_logic_vector(7 downto 0));
end add;
architecture bhv of add is
begin
process(a,b,ci)
v 16、ariable data:std_logic_vector(1 downto 0);
variable c:std_logic;
begin
c:=ci;
for n in 0 to 7 loop
data:=('0'&a(n))+('0'&b(n))+('0'&c);
count(n)<=data(0);
c:=data(1);
end loop;
co<=c;
end process;
end bhv;
3-14 用循环语句设计一个7人投票表决器,及一个4位4输入最大数值检测电路。
--解:5-7 用循环语句设计一个7人投票表决器,及一个4位4输 17、出最大数值检测电路。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY vote_7 IS
PORT( DIN: IN STD_LOGIC_VECTOR(6 DOWNTO 0);--7位表决输入(1:同意,0:不同意)
G_4: OUT STD_LOGIC; --超过半数指示
CNTH: OUT STD_LOGIC_VECTOR(2 DO 18、WNTO 0));--表决结果统计数
END vote_7;
ARCHITECTURE BHV OF vote_7 IS
BEGIN
PROCESS(DIN)
VARIABLE Q: STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
Q:="000";
FOR n IN 0 TO 6 LOOP -- n是LOOP的循环变量
IF(DIN(n)='1') THEN Q:=Q+1; END IF;
END LOOP;
19、 CNTH<=Q;
IF Q>=4 THEN G_4<='1'; ELSE G_4<='0'; END IF;
END PROCESS;
END BHV;
5-7 用VHDL设计一个功能类似74LS160的计数器。
--解:3-10 用VHDL设计一个功能类似74LS160(异步复位和同步使能加载、计数的十进制加法计数器)的计数器。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 I 20、S
PORT(CLK,RST,EN,LOAD : IN STD_LOGIC;
DATA : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位预置数
DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--计数值输出
COUT : OUT STD_LOGIC); --计数进位输出
END CNT10;
ARCHITECTURE behav OF CNT10 IS
BEGIN
PROCESS(CLK,RST,EN,LOAD)
VARIABLE Q : STD_L 21、OGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF RST='0' THEN Q:=(OTHERS =>'0'); --计数器异步复位
ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF EN='1' THEN --检测是否允许计数或加载(同步使能)
IF LOAD='0' THEN Q:=DATA; --允许加载
ELSE
IF Q<9 THEN Q:=Q+1; -- 22、允许计数,检测是否小于9
ELSE Q:=(OTHERS=>'0'); --大于等于9时,计数值清零
END IF;
END IF;
END IF;
END IF;
IF Q=9 THEN COUT<='1'; --计数大于9,输出进位信号
ELSE COUT<='0';
END IF;
DOUT<=Q; --将计数值向端口输出
END PROCESS;
END behav;
5-8给出含有异步清零和计数使能的 23、16位二进制加减可控计数器的VHDL描述。
--解:3-11 给出含有异步清零和计数使能的16位二进制加减可控计数器的VHDL描述。
-- 用VHDL实现含有异步清零和计数使能的16位二进制加减可控计数器。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADD_SUB_LOAD_16 IS
PORT (CLK,RST,ADD_EN,SUB_EN,LOAD : IN STD_LOGIC;
24、 DATA : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
CQ : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
COUT : OUT STD_LOGIC);
END ENTITY ADD_SUB_LOAD_16;
ARCHITECTURE A_S_16 OF ADD_SUB_LOAD_16 IS
BEGIN
PROCESS(CLK,RST,ADD_EN,S 25、UB_EN,LOAD)
VARIABLE CQI: STD_LOGIC_VECTOR(15 DOWNTO 0);
--VARIABLE LS_LOAD : STD_LOGIC;
BEGIN
--LS_LOAD:=LOAD;
IF RST = '1' THEN CQI:=(OTHERS => '0'); --计数器异步复位
ELSIF LOAD = '1' THEN CQI:=DATA; --LS_LOAD:='0'; --计数器 26、异步复位
ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF ADD_EN='1'THEN --检测是否允许计数(同步他能)
IF CQI<16#FFFF# THEN CQI:=CQI+1; --允许计数,检测是否小于65535
ELSE CQI:=(OTHERS => '0'); --大于65535,计数值 27、清零
END IF;
IF CQI=16#FFFF# THEN COUT<='1'; --计数大于9,输出进位信号
ELSE COUT <= '0';
END IF;
END IF;
IF SUB_EN='1'THEN --检测是否允许计数(同步他能)
IF CQI>0 THEN CQI:=CQI-1; 28、 --允许计数,检测是否小于65535
ELSE CQI:=(OTHERS => '1'); --大于65535,计数值清零
END IF;
IF CQI=0 THEN COUT<='1'; --计数大于9,输出进位信号
ELSE COUT <= '0';
END IF;
END IF;
END IF;
CQ<=CQ 29、I; --将计数值向端口输出
END PROCESS;
END ARCHITECTURE A_S_16;
5-9
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity m6 is
port(clk,rst:in std_logic;
q: out std_logic_vector(2 downto 0));
end m6;
30、 architecture bhv of m6 is
type states is(st0,st1,st2,st3,st4,st5);
signal stx:states;
begin
process(clk)
begin
if rst='1' then stx<=st0;q<="000";
elsif clk'event and clk='1' then
case(stx) is
when st0=>q<="000";stx<=st1;
when st1=>q<="001";stx<=st2;
when 31、 st2=>q<="011";stx<=st3;
when st3=>q<="111";stx<=st4;
when st4=>q<="101";stx<=st5;
when st5=>q<="100";stx<=st0;
when others=> stx<=st0;
end case;
end if;
end process;
end bhv;
5-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果。当5位输入中1的数目为奇数时,在最后一位的时刻输出1。
--解:4-1 32、2 用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果。
-- 当5位输入中1的数目为奇数时,在最后一位的时刻输出1。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY odd_even_p_RXD_5 IS
PORT(CLK,RST,S_in: IN STD_LOGIC;--CLK、RST、S_in:时钟、复位、串行输入数据
P_out: OU 33、T STD_LOGIC_VECTOR(4 DOWNTO 0);--P_out:并行输出数据
o_e_out: OUT STD_LOGIC); --o_e_out:奇校验输出位
END ENTITY odd_even_p_RXD_5;
ARCHITECTURE one OF odd_even_p_RXD_5 IS
BEGIN
PROCESS(CLK,RST)
VARIABLE shift_Q : STD_LOGIC_VECTOR(4 DOWNTO 0);--shi 34、ft_Q:移位寄存器
VARIABLE shift_cnt : STD_LOGIC_VECTOR(2 DOWNTO 0);--shift_cnt:移位计数器
BEGIN
IF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF RST = '1' THEN shift_cnt:="100"; --移位寄存器和计数器复位
ELSE
IF shift_cnt=4 THEN --检测到接收5位串行输入数据
35、 shift_cnt:="000"; --移位计数器清零,为接收下一组数据做准备。
P_out<=shift_Q;--接收数据并行输出
o_e_out<=shift_Q(4) XOR shift_Q(3) XOR shift_Q(2) XOR shift_Q(1) XOR shift_Q(0);--奇校验输出
shift_Q:=S_in & shift_Q(4 DOWNTO 1);--采样移位串行输入
ELSE
shift_cnt:=shift_ 36、cnt+1;--移位计数
shift_Q:=S_in & shift_Q(4 DOWNTO 1);--采样移位串行输入
END IF;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE one;
5-5 分频方法有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计数器即可办到。但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。
试对例3-20的设计稍作修改, 37、将其进位输出COUT与异步加载控制LOAD连在一起,构成一个自动加载型16位二进制数计数器,也即一个16位可控的分频器,给出其VHDL表述,并说明工作原理。设输入频率fi=4MHz,输出频率fo=516.5±1Hz(允许误差±0.1Hz),16位加载数值是多少?
--解:3-9 16位数控分频器(可进行奇偶数分频)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DVF16 IS
PORT(CLK : IN STD_LOGIC;
D 38、 IN STD_LOGIC_VECTOR(15 DOWNTO 0);
FOUT : OUT STD_LOGIC);
END ENTITY DVF16;
ARCHITECTURE one OF DVF16 IS
SIGNAL FULL : STD_LOGIC;
BEGIN
P_REG: PROCESS(CLK)
VARIABLE CNT8 : STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
IF CNT8 = "0000000000000 39、000" THEN
CNT8 := D-1;--当CNT8计数归0时,预置CNT8=D-1;
--计数范围(D=n):n-1~n/2取整(n=10:9\8\7\6\5计数,前后半周期相同)
FULL <= '1';--同时使溢出标志信号FULL输出为高电平
--(n=11:10\9\8\7\6\5计数,前比后半周期多一个时钟)
ELSIF CNT8 = ('0' & D(15 DOWNTO 1)) THEN
CNT8 :=('0' & D(15 DO 40、WNTO 1))-1;--当CNT8=n/2取整时,预置CNT8=D/2取整-1;
--计数范围(D=n):n/2取整~0(n=10:4\3\2\1\0计数)
FULL <= '1'; --同时使溢出标志信号FULL输出为高电平 (n=11:4\3\2\1\0计数)
ELSE CNT8 := CNT8 - 1; --否则继续作加1计数
FULL <= '0'; --且输出溢出标志信号FULL为低电平
END IF;
END 41、IF;
END PROCESS P_REG ;
P_DIV: PROCESS(FULL)
VARIABLE CNT2 : STD_LOGIC;
BEGIN
IF FULL'EVENT AND FULL = '1' THEN
CNT2 := NOT CNT2;--如果溢出标志信号FULL为高电平,D触发器输出取反
IF CNT2 = '1' THEN FOUT <= '1';
ELSE FOUT <= '0';
END IF;
END IF;
END PROCESS P_DIV;
END 42、 ARCHITECTURE one;
5-6 分别给出图3-20所示的六个RTL图的VHDL描述,注意其中的D触发器和锁存器的表述。
图3-20 RTL图
图3-20 RTL图(a)
--解:实现图3-20(a)RTL图的VHDL程序t3_12_a.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY t3_12_a IS
PORT (CL,CLK0: IN STD_LOGIC;
OUT1: OUT STD_LOGIC);
43、 END ENTITY t3_12_a;
ARCHITECTURE sxdl OF t3_12_a IS ----时序电路sxdl
SIGNAL Q : STD_LOGIC;
BEGIN
PROCESS(CLK0)
BEGIN
IF CLK0'EVENT AND CLK0='1' THEN --检测时钟上升沿
Q <= NOT(Q OR CL);
END IF;
END PROCESS;
OUT1 <= NOT Q;
44、 END ARCHITECTURE sxdl;
图3-20 RTL图(b)
--解:实现图3-20(b)RTL图的VHDL程序t3_12_b.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY t3_12_b IS
PORT (A,B,C,D: IN STD_LOGIC;
Y: OUT STD_LOGIC);
END ENTITY t3_12_b;
ARCHITECTURE sxdl OF t3_12_b IS 45、 ----时序电路sxdl
SIGNAL AB,CD,ABCD : STD_LOGIC;
BEGIN
PROCESS(A,B,C,D,AB,CD,ABCD)
BEGIN
AB<=A OR B;
CD<=C AND D;
ABCD<=AB XOR CD;
CASE AB IS --类似于真值表的case语句
WHEN '0' => Y <= A;
WHEN '1' => Y <= ABCD;
46、 WHEN OTHERS =>NULL ;
END CASE;
END PROCESS;
END ARCHITECTURE sxdl;
图3-20 RTL图(c)
--解1:实现图3-20(c) RTL图的VHDL程序mux21a.vhd底层设计描述。
-- 用(WHEN_ELSE)实现2选1多路选择器程序(mux21a.vhd)。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux21a IS
PORT(a,b : 47、IN STD_LOGIC;
s : IN STD_LOGIC;
y : OUT STD_LOGIC);
END ENTITY mux21a;
ARCHITECTURE one OF mux21a IS
BEGIN
y<=a WHEN s='0' ELSE b;
END ARCHITECTURE one;
--解2:实现图3-20(c)RTL图的VHDL程序DFF6.vhd底层设计描述。
-- 电平触发D型触发器程序(DFF6.vhd)
LIBRARY IEEE;
48、
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DFF6 IS
PORT(CLK: IN STD_LOGIC;
D: IN STD_LOGIC;
Q:OUT STD_LOGIC);
END;
ARCHITECTURE bhv OF DFF6 IS
BEGIN
PROCESS(CLK,D)
BEGIN
IF CLK='1'
THEN Q<=D;
END IF;
49、 END PROCESS;
END bhv;
--解3:实现图3-20(c)RTL图的VHDL程序t3_12_c.vhd顶层设计描述。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY t3_12_c IS
PORT(D1,D2,CLK : IN STD_LOGIC;
Q : OUT STD_LOGIC);
END ENTITY t3_12_c;
ARCHITECTURE one OF t3_12_c IS
50、 COMPONENT mux21a --调用2选1多路选择器声明语句
PORT(a,b : IN STD_LOGIC;
s : IN STD_LOGIC;
y : OUT STD_LOGIC);
END COMPONENT;
COMPONENT DFF6 --调用电平型D触发器声明语句
PORT(CLK: IN STD_LOGIC;
D: IN STD_LOGIC;
Q:OUT






