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 ISPORT( A,B,C,D : IN STD_LOGIC;S0,S1,S2,S3 : IN STD_LOGIC;Y : OUT STD_LOGIC);END ENTITY mux41a;ARCHITECTURE one OF
2、mux41a ISSIGNAL S0_3 : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINS0_3xin,y=yin, diff=a, s_out=b);u2: h_suber PORT MAP(x=a, y=sub_in, diff=diff_out,s_out=c);sub_out 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 MAP(xin=x
3、2,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:f_suber PORT MAP(xin=x6,yin=y6,diff_ou
4、t=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_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY org_patch ISPORT( or
5、g_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 ISBEGINPROCESS(org_data)BEGINIF(org_data(7)=0) THENpatch_data=0,补码=原码。elsepatch_data=4 THEN G_40); -计数器异步复位 ELSIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿IF EN=1 THEN
6、-检测是否允许计数或加载(同步使能)IF LOAD=0 THEN Q:=DATA; -允许加载ELSE IF Q0); -大于等于 9 时,计数值清零END IF;END IF;END IF;END IF; IF Q=9 THEN COUT 0); -计数器异步复位ELSIF LOAD = 1 THEN CQI:=DATA; -LS_LOAD:=0; -计数器异步复位ELSIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿IF ADD_EN=1THEN -检测是否允许计数(同步他能)IF CQI 0); -大于 65535,计数值清零END IF;IF CQI=16#FFF
7、F# THEN COUT0 THEN CQI:=CQI-1; -允许计数,检测是否小于 65535ELSE CQI:=(OTHERS = 1); -大于 65535,计数值清零END IF;IF CQI=0 THEN COUTqqqqqq stx=st0;end case;end if;end process;end bhv;5-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测 5 位输入,输出一个结果。当 5位输入中 1 的数目为奇数时,在最后一位的时刻输出 1。-解:4-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测 5 位输入,输出一个结果。- 当 5 位输入中 1 的
8、数目为奇数时,在最后一位的时刻输出 1。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY odd_even_p_RXD_5 ISPORT(CLK,RST,S_in: IN STD_LOGIC;-CLK、RST、S_in:时钟、复位、串行输入数据P_out: OUT STD_LOGIC_VECTOR(4 DOWNTO 0);-P_out:并行输出数据o_e_out: OUT STD_LOGIC); -o_e_out:奇校验输出位END ENTITY odd_even_p_RXD_5;AR
9、CHITECTURE one OF odd_even_p_RXD_5 ISBEGINPROCESS(CLK,RST)VARIABLE shift_Q : STD_LOGIC_VECTOR(4 DOWNTO 0);-shift_Q:移位寄存器VARIABLE shift_cnt : STD_LOGIC_VECTOR(2 DOWNTO 0);-shift_cnt:移位计数器BEGINIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿IF RST = 1 THEN shift_cnt:=“100“; -移位寄存器和计数器复位ELSEIF shift_cnt=4 THEN -检测到
10、接收 5 位串行输入数据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 -采样移位串行输入ELSE shift_cnt:=shift_cnt+1;-移位计数shift_Q:=S_in -采样移位串行输入END IF;END IF;END IF;END PROCESS;END ARCHITECTURE one;5-5 分频方法
11、有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计数器即可办到。但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。试对例 3-20 的设计稍作修改,将其进位输出 COUT 与异步加载控制 LOAD 连在一起,构成一个自动加载型 16 位二进制数计数器,也即一个 16 位可控的分频器,给出其 VHDL 表述,并说明工作原理。设输入频率 fi=4MHz,输出频率 fo=516.51Hz(允许误差0.1Hz),16 位加载数值是多少?-解:3-9 16 位数控分频器 (可进行奇偶数分频)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164
12、.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DVF16 ISPORT(CLK : IN STD_LOGIC;D : IN STD_LOGIC_VECTOR(15 DOWNTO 0);FOUT : OUT STD_LOGIC);END ENTITY DVF16;ARCHITECTURE one OF DVF16 ISSIGNAL FULL : STD_LOGIC;BEGINP_REG: PROCESS(CLK)VARIABLE CNT8 : STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINIF CLKEVENT AND CLK =
13、 1 THENIF CNT8 = “0000000000000000“ THENCNT8 := D-1;-当 CNT8 计数归 0 时,预置 CNT8=D-1;-计数范围(D=n):n-1n/2 取整(n=10:98765 计数,前后半周期相同)FULL = 1;-同时使溢出标志信号 FULL 输出为高电平-(n=11:1098765 计数,前比后半周期多一个时钟 )ELSIF CNT8 = (0 -当 CNT8=n/2 取整时,预置 CNT8=D/2 取整-1;-计数范围(D=n):n/2 取整0(n=10:43210 计数) FULL = 1; -同时使溢出标志信号 FULL 输出为高电平
14、 (n=11:43210 计数)ELSE CNT8 := CNT8 - 1; -否则继续作加 1 计数FULL = 0; -且输出溢出标志信号 FULL 为低电平END IF;END IF;END PROCESS P_REG ;P_DIV: PROCESS(FULL)VARIABLE CNT2 : STD_LOGIC;BEGINIF FULLEVENT AND FULL = 1 THENCNT2 := NOT CNT2;-如果溢出标志信号 FULL 为高电平,D 触发器输出取反IF CNT2 = 1 THEN FOUT = 1;ELSE FOUT = 0;END IF;END IF;END PROCESS P_DIV;END ARCHITECTURE one;5-6 分别给出图 3-20 所示的六个 RTL 图的 VHDL 描述,注意其中的 D 触发器和锁存器的表述。图 3-20 RTL 图图 3-20 RTL 图(a)-解:实现图 3-20(a)RTL 图的 VHDL 程序 t3_12_a.vhdLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY t3_12_a ISPORT (CL,CLK0: IN STD_LOGIC;OUT1: OUT STD_LOGIC);END ENTITY t3_12_a;