目 录
1 引言... 1
2 简易数字频率计设计原理... 2
2.1基本原理... 2
2.2原理框图... 2
3 各模块程序及仿真... 4
3.1测频控制发生器ctr模块的设计... 4
3.2待测信号计数器counter模块的设计... 5
3.3锁存器regist模块的设计... 8
3.4顶层模块的设计... 12
3.5 引脚锁定... 14
4 心得体会... 16
参考文献... 17
附 录... 18
1 引言
EDA技术是以硬件语言为主要的描述方式,以EDA软件为主要的设计软件,以大规模课编程逻辑器件为载体的数字电路的设计过程。其设计的灵活性使得EDA技术得以快速发展和广泛应用。本设计以QuartusⅡ软件为设计平台,采用VHDL语言现数字频率计的整体设计。电子设计自动化(EDA)逐渐成为重要的设计手段,已经广泛应用于模拟与数字电路系统等许多领域,电子设计自动化是一种实现电子系统或电子产品自动化设计的技术,它与电子技术,微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,促进了工程发展。EDA的一个重要特征就是使用硬件描述语言(HDL)来完成的设计文件,VHDL语言是经IEEE确认的标准硬件语言,在电子设计领域受到了广泛的接受。EDA技术就是以计算机为工具,设计者在EDA软件平台上,有硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作,最终形成集成电子系统或专业集成芯片的一门新技术。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因此频率计常受到人们的青睐。众所周知,频率信号易于传输,抗干扰性强,可以获得较好的测量精度。因此,频率检测是电子测量领域最基本的测量之一。
本设计基于我们对《EDA技术》、《数字电子技术》的基础知识的理解,用VHDL硬件描述语言进行模块电路的设计,用元件例化语句写出频率计的顶层文件,要求我们设计一个四位十进制的简易数字频率计,对1HZ-10MHZ的方波信号进行测量,测量的方波频率值要在4位数码管上进行显示,根据不同的待测方波信号,频率计分为4个量程进行测量,四个量程分别为乘1,乘10,乘100,乘1000量程,要有一个整体复位控制,并且当量程选择不恰当或者超出10MHZ时要有错误报告。附录中是用多进程实现的简易频率计设计,实现了本设计要求的所有功能。
2 简易数字频率计设计原理
2.1基本原理
数字频率计的主要功能是测量周期信号的频率。频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。
频率是单位时间(1秒)内方波信号发生周期变化的次数。在给定的1秒时间内对方波信号波形计数,并将所计数值显示出来,就能读取被测信号的频率。数字频率计首先必须获得相对稳定与准确的时间,然后通过计数器计算这一段时间间隔内的方波脉冲个数并显示出来。这就是数字频率计的基本原理。
脉冲信号的频率就是在单位时间内所产生的脉冲个数,其表达式为f=N/T,其中f为被测信号的频率,N为计数器所累计的脉冲个数,T为产生N个脉冲所需的时间。本设计要求基准时钟的频率为6MHZ,所以需要分频设计产生脉宽为1秒的脉冲。再利用这个脉宽为1秒的脉冲计数,计数器所记录的结果,就是被测信号的频率。因为待测方波信号的频率在1HZ-10MHZ,所以仅用四位7段数码管无法完全正确显示,所以需要选择恰当的量程来显示待测风波信号的频率,当量程选择不当或者频率超出10MHZ时,用一个LED灯点亮来警告我们这样测量有错误。
2.2原理框图
本设计要求用基准时钟信号(f=6MHZ)的控制完成对1HZ-10MHZ的方波信号进行测量,使得所测量的方波频率值在4位7段数码管上进行显示,并根据不同的待测方波信号,将频率计分为4个量程进行测量,四个量程分别为乘1,乘10,乘100,乘1000量程,量程的选择分为手动和自动两种。当手动选择量程时,自动量程显示为零,手动量程部分依手动所选量程而定;当手动选择信号不工作时,频率计自动选择比较合适的量程进行显示,手动量程部分显示为零。而且此频率计具有记忆功能,在测量过程中不刷新数据,等数据测量过程结束后才显示测量值,显示测量的频率值,并保存到下一次测量结束。数字频率计还有一个整体的异步清零端,随时可以进行清零操作。此外,数字频率计还有一个不能正确显示待测方波信号频率时的警告灯。
数字频率计通过测频控制发生器将基准信号转换成所需要的控制信号clk1和en,待测信号计数器在en的控制下对待测信号进行测量并通过锁存器在clk1的控制下按要求进行显示,数字频率计包括测频控制发生器ctr、待测信号计数器counter、锁存器regist三个功能模块,其原理框图如图1所示。
其中a是手动选择量程输入端,sd代表手动量程的显示,rst是整体异步清零输入端,clk是频率为6MHZ的基准时钟,clkin是待测的方波信号,b是显示是否超出了频率计的测量范围,zd是在手动选择量程不工作时频率计进行的自动选择合适的量程显示,q1—q4是四位数值从高位到低位的显示结果。
3 各模块程序及仿真
此设计运用元件例化的方法进行功能的实现,所以各个模块即使相互独立又是彼此联系的,三个模块共同完成方波信号的测量。
3.1测频控制发生器ctr模块的设计
本设计要求为该模块ctr提供的基准信号频率为6MHZ,所以要做一个12M分频器控制产生一个脉宽为1秒的周期信号en和一个锁存信号clk1。rst为高电平时进行整体异步清零。当en处于高电平的时候对输入的待测方波信号进行计数测量,当en处于低电平的时候停止计数,并保持所计数值。当clk1是上升沿的时候将所保持的数值输出显示。
此测频控制发生器的程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity ctr is
port(clk,rst: in std_logic;
clk1,en: buffer std_logic);
end ctr;
architecture bhv of ctr is
begin
process(clk,rst)
variable c:integer range 0 to 12000000;
begin
if rst='1' then
en<='0';
elsif clk'event and clk='1' then
c:=c+1;
if c=6000000 then
c:=0;
en<=not en;
end if;
end if;
clk1<=not(clk or en);
end process;
end bhv;
此测频控制发生器的仿真结果如图2所示。
此模块如果仿真12M分频器很困难,为了看到仿真效果,改成20倍分频器,得到了此仿真结果。如果按程序下载,在硬件上能很清楚的看到由6MHZ的基准信号得到了脉宽为1秒的控制信号en和控制输出信号clk1,rst实现了整体异步清零的功能。
3.2待测信号计数器counter模块的设计
该模块通过ctr模块所产生的脉宽为1秒的en信号来对待测信号进行计数。用28位二进制数d进行对待测信号的计数,同时用sel表示自动量程根据所得数值d变化,sel为“0001”时代表乘1,sel为“0010”时代表乘10,sel为“0100”时代表乘100,sel为“1000”时代表乘1000。如果测量选择量程太小或者待测方波信号频率超出10MHZ,均无法正确显示测量结果,则将b置高电平进行警告。
此待测信号计数器的程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity counter is
port(en,clkin,rst:in std_logic;
a:in std_logic_vector(3 downto 0);
sel:out std_logic_vector(3 downto 0);
d :out std_logic_vector(27 downto 0);
b:out std_logic);
end counter;
architecture bhv of counter is
signal dd: std_logic_vector(27 downto 0);
begin
process(rst,en,clkin)
begin
if rst='1' then
dd<=(others=>'0');
b<='0';
elsif en='1' then
if clkin'event and clkin='1' then
if dd(27 downto 0)="1001100110011001100110011001" then
dd<=(others=>'0'); b<='1';
elsif dd(23 downto 0)="100110011001100110011001" then
dd<=dd+"011001100110011001100111";
elsif dd(19 downto 0)="10011001100110011001" then
dd<=dd+"01100110011001100111";
elsif dd(15 downto 0)="1001100110011001" then
dd<=dd+"0110011001100111";
elsif dd(11 downto 0)="100110011001" then
dd<=dd+"011001100111";
elsif dd(7 downto 0)="10011001" then
dd<=dd+"01100111";
elsif dd(3 downto 0)="1001" then
dd<=dd+"0111";
else
dd<=dd+'1';
end if;
end if;
if dd(27 downto 24)>"0000" then
sel<="1000";
elsif dd(23 downto 20)>"0000" then
sel<="0100";
elsif dd(19 downto 16)>"0000" then
sel<="0010";
else
sel<="0001";
end if;
else
dd<=(others=>'0');
end if;
if dd(27 downto 24)>"0000" then
if a="1000" then
b<='0';
elsif a="0000" then
b<='0';
else
b<='1';
end if;
elsif dd(23 downto 20)>"0000" then
if a="1000" then
b<='0';
elsif a="0100" then
b<='0';
elsif a="0000" then
b<='0';
else
b<='1';
end if;
elsif dd(19 downto 16)>"0000" then
if a="1000" then
b<='0';
elsif a="0100" then
b<='0';
elsif a="0010" then
b<='0';
elsif a="0000" then
b<='0';
else
b<='1';
end if;
else
b<='0';
end if;
end process;
process(en)
begin
if en'event and en='0' then
d<=dd;
end if;
end process;
end bhv;
此待测信号计数器的仿真结果如图3所示。
该模块实现了在en为高电平时对输入的待测信号clkin进行测量,当en为低电平时停止测量并将所计数值输出,即在1秒内待测信号的脉冲数,也就是待测信号的频率值。sel为根据所计数值自动合理选择的量程,此时sel为“0001”,代表乘1HZ的量程,即所测方波信号的频率在9999HZ之内。
3.3锁存器regist模块的设计
该模块用于实现记忆显示,在测量过程中不刷新新的数据,直到测量过程结束后,锁存显示测量结果,并且保存到下一次测量结束。其功能是对四位BCD码进行锁存并且转换成为对应的4组七段码,用于驱动数码管。其中rst为高电平时对锁存器进行异步清零。rst为低电平时正常工作。输入信号a对锁存器进行控制即手动选择量程,当a为“0001”时,代表选择乘1档,自动量程显示为零,手动量程显示乘1HZ,只输出计数所得值d的低四位并显示在四个十进制数码管上;当a为“0010”时,代表选择乘10档,自动量程显示为零,手动量程显示乘10HZ,只输出计数所得值d的次低四位并显示在四个十进制数码管上;当a为“0100”时,代表选择乘100档,自动量程部分清零,手动量程显示乘100HZ,只输出计数所得值d的次高四位并显示在四个十进制数码管上;当a为“1000”时,代表选择乘1000档,自动量程部分清零,手动量程显示乘1000HZ,只输出计数所得值d的高四位并显示在四个十进制数码管上。当a为“0000”时,代表不进行手动选择,则手动量程显示为零,自动量程部分根据所计数值进行合理选择。sel为“0001”代表所测得的频率值在0—9999HZ之内,则自动量程显示乘1HZ,输出所测数值的有效部分并显示在四个十进制数码管上;sel为“0010”代表所测得的频率值在10000—99999HZ之内,则自动量程显示乘10HZ,输出所测数值的有效部分的高四位并显示在四个十进制数码管上;sel为“0100”代表所测得的频率值在100000—999999HZ之内,则自动量程显示乘100HZ,输出所测数值的有效部分的高四位并显示在四个十进制数码管上;sel为“1000”代表所测得的频率值在1000000—9999999HZ之内,则自动量程显示乘1000HZ,输出所测数值的有效部分的高四位并显示在四个十进制数码管上。
此锁存与译码器的程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity regist is
port(clk1,rst:in std_logic;
d:in std_logic_vector(27 downto 0);
sel,a:in std_logic_vector(3 downto 0);
zd,sd:out std_logic_vector(3 downto 0);
q1,q2,q3,q4:out std_logic_vector(3 downto 0));
end regist;
architecture bhv of regist is
begin
process(rst,clk1)
begin
if rst='1' then
q1<=(others=>'0');
q2<="0000";
q3<="0000";
q4<="0000";
zd<="0000";
elsif(clk1'event and clk1='1') then
if(a="0000") then
if sel="1000" then
q1<=d(27 downto 24);
q2<=d(23 downto 20);
q3<=d(19 downto 16);
q4<=d(15 downto 12);
zd<="1000";
sd<="0000";
elsif sel="0100" then
q1<=d(23 downto 20);
q2<=d(19 downto 16);
q3<=d(15 downto 12);
q4<=d(11 downto 8);
zd<="0100";
sd<="0000";
elsif sel="0010" then
q1<=d(19 downto 16);
q2<=d(15 downto 12);
q3<=d(11 downto 8);
q4<=d(7 downto 4);
zd<="0010";
sd<="0000";
elsif sel="0001" then
q1<=d(15 downto 12);
q2<=d(11 downto 8);
q3<=d(7 downto 4);
q4<=d(3 downto 0);
zd<="0001";
sd<="0000";
end if;
elsif(a="0001") then
q1<=d(15 downto 12);
q2<=d(11 downto 8);
q3<=d(7 downto 4);
q4<=d(3 downto 0);
zd<="0000";
sd<="0001";
elsif(a="0010") then
q1<=d(19 downto 16);
q2<=d(15 downto 12);
q3<=d(11 downto 8);
q4<=d(7 downto 4);
zd<="0000";
sd<="0010";
elsif(a="0100") then
q1<=d(23 downto 20);
q2<=d(19 downto 16);
q3<=d(15 downto 12);
q4<=d(11 downto 8);
zd<="0000";
sd<="0100";
elsif(a="1000") then
q1<=d(27 downto 24);
q2<=d(23 downto 20);
q3<=d(19 downto 16);
q4<=d(15 downto 12);
zd<="0000";
sd<="1000";
end if;
end if;
end process;
end bhv;
此锁存与译码器的仿真结果如图4所示。
该模块的仿真为了将各个功能都清晰的显示出来将sel进行了提前设置,并不是根据所测频率值进行的自动选择。Sel是输入信号,前提我们已经知道sel和a不能同时工作,所以为了使用a,将sel人为的提前设成“0000”了,不过如此提前将sel的值进行设定并不影响整体的功能。此仿真图中a为“0001”代表乘1量程,只显示所计数值d的低四位,即十六进制的“0” “3” “6” “8”“9”,此时手动量程sd显示为“0001”,自动量程zd显示“0000”代表不工作。
3.4顶层模块的设计
该模块用元件调用(元件例化语句)实现本设计要求的整体功能。顶层文件的作用是将三个底层文件联系到一起,共同实现该简易数字频率计数器的功能。此处定义了en0,d0,sel0,clko等四个信号进行底层文件之间以及底层与顶层之间的连接。
此模块的程序如下所示:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity pin is
port(rst,clk,clkin:in std_logic;
q1,q2,q3,q4:out std_logic_vector(3 downto 0);
sd,zd:out std_logic_vector(3 downto 0);
a:in std_logic_vector(3 downto 0);
b:out std_logic);
end pin;
architecture bhv of pin is
component ctr
port(clk,rst : in std_logic;
clk1,en : buffer std_logic);
end component;
component counter
port(en,clkin,rst :in std_logic;
a:in std_logic_vector(3 downto 0);
sel :out std_logic_vector(3 downto 0);
d :out std_logic_vector(27 downto 0);
b :out std_logic);
end component;
component regist
port(clk1,rst:in std_logic;
d:in std_logic_vector(27 downto 0);
sel,a:in std_logic_vector(3 downto 0);
zd,sd:out std_logic_vector(3 downto 0);
q1,q2,q3,q4:out std_logic_vector(3 downto 0));
end component;
signal clk0: std_logic;
signal en0: std_logic;
signal d0: std_logic_vector(27 downto 0);
signal sel0: std_logic_vector(3 downto 0);
begin
U1:ctr port map(clk,rst,clk0,en0);
U2:counter port map(en0,clkin,rst,a,sel0,d0,b);
U3:regist port map(clk0,rst,d0,sel0,a,zd,sd,q1,q2,q3,q4);
end bhv;
此模块的仿真结果如图6所示:
由于顶层模块调用ctr模块,所以仿真时遇到类似的问题,我们改用12倍分频器来仿真,则在6个基准信号周期时间内对待测信号计数,所以得到的数值除以6就是待测信号与基准信号的频率倍数关系。所以整体功能仿真结果显示,基准信号周期为200ns,即频率为5MHZ,所以此待测信号的频率为50MHZ。当a为“0001”时,代表选择乘1HZ的量程,即显示低四位,此时,手动量程显示为“0001”表示乘1HZ量程,自动量程显示为“0000”表示不工作。当a为“0010”时,代表选择乘10HZ的量程,即显示次低四位,此时,手动量程显示为“0010”表示乘10HZ量程,自动量程显示为“0000”表示不工作。当rst为高电平时,输出均为0,则进行了整体异步清零。
3.5 引脚锁定
硬件下载前,进行引脚锁定,各引脚锁定情况如图6所示。
引脚锁定完成后,再次对设计文件进行编译。重新编译完成后,执行QuartusII主窗口“Processing”菜单下“Start Programming”,将配置文件下载到ACEX1K系统的目标芯片EP1K30144-3上,下载适配后,将clk0的6MHZ频率用短路帽短路,再将clk5的各个频率段不同时用短路帽进行短路并观察数码管上的显示数字,检查是否正确,同时还可以按动键1到键4进行手动选择量程,查看各个部分是否能够完成其功能。可以按键8进行异步清零。最右边四个数码管从左向右是从高位到低位的显示的频率。最左边数码管显示手动选择的量程数值,左边第二个是自动默认选择的量程数值。硬件电路简捷,体积小,所有电路都在一块芯片里,因此性能稳定。
4 心得体会
作为通信专业的学生,第一次真正体会到自己要完成一个大型的程序还真不是件容易的事。通过这学期学的《EDA技术》,再加上这几天边查资料边请教老师,终于理清了头绪,完成了此次课程设计。刚开始拿到本次程序设计题的时候确实有点儿兴奋,心想着尽量要独立快速而又高质量的完成这次课程设计。但是大概思路有了,觉得特别复杂,我害怕了,一阵慌乱后,终于定下心来了终于找到了一个比较类似的VHDL程序的简易数字频率计设计。这也使得我今天的程序颇有类同的感觉。看了几遍课题设计要求和书上给的源程序后对如何写这一方面的程序有了一定的了解,于是就尝试着自己开始作起了这个系统的总体框图。平时觉得老师讲课时都特别简单清楚,但是现在自己拿到一个设计要求时,乱阵脚了,但是经过努力,先把封装图画了出来,最终把原理框图画出来了。时间过得真快,马上到周四了,要进实验室做仿真和下载的时候了,刚开始在实验室有点着急,但是老师的新要求提出时,我冷静了,修改程序,做调试,在最后终于成功的完成了符合设计要求的程序,下载后仍有点小问题需要修改。但是毕竟得到了老师的肯定,我的信心更足了。下午又重新整理了自己的思路,功夫不负有心人,终于把问题都解决了。
通过这次EDA课程设计,我对课堂上所学到的理论知识的理解加深了许多, 自己动脑、动手设计的能力也得到了较大提高。在这次课程设计的过程中,我对 VHDL 语言有了更深的认识。通过查阅相关资料和动手设计我发现我以前对 VHDL 语言的认识太过肤浅,认为 VHDL 语言只能用于设计小型的电路系统。但有了更深刻的认识之后我发现学好 VHDL 语言可以设计出大规模的、功能复杂的电路系统。我发现了动手实践的重要性。动手实践是理论知识得以灵活运用的必要前提,也是今后走上工作岗位之后能够很好的完成设计工作的技术保证。只有遇到实际问题并根据自己对课堂上获得的专业知识的理解来解决才能真正的提高自己的能力。这也提醒我在平时的学习生活中不能一味埋头于课本知识,当今社会竞争越来越激烈,社会对人才的要求越来越全面,只有理论知识是远远不够的,必须靠实践作支撑。虽然课设完成了,但是我意识到,我对FPGA 技术仅仅只是停留在入门的阶段,想要有更大的发展,更深入的研究,还需要更多的努力与实践。因此在学习之余我们应该积极参加各种与专业知识有关的实践活动和知识竞赛,巩固所学的理论知识,多注重培养实际动手能力和专业技术能力,这样才能在以后的工作岗位上有所作为。
参考文献
[1] Voknei A.Pedroni.《VHDL数字电路设计教程》.电子工业出版社,2008.5
[2] 潘松,黄继业.《EDA技术实用教程》(第二版).科学出版社,2005.2
[3] 焦素敏.《EDA应用技术》.清华大学出版社,2002.4
附 录
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity gaoli is
port(rst,clk,clkin:in std_logic;
a:in std_logic_vector(3 downto 0);
q1,q2,q3,q4:out std_logic_vector(3 downto 0);
sd:out std_logic_vector(3 downto 0);
zd:out std_logic_vector(3 downto 0);
b:out std_logic);
end gaoli;
architecture bhv of gaoli is
signal clk1:std_logic;
signal en:std_logic;
signal bb:std_logic;
signal dd:std_logic_vector(27 downto 0);
signal d:std_logic_vector(27 downto 0);
signal sel:std_logic_vector(3 downto 0);
begin
process(clk,rst)
variable c:integer range 0 to 6000000;
begin
if rst='1' then
clk1<='0';en<='0';
elsif clk'event and clk='1' then
c:=c+1;
if c=6000000 then
c:=0;
en<=not en;
end if;
end if;
clk1<= not ( clk or en);
end process;
process(rst,en,clkin)
begin
if rst='1' then
dd<=(others=>'0');
bb<='0';
elsif en='1' then
if clkin'event and clkin='1' then
if dd(27 downto 0)="1001100110011001100110011001" then
dd<=(others=>'0'); bb<='1';
elsif dd(23 downto 0)="100110011001100110011001" then
dd<=dd+"011001100110011001100111";
elsif dd(19 downto 0)="10011001100110011001" then
dd<=dd+"01100110011001100111";
elsif dd(15 downto 0)="1001100110011001" then
dd<=dd+"0110011001100111";
elsif dd(11 downto 0)="100110011001" then
dd<=dd+"011001100111";
elsif dd(7 downto 0)="10011001" then
dd<=dd+"01100111";
elsif dd(3 downto 0)="1001" then
dd<=dd+"0111";
else dd<=dd+'1';
end if;
end if;
if dd(27 downto 24)>"0000" then
sel<="1000";
elsif dd(23 downto 20)>"0000" then
sel<="0100";
elsif dd(19 downto 16)>"0000" then
sel<="0010";
else sel<="0001";
end if;
else dd<=(others=>'0');bb<='0';
end if;
if dd(27 downto 24)>"0000" then
if a="1000" then
bb<='0';
elsif a="0000" then
bb<='0';
else
bb<='1';
end if;
elsif dd(23 downto 20)>"0000" then
if a="1000" then
bb<='0';
elsif a="0100" then
bb<='0';
elsif a="0000" then
bb<='0';
else
bb<='1';
end if;
elsif dd(19 downto 16)>"0000" then
if a="1000" then
bb<='0';
elsif a="0100" then
bb<='0';
elsif a="0010" then
bb<='0';
elsif a="0000" then
bb<='0';
else
bb<='1';
end if;
else
bb<='0';
end if;
end process;
process(en)
begin
if en'event and en='0' then
d<=dd;
b<=bb;
end if;
end process;
process(rst,clk1)
begin
if rst='1' then
q1<=(others=>'0');
q2<="0000";
q3<="0000";
q4<="0000";
zd<="0000";
elsif clk1'event and clk1='1' then
if a="0000" then
if sel="1000" then
q1<=d(27 downto 24);
q2<=d(23 downto 20);
q3<=d(19 downto 16);
q4<=d(15 downto 12);
zd<="1000";
sd<="0000";
elsif sel="0100" then
q1<=d(23 downto 20);
q2<=d(19 downto 16);
q3<=d(15 downto 12);
q4<=d(11 downto 8);
zd<="0100";
sd<="0000";
elsif sel="0010" then
q1<=d(19 downto 16);
q2<=d(15 downto 12);
q3<=d(11 downto 8);
q4<=d(7 downto 4);
zd<="0010";
sd<="0000";
elsif sel="0001" then
q1<=d(15 downto 12);
q2<=d(11 downto 8);
q3<=d(7 downto 4);
q4<=d(3 downto 0);
zd<="0001";
sd<="0000";
end if;
elsif a="0001" then
q1<=d(15 downto 12);
q2<=d(11 downto 8);
q3<=d(7 downto 4);
q4<=d(3 downto 0);
zd<="0000";
sd<="0001";
elsif a="0010" then
q1<=d(19 downto 16);
q2<=d(15 downto 12);
q3<=d(11 downto 8);
q4<=d(7 downto 4);
zd<="0000";
sd<="0010";
elsif a="0100" then
q1<=d(23 downto 20);
q2<=d(19 downto 16);
q3<=d(15 downto 12);
q4<=d(11 downto 8);
zd<="0000";
sd<="0100";
elsif a="1000" then
q1<=d(27 downto 24);
q2<=d(23 downto 20);
q3<=d(19 downto 16);
q4<=d(15 downto 12);
zd<="0000";
sd<="1000";
end if;
end if;
end process;
end bhv;