新浪博客

EDA作业-第三章

2013-05-18 11:14阅读:
3-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);

答:
EDA作业-第三章
EDA作业-第三章

3-3.图3-17所示的是双21多路选择器构成的电路MUXK,对于其中MUX 21A,当s='0''1'时,分别有y<='a'y<='b'。试在一个结构体中用两个进程来表达此电路,每个进程中用CASE语句描述一个21多路选择器MUX21A EDA作业-第三章

答:
CASE语句实现图示的是双21多路选择器构成的电路
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux31 IS
PORT(a1,a2,a3,s0,s1: IN STD_LOGIC;
outy:OUT STD_LOGIC);
END ENTITY mux31;
ARCHITECTURE case_mux31 OF mux31 IS
SIGNAL y : STD_LOGIC;
BEGIN
u1: PROCESS(s0,a1,a2,a3)
BEGIN
CASE s0 IS --类似于真值表的case语句
WHEN '0' => y <= a2;
WHEN '1' => y <= a3;
WHEN OTHERS =>NULL ;
END CASE;
END PROCESS;
u2: PROCESS(s1,a1,a2,a3,y)
BEGIN
CASE s1 IS --类似于真值表的case语句
WHEN '0' => outy <= a1;
WHEN '1' => outy <= y;
WHEN OTHERS =>NULL ;
END CASE;
END PROCESS;
END ARCHITECTURE case_mux31;
3-6 图3-18是一个含有上升沿触发的D触发器的时序电路(sxdl),试写出此电路的VHDL设计文件。
EDA作业-第三章
解:实现VHDL程序t4_19.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY t4_19 IS
PORT (CL,CLK0: IN STD_LOGIC;
OUT1: OUT STD_LOGIC);
END ENTITY t4_19;
ARCHITECTURE sxdl OF t4_19 IS ----时序电路sxdl
SIGNAL Q : STD_LOGIC;
BEGIN
PROCESS(CLK0)
BEGIN
IF CLK0'EVENT AND CLK0='1' THEN --检测时钟上升沿
Q <= NOT(Q OR CL);
END IF;
END PROCESS;
OUT1 <= NOT Q;
END ARCHITECTURE sxdl;
3-9 分频方法有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计数器即可办到。但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。
试对例3-20的设计稍作修改,将其进位输出COUT与异步加载控制LOAD连在一起,构成一个自动加载型16位二进制数计数器,也即一个16位可控的分频器,给出其VHDL表述,并说明工作原理。设输入频率fi=4MHz,输出频率fo=516.5±1Hz(允许误差±0.1Hz)16位加载数值是多少?
解:3-9 16位数控分频器(可进行奇偶数分频)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DVF16 IS
PORT(CLK : IN STD_LOGIC;
D : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
FOUT : OUT STD_LOGIC);
END ENTITY DVF16;
ARCHITECTURE one OF DVF16 IS
SIGNAL FULL : STD_LOGIC;
BEGIN
P_REG: PROCESS(CLK)
VARIABLE CNT8 : STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
IF CNT8 = '0000000000000000' THEN
CNT8 := D-1;--CNT8计数归0时,预置CNT8=D-1;
--计数范围(D=n)n-1~n/2取整(n=10:9\8\7\6\5计数,前后半周期相同)
FULL <= '1';--同时使溢出标志信号FULL输出为高电平
--(n=11:10\9\8\7\6\5计数,前比后半周期多一个时钟)
ELSIF CNT8 = ('0' & D(15 DOWNTO 1)) THEN
CNT8 :=('0' & D(15 DOWNTO 1))-1;--CNT8=n/2取整时,预置CNT8=D/2取整-1;
--计数范围(D=n)n/2取整~0(n=10:4\3\2\1\0计数)
FULL <= '1'; --同时使溢出标志信号FULL输出为高电平 (n=11:4\3\2\1\0计数)
ELSE CNT8 := CNT8 - 1; --否则继续作加1计数
FULL <= '0'; --且输出溢出标志信号FULL为低电平
END IF;
END IF;
END PROCESS P_REG ;
P_DIV: PROCESS(FULL)
VARIABLE CNT2 : STD_LOGIC;
BEGIN
IF FULL'EVENT AND FULL = '1' THEN
CNT2 := NOT CNT2;--如果溢出标志信号FULL为高电平,D触发器输出取反
IF CNT2 = '1' THEN FOUT <= '1';
ELSE FOUT <= '0';
END IF;
END IF;
END PROCESS P_DIV;
END ARCHITECTURE one;
3-11给出含有异步清零和计数使能的16位二进制加减可控计数器的VHDL描述。
解:用VHDL实现含有异步清零和计数使能的16位二进制加减可控计数器。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADD_SUB_LOAD_16 IS
PORT (CLK,RST,ADD_EN,SUB_EN,LOAD : IN STD_LOGIC;
DATA : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
CQ : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
COUT : OUT STD_LOGIC);
END ENTITY ADD_SUB_LOAD_16;
ARCHITECTURE A_S_16 OF ADD_SUB_LOAD_16 IS
BEGIN
PROCESS(CLK,RST,ADD_EN,SUB_EN,LOAD)
VARIABLE CQI: STD_LOGIC_VECTOR(15 DOWNTO 0);
--VARIABLE LS_LOAD : STD_LOGIC;
BEGIN
--LS_LOAD:=LOAD;
IF RST = '1' THEN CQI:=(OTHERS => '0');--计数器异步复位
ELSIF LOAD = '1' THEN CQI:=DATA; --LS_LOAD:='0'; --计数器异步复位
ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF ADD_EN='1'THEN --检测是否允许计数(同步他能)
IF CQI<16#FFFF# THEN CQI:=CQI+1; --允许计数,检测是否小于65535
ELSE CQI:=(OTHERS => '0'); --大于65535,计数值清零
END IF;
IF CQI=16#FFFF# THEN COUT<='1'; --计数大于9,输出进位信号
ELSE COUT <= '0';
END IF;
END IF;
IF SUB_EN='1'THEN --检测是否允许计数(同步他能)
IF CQI>0 THEN CQI:=CQI-1; --允许计数,检测是否小于65535
ELSE CQI:=(OTHERS => '1'); --大于65535,计数值清零
END IF;
IF CQI=0 THEN COUT<='1'; --计数大于9,输出进位信号
ELSE COUT <= '0';
END IF;
END IF;
END IF;
CQ<=CQI; --将计数值向端口输出
END PROCESS;
END ARCHITECTURE A_S_16;
补充:1、说明同步、异步激励端口的设计方法如下:
工程中需要加入可置数的减法计数器,并且输出使能信号来控制计数时钟的输入.
第一种方案:采用异步设计
process(wr_adr(4),r1_reg,xclk) --
一个地址译码信号,一个寄存器信号以及一个时钟信号
begin
if wr_adr(4)='0' then
r1_reg<=dbus;
en<=not(r1_reg(0) or r1_reg(1) or r1_reg(2) or r1_reg(3) or r1_reg(4) or r1_reg(5) or r1_reg(6));
elsif r1_reg(6 downto 0)>'0000000' then
if falling_edge(xclk) then
r1_reg(6 downto 0)<=r1_reg(6 downto 0)-1;
en<='0';
end if;
else
en<='1';
end if;
end process;
采用上面的方案在开始时可以达到预期的结果,但是很不稳定,多次综合后结果都不相同,易受干扰,经过思考
以后得出下面的同步方案
第二种方案:同步设计
process(wr_adr(4),r1_reg,xclk)
begin
if wr_adr(4)='0' then
r1_reg<=dbus;
en<=not(r1_reg(0) or r1_reg(1) or r1_reg(2) or r1_reg(3) or r1_reg(4) or r1_reg(5) or r1_reg(6));
elsif falling_edge(xclk) then
if r1_reg(6 downto 0)>'0000001' then
r1_reg(6 downto 0)<=r1_reg(6 downto 0)-1;
en<='0';
else
en<='1';
end if;
end if;
end process;
可以注意到寄存器比较数值发生了变化,异步时与0比较而同步时与1比较,经过测试输出的结果相同,而后者
明显更稳定.

2.对语法现象分类总结
EDA作业-第三章
EDA作业-第三章
EDA作业-第三章
EDA作业-第三章
EDA作业-第三章
EDA作业-第三章

我的更多文章

下载客户端阅读体验更佳

APP专享