eda大作业.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
班级 021039
学号 ********
EDA报告
题目 VHDL设计初步
学院电子工程学院
专业信息对抗技术
学生姓名
导师姓名
目录
第一章实验部分(秒表) (2)
1、程序设计: (2)
2、程序代码 (2)
3、程序调试 (4)
第二章习题部分 (8)
习题一 (8)
习题二 (8)
习题三 (10)
习题四 (11)
习题五 (12)
习题六 (14)
习题七 (17)
第一章实验部分(秒表)
1、程序设计:
秒表显示共有6位,两位显示分,两位显示秒,十分秒和百分秒各一位。
设计时使用一个计数器,随着时钟上升沿的到来循环计数,每计数一次,百分秒位加一,通过百分秒位满十进位来控制十分位的计数,十分位满十进位,依次类推,实现秒表计数。
为实现秒位的计时精确,百秒位必须以0.01秒的时间间隔计数,即时钟的频率是100Hz。
为此,本设计采用3MHz的时钟频率通过分频得到100Hz的时钟频率,再送给控制时钟以得到比较精确的CLK信号。
其中,时钟信号CLK为3MHz 的时钟频率,分频后得到的时钟为CLK2,输出引脚CLK2和输入引脚CLK2在外部相连,实现将分频后的时钟送入。
2、程序代码
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY MIAOBIAO IS
PORT (CLK,CLK1,STA,POS,STO,RST: IN STD_LOGIC;
CQ1,CQ2,CQ3,CQ4,CQ5,CQ6 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
CLK2:OUT STD_LOGIC
);
END MIAOBIAO;
ARCHITECTURE BEHAV OF MIAOBIAO IS
BEGIN
PROCESS(CLK) --由频率为3MHz的时钟产生频率为100Hz的时钟VARIABLE NUM:INTEGER RANGE 0 TO 15000;--定义计数器
VARIABLE Q:STD_LOGIC;
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF NUM=15000 THEN NUM:=0;Q:=NOT Q;--计数器每计数15000,时钟改变电平--
值
ELSE NUM:=NUM+1;
END IF;
END IF;
CLK2<=Q;
END PROCESS;
PROCESS(CLK1,STA,POS,STO,RST)
VARIABLE CQI1:STD_LOGIC_VECTOR(3 DOWNTO 0);
VARIABLE CQI2:STD_LOGIC_VECTOR(3 DOWNTO 0);
VARIABLE CQI3:STD_LOGIC_VECTOR(3 DOWNTO 0);
VARIABLE CQI4:STD_LOGIC_VECTOR(3 DOWNTO 0);
VARIABLE CQI5:STD_LOGIC_VECTOR(3 DOWNTO 0);
VARIABLE CQI6:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF STO='1' THEN CQI1:=(OTHERS=>'0');CQI2:=(OTHERS=>'0');CQI3:=(OTHERS=>'0');
CQI4:=(OTHERS=>'0');CQI5:=(OTHERS=>'0');CQI6:=(OTHERS=>'0');
ELSIF CLK1'EVENT AND CLK1='1' THEN
IF STA='1' THEN
IF RST='0' THEN
IF POS='0' THEN
IF CQI1="1001" THEN CQI1:=(OTHERS => '0');--百分秒位满十进--位
IF CQI2="1001" THEN CQI2:=(OTHERS => '0'); --十分秒位满十进--位
IF CQI3="1001" THEN CQI3:=(OTHERS => '0'); --秒位满十进位
IF CQI4="0101" THEN CQI4:=(OTHERS => '0'); --十秒位满六进位
IF CQI5="1001" THEN CQI5:=(OTHERS => '0'); --分位满十进位
IF CQI6="0101" THEN CQI6:=(OTHERS => '0'); --十分位满六进位
ELSE CQI6:=CQI6+1;
END IF;
ELSE CQI5:=CQI5+1;
END IF;
ELSE CQI4:=CQI4+1;
END IF;
ELSE CQI3:=CQI3+1;
END IF;
ELSE CQI2:=CQI2+1;
END IF;
ELSE CQI1:=CQI1+1;
END IF;
END IF;
END IF;
END IF;
IF RST='1' THEN
CQI1:=(OTHERS => '0');CQI2:=(OTHERS => '0');
CQI3:=(OTHERS => '0');CQI4:=(OTHERS => '0');
CQI5:=(OTHERS => '0');CQI6:=(OTHERS => '0');
END IF;
CQ1<=CQI1;CQ2<=CQI2;CQ3<=CQI3;
CQ4<=CQI4;CQ5<=CQI5;CQ6<=CQI6;
END IF;
END PROCESS;
END BEHAV;
3、程序调试
(1)时钟给出后,实现开始功能:
(2)给时钟后,实现暂停功能:
(3)给时钟后,实现复位功能:
(4)给时钟后,实现停止功能:
(5)综合功能地实现:
第二章习题部分
习题一
(Ex-1)画出下例实体描述对应的原理图符号元件:
ENTITY buf3s IS -- 实体1:三态缓冲器 PORT (input : IN STD_LOGIC ; -- 输入端
enable : IN STD_LOGIC ; -- 使能端
output : OUT STD_LOGIC ) ; -- 输出端
END buf3x ;
ENTITY mux21 IS --实体2: 2选1多路选择器 PORT (in0, in1, sel : IN STD_LOGIC;
output : OUT STD_LOGIC);
END ENTITY mux21;
习题二
(Ex-2)图中所示的是4选1多路选择器,试分别用IF_THEN语句和CASE语句的表达方式写出此电路的VHDL程序。
选择控制的信号s1和s0为STD_LOGIC_VECTOR类型;
当s1='0',s0='0';s1='0',s0='1';s1='1',s0='0'和s1='1',s0='1'分别执行y<=a、y<=b、y<=c、y<=d。
VHDL程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity mux41a is
port(a,b,c,d:in std_logic; --4个数据输入端s0,s1:in std_logic; --2个信号控制输入端
y:out std_logic); --数据输出端口
end mux41a;
architecture behavior of mux41a is
signal abc : std_logic_vector(1 downto 0) ; --定义内部信号abc
begin
abc <= s1 & s0 ; --abc为s1和s0的位与process (abc)
begin
case abc is
when "00" => y<=a;
when "01" => y<=b;
when "10" => y<=c;
when "11" => y<=d;
when others=>y <=null ;
end case;
end process;
end architecture behavior ;
习题三
(Ex-3)图中所示的是双2选1多路选择器构成的电路MUXK,对于其中MUX21A,当s='0'和'1'时,分别有y<='a'和y<='b'。
试在一个结构体中用两个进程来表达此电路,每个进程中用CASE语句描述一个2选1多路选择器MUX21A。
library ieee;
use ieee.std_logic_1164.all;
entity EX4 is
port ( a1,a2,a3:in std_logic; --3个数据输入端口
temp:buffer std_logic; --定义一个中间信号
s1,s0:in std_logic; --2个数据控制端口
output:out std_logic); --电路输出端
end EX4;
architecture behav of EX4 is
begin
process(a2,a3,s0) --进程1(数选器1)
begin
case s0 is
when '0'=> temp<=a2;
when '1'=> temp<=a3;
end case;
end process;
process(a1,temp,s1) --进程2(数选器2)
begin
case s1 is
when '0'=> output<=a1;
when '1'=> output<=temp;
end case;
end process;
end behav;
习题四
(Ex-4)图中是一个含有上升沿触发的D触发器的时序电路,试写出此电路的VHDL设计文件。
library ieee;
use ieee.std_logic_1164.all;
entity EX5 is
port ( cl:in std_logic;
clk:in std_logic;
output:buffer std_logic);
end EX5;
architecture behav of EX5 is
begin
process (clk)
begin
if (clk'event and clk='1') then
output<=not(cl or output);
end if;
end process;
end behav;
习题五
(Ex-5)给出1位全减器的VHDL描述。
要求:
(1)首先设计1位半减器,然后用例化语句将它们连接起来,图中h_suber 是半减器,diff是输出差,s_out是借位输出,sub_in是借位输入。
(2)以1位全减器为基本硬件,构成串行借位的8位减法器,要求用例化语句来完成此项设计(减法运算是 x – y - sun_in = diffr)。
library ieee;
use ieee.std_logic_1164.all;
entity h_suber is --定义实体半减器
port(x,y:in std_logic; --减数与被减数
diff,s_out:out std_logic); --分别为本位输出和借位输出end h_suber;
architecture fd1 of h_suber is
begin
diff<=x xor y;
s_out<=(not x)and y;
end fd1;
library ieee;
use ieee.std_logic_1164.all;
entity or_2 is --定义实体2输入或门
port (a,b:in std_logic;
c:out std_logic);
end or_2;
architecture one of or_2 is
begin
c<=a or b;
end one;
library ieee;
use ieee.std_logic_1164.all;
entity f_suber is --定义实体全减器port(x0,y0,sub_in:in std_logic; --x0和y0为减数与被减数,sub_in
借位输入
sub_out,diffr:out std_logic); --differ_out为本位输出,sub_out
为借位输出
end f_suber;
architecture fs1 of f_suber is
component h_suber --半减器例化声明
port(x,y:in std_logic;
diff,s_out:out std_logic);
end component;
component or_2 --2输入或门例化声明port(a,b:in std_logic;
c:out std_logic);
end component;
signal d,e,f:std_logic; --定义敏感信号
begin
u1:h_suber port map(x=>x0,y=>y0,diff=>d,s_out=>e); --引用半减器u2:h_suber port map(x=>d,y=>sub_in,diff=>diffr,s_out=>f); --引用半减器u3:or_2 port map(a=>f,b=>e,c=>sub_out); --引用或门end fs1;
习题六
(Ex-6)根据下图,写出顶层文件MX3256.VHD的VHDL设计文件。
library ieee;
use ieee.std_logic_1164.all;
entity diff is --定义实体D触发器port(d,clk:in std_logic;
clear:in std_logic;
q:out std_logic);
end entity diff;
architecture behav of diff is
begin
process (clear,d,clk)
begin
if (clk'event and clk='1') then --时钟信号到来
if (clear='0') then q<='0'; --异步清零
else q<=d;
end if;
end if;
end process;
end behav;
library ieee;
use ieee.std_logic_1164.all;
entity jk is --定义实体JK触发器
port(a1,a2,clk: in std_logic;
o1,o2: buffer std_logic);
end;
architecture behav1 of jk is
signal o1_s,o2_s:std_logic; --定义内部信号o1_s,o2_s
begin
process(a1,a2,clk,o1_s,o2_s)
begin
if(clk'event and clk='1')then
if(a1='0')and(a2='1')then o1_ s<='0', o2_s<='1';
elsif (a1='1')and(a2='0')then o1_s<='1',o2_s<='0';
elsif(a1='1')and(a2='1')then o1_s<=not o1; o2_s<=not o2;
end if;
end if;
o1<=o1_s; o2<=o2_s;
end process
end behav1
library ieee;
use ieee.std_logic_1164.all;
entity mux21 is --定义实体mux21
port (a,b,s:in std_logic;
c:out std_logic);
end entity;
architecture behav2 of mux21 is
begin
process (a,b,s)
begin
if s='0' then c<=a;
else c<=b;
end if;
end process;
end behav2;
library ieee;
use ieee.std_logic_1164.all;
entity max3256 is --定义顶层文件实体max3256
port (ina,inb,inclk,inc:in std_logic; --4个输入,inclk为时钟信号
e,output:out std_logic);
end max3256;
architecture behav3 of max3256 is
component jk --JK触发器的例化声明
port(a1,a2,clk: in std_logic;
o1,o2: buffer std_logic);
end component;
component max3256 -- 文件max3256实体例化
port (a,b,s:in std_logic;
c:out std_logic);
end component;
component diff
port(d,clk:in std_logic;
clear:in std_logic;
q:out std_logic);
end component;
signal aa,bb,cc,dd:std_logic; --定义中间信号aa,bb,cc,dd
begin
u1: jk port map (a1=>ina,a2=>inb,clk=>inclk,o1=>aa,o2=>bb); --引用JK触发器
u2: diff port map (d=>bb,clk=>inclk,clear=>inc,q=>cc); --引用D 触发器
u3: jk port map (a1=>bb,a2=>cc,clk=>inclk,o1=>dd,o2=>output); --引用JK触发器
u4: mux21 port map (a=>dd,b=>aa,s=>bb,c=>e); --引用mux21
end behav3;
习题七
(Ex-7)设计含有异步清零和计数使能的16位二进制加减可控计数器。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cnt_16 is
port(rst: in std_logic; --复位控制端clk: in std_logic; --时钟输入
up: in std_logic; --加减控制端
load:in std_logic; --预置控制端
data:in std_logic_vector(15 downto 0); --16为预置输入
count:out std_logic_vector(15 downto 0)); --计数器的状态输出end cnt_16;
architecture arc of cnt_16 is
signal cnt:std_logic_vector(15 downto 0);
begin
process(clk,rst)
begin
if rst='0'then --异步清零
cnt<=(others=>'0');
elsif clk'event and clk='1' then
if load='1' then cnt<=data; --同步置数
elsif up='1' then cnt<=cnt+1; --加法计数
else cnt<=cnt-1; --减法计数
end if;
end if;
end process;
count<=cnt;
end arc;。