ARCHITECTURE BHV OF vote_7 IS BEGIN
PROCESS(DIN)
VARIABLE Q: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN
Q:=\
FOR n IN 0 TO 6 LOOP -- n是LOOP的循环变量 IF(DIN(n)='1') THEN Q:=Q+1; END IF; END LOOP; CNTH<=Q;
IF Q>=4 THEN G_4<='1'; ELSE G_4<='0'; END IF; END PROCESS; END BHV;
5-8 从不完整的条件语句产生时序模块的原理看,例5-7和例5-10从表面上看都包含不完整条件语句,试说明,为什么它们的综合结果都是组合电路。
--【例5-7】预设计4选1多路器(通过变量测选择条件,将产生正确结果。) LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4 IS
PORT(i0,i1,i2,i3,a,b: IN STD_LOGIC; q: OUT STD_LOGIC); END mux4;
ARCHITECTURE body_mux4 OF mux4 IS BEGIN
process(i0,i1,i2,i3,a,b)
variable muxval: integer range 7 DOWNTO 0; begin
muxval:=0;
if (a= '1') then muxval := muxval+1; end if; if (b= '1') then muxval := muxval+2; end if; case muxval is when 0=>q<=i0; when 1=>q<=i1; when 2=>q<=i2; when 3=>q<=i3;
when others=>q<='X'; --null; end case; end process; END body_mux4;
--【例5-10】位矢中‘1’码个数统计电路设计 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNTC IS
PORT( DIN: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CNTH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END CNTC;
ARCHITECTURE BHV OF CNTC IS BEGIN
PROCESS(DIN)
VARIABLE Q: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
Q:=\
FOR n IN 0 TO 7 LOOP -- n是LOOP的循环变量 IF(DIN(n)='1') THEN Q:=Q+1; END IF; END LOOP; CNTH<=Q; END PROCESS; END BHV;
答:根据变量具有顺序立即赋值传送特性,例5-7和例5-10中的不完整条件语句对变量赋值前对变量进行初始值设置;每次敏感信号触发,对变量的赋值,总能产生结果,无保持状态——即输出是输入的函数;因此,只能产生组合逻辑电路;不可能产生时序逻辑电路。 5-9 设计一个求补码的程序,输入数据是一个有符号的8位二进制(原码)数。 --解:5-9 设计一个求补码的程序,输入数据是一个有符号的8位二进制数。 LIBRARY IEEE;
USE IEEE.STD_LOGIC_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_data) 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;
5-10 设计一个比较电路,当输入的8421BCD码大于5时输出1,否则输出0。 --解:5-10 设计一个比较电路,当输入的8421BCD码大于5时输出1,否则输出0。 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY g_5_cmp IS
PORT( d_in : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入数据
cmp_out : OUT STD_LOGIC); --比较输出(1:输入数据>5) END g_5_cmp;
ARCHITECTURE BHV OF g_5_cmp IS BEGIN
PROCESS(d_in) BEGIN
IF(d_in>\
cmp_out<='1'; --输入数据大于5,比较输出1。 else
cmp_out<='0'; --输入数据小于等于5,比较输出0。 END IF;
END PROCESS; END BHV;
5-11 用VHDL输入方式设计一个周期性产生二进制序列01001011001的序列发生器,用移位寄存器或用同步时序电路实现,并用时序仿真器验证其功能。
--解1:5-11 用原理图或VHDL输入方式分别设计一个周期性产生二进制序列01001011001的序列发生器,用移位寄存器或用同步时序电路实现,并用时序仿真器验证其功能。 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY S_generator IS
PORT(CLK,CLR: IN STD_LOGIC; --工作时钟/复位信号 S_out: OUT STD_LOGIC);--序列输出位 END S_generator;
ARCHITECTURE behav OF S_generator IS
SIGNAL D: STD_LOGIC_VECTOR(10 DOWNTO 0); --11位循环移位寄存器 BEGIN
PROCESS(CLK,CLR) BEGIN
IF CLK'EVENT AND CLK='1' THEN --时钟到来时,逐位左移循环输出序列位 IF CLR='1' THEN D<=\复位操作,产生11位待输出序列 ELSE
D(10 DOWNTO 1)<=D(9 DOWNTO 0); D(0)<=D(10); S_out<=D(10); END IF; END IF; END PROCESS; END behav; --解2:5-11 用原理图输入方式设计一个周期性产生二进制序列01001011001的序列发生器,用移位寄存器或用同步时序电路实现,并用时序仿真器验证其功能。
5-12 用74194(4位双向通用移位寄存器)、74273(8D触发器)、D触发器等器件组成8位串入并出的转换电路,要求在转换过程中数据不变,只有当8位一组数据全部转换结束后,输出才变化一次。
5-13 根据例5-8设计8位左移移位寄存器,给出时序仿真波形。 --解:8位左移寄存器CHDL程序 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SHFLT8 IS --8位左移寄存器 PORT(CLK,LOAD: IN STD_LOGIC;
DIN: IN STD_LOGIC_VECTOR(7 DOWNTO 0); QB:OUT STD_LOGIC); END SHFLT8;
ARCHITECTURE behav OF SHFLT8 IS BEGIN
PROCESS (CLK,LOAD)
VARIABLE REG8: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN
IF CLK'EVENT AND CLK='1'THEN
IF LOAD='1'THEN REG8:=DIN; --由(LOAD='1')装载新数据 ELSE REG8(7 DOWNTO 1):=REG8(6 DOWNTO 0); --左移 END IF; END IF;
QB<=REG8(7); --输出最高位 END PROCESS ; END behav ;
5-14 将例5-15中的四个IF语句分别用四个并列进程语句表达出来。 --解:三态缓冲器VHDL程序 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY tristate2 IS
PORT(input3,input2,input1,input0: IN STD_LOGIC_VECTOR(7 DOWNTO 0); enable: IN STD_LOGIC_VECTOR(1 DOWNTO 0); output: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END tristate2;
ARCHITECTURE multiple_drivers OF tristate2 IS BEGIN
PR1: PROCESS(enable,input3,input2,input1,input0) BEGIN
IF enable=\ ELSE output<=(OTHERS=>'Z'); END IF; END PROCESS;
PR2: PROCESS(enable,input3,input2,input1,input0) BEGIN
IF enable=\ ELSE output<=(OTHERS=>'Z'); END IF; END PROCESS;
PR3: PROCESS(enable,input3,input2,input1,input0) BEGIN
IF enable=\ ELSE output<=(OTHERS=>'Z'); END IF; END PROCESS;
PR4: PROCESS(enable,input3,input2,input1,input0) BEGIN
IF enable=\ ELSE output<=(OTHERS=>'Z'); END IF;