简单数字系统的VHLD应用设计 双优先编码器 电路要求 kbencoder 数据输入订[7.0]低电平有效控制输入el低电平有效 数据输出a[2.0]反函数输出:表达最高位优先编码 数据输出b[2.0]反函数输出:表达次高位优先编码 设计思想 利用优先编码器先确定a,将a译码后与输入进行同或运 算,消去最高编码位后,再用优先编码器确定b: 利用前面的优先编码器( encoder),用选择代入语句进行 二进制译码,利用代入语句进行连接运算(隔离、反相、同 或) 优先 隔离 编码 优先 相一译码回同或一编 use Ieee estd logic 1164.all; port(e: in std logic; 1: in std logic vector(7 downto 0); a: out std logic vector(2 downto 0); b: out std logic vector(2 downto O))
简单数字系统的 VHLD 应用设计 双优先编码器 电路要求 kbencoder 数据输入 i[7..0] 低电平有效 控制输入 el 低电平有效 数据输出 a[2..0] 反函数输出:表达最高位优先编码 数据输出 b[2..0] 反函数输出:表达次高位优先编码 设计思想: 利用优先编码器先确定 a,将 a 译码后与输入进行同或运 算,消去最高编码位后,再用优先编码器确定 b; 利用前面的优先编码器(kencoder),用选择代入语句进行 二进制译码,利用代入语句进行连接运算(隔离、反相、同 或); library ieee; use ieee.std_logic_1164.all; entity kbencoder is port (e: in std_logic; i: in std_logic_vector(7 downto 0); a: out std_logic_vector(2 downto 0); b: out std_logic_vector(2 downto 0)); end kbencoder;
architecture mixt of kbencoder is signal a0 std logic vector(2 downto 0) signal d: std logic vector(2 downto 0); signal k: std logic vector(7 downto 0) signal m: std logic vector(7 downto 0); component encoder is port(i: in std logic vector (7 downto 0) el: in std I a: out std logic vector(2 downto O)) nen ul: encoder port map(i, e, a0) d(o)= not a0(0); d (1)= not a0(1), d (2)<=not a0(2) with d select k<= o111lll1" when 000 10111111" when001 "11011111" when 010 11101111 when01l 11110111"when"100 "11111011"when "101" "11111101" when"110" "11111110" when"111" "11111111"when othe m(O)=k(0) xnor i(0): m(1)=k(1)xnor i() m(2)<=k(2) xnor I(2);m(3)=k(3) xnor I(3) m(4)<=k(4) Xnor I(4);m(5)<=k(5) Xnor I(5) m(6<=k(6) Xnor I(6),m(7)<=k(7) Xnor I(7) u2: encoder port map(m, e, b) end mixt
architecture mixt of kbencoder is signal a0:std_logic_vector(2 downto 0); signal d: std_logic_vector(2 downto 0); signal k: std_logic_vector(7 downto 0); signal m: std_logic_vector(7 downto 0); component kencoder is port (i: in std_logic_vector (7 downto 0); el: in std_logic; a: out std_logic_vector(2 downto 0)); end component ; begin u1: kencoder port map (i,e, a0 ); d(0)<= not a0(0); d(1)<= not a0(1); d(2)<= not a0(2); a<=a0; with d select k<= "01111111" when "000", "10111111" when "001", "11011111" when "010", "11101111" when "011", "11110111" when "100", "11111011" when "101", "11111101" when "110", "11111110" when "111", "11111111" when others; m(0)<= k(0) xnor i(0); m(1)<= k(1) xnor i(1); m(2)<= k(2) xnor i(2); m(3)<= k(3) xnor i(3); m(4)<= k(4) xnor i(4); m(5)<= k(5) xnor i(5); m(6)<= k(6) xnor i(6); m(7)<= k(7) xnor i(7); u2: kencoder port map (m,e,b); end mixt;
移位相加乘法器 利用移位寄存器的乘法功能,可以设计移位相加乘法器 设计思想: 从低到高依次检查乘数的每一位是否为1,若为1则将被 乘数移位相加,若为0则被乘数只移位不相加; 使用部件 加法器(16位),不需要进位输出(假定没有溢出); 具有控制端的16位寄存器,存放加法结果 16位移位寄存器,使被加数移位(乘2) 8位移位寄存器,使加数左移串出,用于控制寄存器输入 加数通过时钟开关送到寄存器控制端,控制寄存器数据 的变化 设计框图 adder reg shfregB 实体设计: entity shfmult8 is port(a: in std logic vector(7 downto O); b: in std logic vector(7 downto 0) clk, ld, clr: in std logic: g: out std logic vector(15 downto O))
移位相加乘法器 利用移位寄存器的乘法功能,可以设计移位相加乘法器; 设计思想: 从低到高依次检查乘数的每一位是否为 1,若为 1 则将被 乘数移位相加,若为 0 则被乘数只移位不相加; 使用部件: 加法器(16 位),不需要进位输出(假定没有溢出); 具有控制端的 16 位寄存器,存放加法结果; 16 位移位寄存器,使被加数移位(乘 2); 8 位移位寄存器,使加数左移串出,用于控制寄存器输入; 加数通过时钟开关送到寄存器控制端,控制寄存器数据 的变化; 设计框图: 实体设计: entity shfmult8 is port (a: in std_logic_vector(7 downto 0); b: in std_logic_vector(7 downto 0); clk,ld,clr: in std_logic; q: out std_logic_vector(15 downto 0));
end shfmult 8 结构体设计 architecture str of shfmult8 is ignal as: unsigned(15 downto O) signal si: unsigned(15 downto 0) signal qi: unsigned(15 downto O) signal bs std logic component adder 16 port( a: in unsigned( 15 downto 0) b: in unsigned(15 downto 0); s: out unsigned(15 downto 0) end component omponent regl port( d: in std unsigned(15 downto 0) clk clr en: in std logic g: out unsigned(15 downto O); component shfreg8 port(d: in std logic vector(7 downto O clk, clr, ld: in std logic end component component shfreg 16 port(d: in std logic vector(16 downto 0) clk, clr, Id in std logic, ql: out unsigned(16 downto O)) end component process(clk) ul: shfreg16 port map(a,clk, clr, Id, as) u2: shfreg8 port map(b, clk, clr, Id, bs ); reg16 port map(si, clk, clr, bs, qi);
end shfmult8; 结构体设计 architecture str of shfmult8 is signal as: unsigned(15 downto 0); signal si: unsigned(15 downto 0); signal qi: unsigned(15 downto 0); signal bs: std_logic; component adder16 port ( a : in unsigned(15 downto 0); b: in unsigned(15 downto 0); s: out unsigned(15 downto 0);) end component; component reg16 port ( d : in std_unsigned(15 downto 0); clk,clr,en: in std_logic; q: out unsigned(15 downto 0);) end component; component shfreg8 port ( d : in std_logic_vector(7 downto 0); clk,clr,ld: in std_logic; ql: out std_logic); end component; component shfreg16 port ( d : in std_logic_vector(16 downto 0); clk,clr,ld: in std_logic; ql: out unsigned(16 downto 0)); end component; begin process (clk) begin u1: shfreg16 port map (a,clk,clr,ld,as); u2: shfreg8 port map (b,clk,clr,ld,bs); u3: reg16 port map (si,clk,clr,bs,qi);
在上述设计中,已对需要的4个元件的实体作出了具体规定, 下一步就可以根据这些规定,分头设计具体器件; 上述电路元件也可以采用进程和赋值语句分别描述如下: use ieee std logic 1164. all use ieee std logic arith. all entity shfmult8 is port( a: in std logic vector(7 downto 0) b: in std logic vector(7 downto 0) clk, ld, clr: in std logic g: out std logic vector( 15 downto O)) end shfmult8 architecture beh of shfmult& is signal si: unsigned( 15 downto 0) signal bi: std logic vector( 7 downto O ignal bs: std logic shfreg16: process(clk, clr) if clrl'then as0) elsif (clk'event and clk-'l)then if ld= then as<=00000000"& unsigned(a); as<=as(14 downto 0)&0;--shift to hign bit
u4: adder16 port map (as,qi,si); end process; q'0'); elsif (clk'event and clk='1') then if ld='1' then as<="00000000" & unsigned(a); else as<=as(14 downto 0) & '0'; --shift to hign bit
nd if nd process; shfreg8 process(clk, clr) begi if clrl' then bi0") elsif(clk'event and clk'l")then if ld='I then bi0) elsif (clk'event and clk='I)then if bs<='I'th qi<=si;--shift to low bit nd if end if: q<=qi+0 循环码编码器的设计 在通信系统中,为减小信道噪声和干扰导致的误码,大 量采用信道编码技术进行差错控制。循环码就是其中经常采 用的一种编码方式
end if; end if; end process; shfreg8:process (clk,clr) begin if clr='1' then bi'0'); elsif (clk'event and clk='1') then if ld='1' then bi'0'); elsif (clk'event and clk='1') then if bs<= '1' then qi<=si; --shift to low bit end if; end if; end process; si<=qi+as; q<=qi+0; end beh; 循环码编码器的设计 在通信系统中,为减小信道噪声和干扰导致的误码,大 量采用信道编码技术进行差错控制。循环码就是其中经常采 用的一种编码方式
原理: 将信息码(n位)输入循环检验码发生器,由发生器产生 m位检验码,然后输出编码数据(n+m位),前面为信息码, 后面为检验码;(以下设n=4,m=3) 设计思想 初始时刻将系统各功能块清零 将输入数据(4位)通过并口送入7位移位寄存器,在后 面附加3个0,形成7位输入序列 将数据逐位送入发生器,同时送到2选1MUX 将发生器输出也送到2选1MUX 利用一个7进制计数器控制MUX:前4个周期输出输入 序列,后3个周期输出检验序列;进位脉冲作为输出信号, 表明一组数据处理完毕; 设计框图 shfreg7 000 count? clk 实体设计 entity coder port(d: in std logic vector(0 to 3) clr, clk, Id: in std logic z, co: out std logic)
原理: 将信息码(n 位)输入循环检验码发生器,由发生器产生 m 位检验码,然后输出编码数据(n+m 位),前面为信息码, 后面为检验码;(以下设 n=4,m=3) 设计思想: 初始时刻将系统各功能块清零; 将输入数据(4 位)通过并口送入 7 位移位寄存器,在后 面附加 3 个 0,形成 7 位输入序列; 将数据逐位送入发生器,同时送到 2 选 1MUX; 将发生器输出也送到 2 选 1MUX; 利用一个 7 进制计数器控制 MUX:前 4 个周期输出输入 序列,后 3 个周期输出检验序列;进位脉冲作为输出信号, 表明一组数据处理完毕; 设计框图: 实体设计 entity ccoder is port ( d: in std_logic_vector (0 to 3); clr, clk,ld: in std_logic; z,co: out std_logic); end ccoder;
结构体设计 architecture beh of coder is signal q: std logic vector(2 downto 0) signal s, y: std logic, mux:process(q, s,y) case q is when"00001010011"=→>zzz<=o' end process, cout7: process(clk, clr) end process shfreg7: process(clk,clr) end process checker process(clk, cl end process 课外作业: 1完成循环码编码器所要求的7进制计数器、7位右移并入串 出移位寄存器的设计;(每个功能块用一个进程表达) 2典型的循环检验码发生器原理图如下图所示:
结构体设计 architecture beh of ccoder is signal q: std_logic_vector(2 downto 0); signal s,y: std_logic; mux: process (q,s,y) case q is when "000|001|010|011"=>zzz<='0'; end case; end process; cout7:process(clk,clr) …… end process; shfreg7:process(clk,clr) …… end process; checker:process(clk,clr) …… end process; end beh; 课外作业: 1 完成循环码编码器所要求的 7 进制计数器、7 位右移并入串 出移位寄存器的设计;(每个功能块用一个进程表达) 2 典型的循环检验码发生器原理图如下图所示:
电路由3个d触发器和两个半加器构成 为此功能块设计一个进程,要求满足课堂例题所指定的规 氾
电路由 3 个 d 触发器和两个半加器构成; 为此功能块设计一个进程,要求满足课堂例题所指定的规 范;