《第三章讲义VHDL程序设计》由会员分享,可在线阅读,更多相关《第三章讲义VHDL程序设计(84页珍藏版)》请在金锄头文库上搜索。
1、第三章讲义VHDL程序设计21、基本门电路32、编码器 设计一个 8 输入优先级编码器,y0 级别最低,y7 级别最高;输出为3位编码。Y7=1Y7=1Vec=111Vec=111Y6=1Y6=1Vec=110Vec=110Y5=1Y5=1Vec=101Vec=101Y4=1Y4=1Vec=100Vec=100Y3=1Y3=1Vec=011Vec=011Y2=1Y2=1Vec=010Vec=010Y1=1Y1=1Vec=001Vec=001Y0=1Y0=1Vec=000Vec=0004方法1:利用 if 多选择语句自顶向下的优先特性Y7=1Y7=1Vec=111Vec=111Y6=1Y6=1V
2、ec=110Vec=110Y5=1Y5=1Vec=101Vec=101Y4=1Y4=1Vec=100Vec=100Y3=1Y3=1Vec=011Vec=011Y2=1Y2=1Vec=010Vec=010Y1=1Y1=1Vec=001Vec=001Y0=1Y0=1Vec=000Vec=0005方法2:进程内为顺序语句,最先描述优先级最低, 最后描述优先级最高,可实现优先级编码。Y7=1Y7=1Vec=111Vec=111Y6=1Y6=1Vec=110Vec=110Y5=1Y5=1Vec=101Vec=101Y4=1Y4=1Vec=100Vec=100Y3=1Y3=1Vec=011Vec=011Y
3、2=1Y2=1Vec=010Vec=010Y1=1Y1=1Vec=001Vec=001Y0=1Y0=1Vec=000Vec=0006方法3:利用条件赋值语句 73、译码器 译码器是编码器的逆过程。如 3-8 译码器:sel=000sel=000Y=00000001Y=00000001sel =001sel =001Y=00000010Y=00000010sel =010sel =010Y=00000100Y=00000100sel =011sel =011Y=00001000Y=00001000sel =100sel =100Y=00010000Y=00010000sel =101sel =1
4、01Y=00100000Y=00100000sel =110sel =110Y=01000000Y=01000000sel =111sel =111Y=10000000Y=100000008方法1:使用逻辑左移运算符library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity decoder is port(inp : in std_logic_vector(2 downto 0); outp : out std_logic_vector(7 downto 0); end decoder;
5、architecture rtl of decoder is begin outp=shl(“00000001”, inp); end rtl;sel=000sel=000Y=00000001Y=00000001sel =001sel =001Y=00000010Y=00000010sel =010sel =010Y=00000100Y=00000100sel =011sel =011Y=00001000Y=00001000sel =100sel =100Y=00010000Y=00010000sel =101sel =101Y=00100000Y=00100000sel =110sel =1
6、10Y=01000000Y=01000000sel =111sel =111Y=10000000Y=100000009方法2:使用process语句 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity decoder is port(inp : in std_logic_vector(2 downto 0); outp : out std_logic_vector(7 downto 0); end decoder; architecture rtl of decoder is be
7、gin process(inp) begin outp0); outp(conv_integer(inp)=1; end process; end rtl;sel=000sel=000Y=00000001Y=00000001sel =001sel =001Y=00000010Y=00000010sel =010sel =010Y=00000100Y=00000100sel =011sel =011Y=00001000Y=00001000sel =100sel =100Y=00010000Y=00010000sel =101sel =101Y=00100000Y=00100000sel =110
8、sel =110Y=01000000Y=01000000sel =111sel =111Y=10000000Y=1000000010方法3:使用 case 语句实现。1112方法4:使用条件赋值语句134、加法器 带进位的 4位加法器符号如下:Sum(i) = a(i) b(i) cinC(i+1) = a(i) b(i) +(a(i) + b(i) ) c(i) 14方法1:用for loop语句实现 15方法2:直接使用加法“+”函数:位宽扩展16加法器仿真结果:175、多路选择器 前面用 if 语句、case 语句、条件赋值语句、选择赋值语句分别描述过4选1选择器。6、三态门 VHDL语
9、言通过指定大写的Z值表示高阻状态 a : std_logic; a_bus:std_logic_vector(7 downto 0); 指定高阻状态如下: a = Z ; a_bus = “ZZZZZZZZ” ;18三态门电路描述19三态门仿真结果:20二 时序逻辑电路设计 触发器、寄存器、计数器、分频器、信号发生器等。一)时序电路特殊信号的描述 时钟信号和复位信号 1、时钟信号描述 常用的描述方式: 1)进程的敏感信号是时钟信号,在进程内 部用if 语句描述时钟的边沿条件。21如: process (clock_signal) begin if (clock_edge_condition)
10、then signal_out = signal_in ; 其它时序语句 end if ; end process ; 222)在进程中用wait until语句描述时钟信号,此 时进程将没有敏感信号。 如: process begin wait until (clock_edge_condition); signal_out = signal_in ; 其它时序语句 end process ; 23 注意: a.在对时钟边沿说明时,一定要注明是上升沿 还是下降沿。 b.一个进程中只能描述一个时钟信号。 c.wait until 语句只能放在进程的最前面或 最后面。3)时钟边沿的描述 时钟上升
11、沿: (clockevent and clock = 1) 时钟下降沿: (clockevent and clock = 0) 242、触发器的复位信号描述 1)同步复位:在只有以时钟为敏感信号的进程 中定义。 如: process (clock_signal) begin if (clock_edge_condition) then if (reset_condition) then signal_out = reset_value; else signal_out = signal_in ; end if ; end if ; end process ; 25 2)异步复位:进程的敏感信号
12、表中除时钟信 号外,还有复位信号。 如:process (reset_signal, clock_signal) begin if (reset_condition) then signal_out = reset_value; elsif (clock_edge_condition) then signal_out = signal_in ; end if ; end process ; 26clocksig_insig_out1sig_out2reset同步复位异步复位27二) 常用时序电路设计 1、触发器(Flip_Flop) 1)D触发器28异步置位/复位D触发器29同步复位D触发器3
13、0比较:异步置位的锁存器(Latch)31 library ieee; use ieee.std_logic_1164.all; entity t_ff is port(t, clk : in std_logic; q : buffer std_logic); end t_ff; architecture rtl of t_ff is begin process(clk) begin if clkevent and clk=1 then if t=1 then q=not q; else q=q; end if; end process; end rtl;TClkQ2)T触发器32 libra
14、ry ieee; use ieee.std_logic_1164.all; entity rs_ff is port(r, s, clk : in std_logic; q, qn : buffer std_logic); end rs_ff; architecture rtl of rs_ff is begin process(r, s, clk) begin if clkevent and clk=1 then if s = 1 and r = 0 then q=0; qn=1; elsif s=0 and r=1 then q=1; qn=0; elsif s=0 and r=0 then q=q; qn state = ERROR; 2、直接回到已设定的状态。如果系统对状态机的容错性要求不高,那么可以不对状态机出错进行处理,直接回到某一确定状态(如初始状态 S0)。