FPGA 学习小组
直播中

陈鹏

7年用户 211经验值
私信 关注

用wait until 用法和子程序的编辑与调用

1.--VHDL中,wait until clk='1' 可代clk'event and clk='1'做上升沿,
--wait until clk='0' 可代clk'event and clk='1'做下降沿。用法如下:
--74hc161功能芯片的VHDL程序:
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity d_ff is
Port(clk,cr,ld:in std_logic;
     d:in std_logic_vector(3 downto 0);
      q:out std_logic_vector(3 downto 0));
end;
architecture dd of d_ff is
signal s,ss:std_logic_vector(3 downto 0);
begin
   process
    begin  
  
    wait until clk='1';    --这句意思是等待到clk等于1时完成下面语句
       if ld='0' then s<=d;
          else s<=s+1 ;
        end if;
    if cr='0' then
      s<="0000";
    end if;
   end process
;
  q<=s;
end dd;
2--子程序也是很多编程语言中常用的程序模块,VHDL子程序用法如下:
   1)---------------子程序function的用法--------
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity full_adder is
Port(a,b,cin:in std_logic;
      sum,co:out std_logic);      
end;
architecture add of full_adder  is
Function sam1(x,y:std_logic)return std_logic is   --子程序1,sam1为程序名
    begin                           --x,y为子程序变量,冒号后面是变量类型
    return (x xor y);          --子程序返回值
   end sam1;  --结束子程序1
   function sam2(x,y:std_logic)return std_logic is    --子程序2
    begin
    return (x and y);
   end sam2;   --结束子程序1
signal s1,co1,s2,co2,ss:std_logic;
begin
   process(a,b,cin)
    begin   
      s1<=sam1(a,b);   --调用子程序1
      co1<=sam2(a,b); --调用子程序2
      s2<=sam1(s1,cin);
      co2<=sam2(s1,cin);   
    end process;  
    sum<=s2;
    co<=co1 or co2;  
end dd;
  2)---------------子程序Procedure的用法---------
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity d_ff is

Port(a,b,cin:in std_logic;
      sum,co:out std_logic);      
end;
architecture dd of d_ff is

---------------------------------------
Procedure sam(x,y:in std_logic;
                 z,w: out std_logic) is   --这个子程序用法变量必须设置方向
    begin
    z:=x xor y;  --赋值必须采用变量Veriable格式:=
    w:=x and y;
    end sam;
begin
   process(a,b,cin)
   variable s1,s2,co1,co2:std_logic;--运行过程中需要的话,必须使用局部变量,在Process后设置。
    begin
    sam(a,b,s1,co1);
    sam(cin,s1,s2,co2);
     sum<=s2;
    co<=co1 or co2;      
    end process;      
end dd;
3.程序块Block的编辑与使用
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ppp IS
PORT(a,b,c,D,clk: IN STD_LOGIC;
      y,s,co,Q: OUT STD_LOGIC);
END ppp;
ARCHITECTURE Behave OF ppp IS
signal tmp1,tmp2,tmp3,tmp4,s1,c1,s2,c2:STD_LOGIC;
BEGIN
g1:BLOCK
BEGIN
process(clk)
begin
tmp1 <= a and b;
tmp2<= a and (b or (not c));
tmp3<=c xor(not( a and b));
if clk'event and clk='1' then
y<=tmp3 or (tmp2 and tmp1);
end if;
end process;
END BLOCK g1;
g2:block
begin
    s1<= a xor b;
    c1<= a and b;
    s<=s1 xor c;
    c2<=s1 and c;
    co<=c1 or c2;
end block g2;
G3:block
   begin
    process(D,clk)
     begin
     if clk'event and clk='1' then
       Q<=D;
     end if;
     end process;
   end block g3;
END Behave;
4. for  i  in  0 to 7  loop 语句
------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity fulladder is
Port(D:in std_logic_vector(7 downto 0);
      clk:in std_logic;
      Q:out std_logic_vector(7 downto 0));
end;
architecture add of fulladder is
begin
process(D,clk)
begin
for i in 0 to 7 loop
    if clk'event and clk='1' then
    q(i)<=d(i);
    end if;
end loop;
end process;
end;
-------------------------------------------------------------------
5.quartusII11.0程序综合通过后要生成图像按下图操作

更多回帖

发帖
×
20
完善资料,
赚取积分