太原科技大学
电子课程设计
——高速数字相关器的设计
课 程 名 称 EDA课程设计 院 部 名 称 电子信息工程学院 班 级 电子081501 学 生 姓 名 张 雅 瑶 学 号 [1**********]7 设 计 时 间 2010.12.20—2010.12.27
指 导 教 师 高 文 华
高速数字相关器的设计
一、设计任务与要求
1. 设计任务
设计一个在数字通信系统中常见的数字相关器,对其进行仿真和硬件测试。 2. 设计内容
(1)设计一个并行四位数字相关器,对其进行仿真和硬件测试。
(2)利用设计出的四位数字相关器设计并行16位数字相关器,对其进行仿真和硬件测试。
二、总体框图
1. 并行四位数字相关器 (1)数字相关器原理
数字相关器在通信信号处理中实质是起到数字匹配滤波器的作用,它可对特定码序列进行相关处理,从而完成信号的解码,恢复出传送的信息。其实现方法是进行两个数字信号之间的相关运算,即比较等长度的两个数字序列之间有多少位相同,多少位不同。故基本的相关器是异或门,例如,y=a⊕b,当 a=b时,y=0,表示两位数据相同;当 a≠b时,y=1,表示两位数据不同。多位数字相关器可以由一位相关器级连构成。 N位数字相关器的运算通常可以分解为以下两个步骤:对应位进行异或运算,得到 N个 1位相关运算结果;统计 N位相关运算结果中 0或 1的数目,得到 N位数字中相同位和不同位的数目。
当数字相关器接收到一组数据时,在时钟的上升沿对帧同步字进行检测。对于帧同步字是一个连续4位的码元,数字相关器在进行检测的过程中,只有当连续检测到4位的码元与预先设定的帧同步字完全相同时,才由输出端输出信号表示帧同步。否则,任何一位出现不相等,数字相关器又将重新开始进行检测,直到出现连续的4位码元与预先设定的4位码元完全相等时才进行输出。数字相关器的设计一般考虑采用串行输入或并行输入两种输入检测方式,由于串行输入是
在4个时钟周期内依次对两路串行输入信号 A、B 进行异或运算,并统计数据位相同个数,检测速度较慢,要提高检测速度,就要考虑采用并行输入检测方式。
(2)并行四位数字相关器框图
2. 并行16位数字相关器
(1)16位高速数字相关器的FPGA 实现
在 16位并行数字相关器中,由于实现 16位并行相关器需要的乘积项、或门过多,因此为降低耗用资源,可以分解为 4个 4位相关器,然后用两级加法器相加得到全部 16位的相关结果,其结构图如图所示,如果直接实现该电路,整个运算至少要经过三级门延时。随着相关数目的增加,速度还将进一步降低。为提高速度,采用“流水线技术”进行设计,模块中对每一步运算结果都进行锁存,按照时钟节拍逐级完成运算的全过程。虽然每组输入值需要经过三个节拍后才能得到运算结果,但是,每个节拍都有一组新值输入到第一级运算电路,每级运算电路上都有一组数据同时进行运算,所以总的来讲,每步运算花费的时间只有一个时钟周期,从而使系统工作速度基本等于时钟工作频率。
(2)并行16位数字相关器框图
如框图所示,将要检测的两个16位数字序列按对应位分成四个一组,得到四组,然后将其对应的四组分别输入四个四位数字相关器,相关器的结果再经过相加,就得到两个16位数字序列对应位相同的位的个数。
4位相关器: 比较等长度的两个数字序列之间对应位有多少位相同,多少位不同。
3位相加:用输入三位、输出四位的全加器实现。 4位相加:用输入四位、输出五位的全加器实现。
三、功能模块
1. 四位数字相关器 (1)程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY xiangguan4 IS
PORT(a,b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); c:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); clk:IN STD_LOGIC);
END ENTITY;
ARCHITECTURE one OF xiangguan4 IS
SIGNAL stemp:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
stemp
IF clk'EVENT AND clk='1' THEN CASE stemp IS
WHEN "0000"=>C
WHEN "0001"|"0010"|"0100"|"1000"=>C
WHEN "0011"|"0101"|"1001"|"0110"|"1010"|"1100"=>CCCC
(2)生成模块
xiangguan4
a[3..0]b[3..0]clk inst
c[2..0]
(3)逻辑功能
四位数列a 和b 输入后,每来一个时钟上升沿,四位数字相关器则对两个数的对应位进行相关比较,用二进制数输出对应位数相同的位的个数。改变数列a 和b 则可以得到任意两个四位数列的相关位数。
(4)仿真图
a 和b 均为四位二进制数,a 保持0110不变,b 从0000开始递增,c 是以十进制进行结果输出。上升沿来临之前,a 和b 不进行比较,c 输出0。之后每来一个上升沿,a 和b 相关比较一次,c 输出两列数对应位相同的位的个数。第一个上升沿来临时,b 为0000,与a 的0110有两位对应相同,故c 输出2;第二个上升沿来临时,b 位0001,与a 的0110有一位对应相同,故c 输出1;依此类推。所以四位数字相关器设计正确。
(5)硬件验证
在EDA 实验箱上,将四位数字相关器的程序下载到芯片上,用拨码开关输入a 和b ,接入时钟,输出接到LED 灯上,观察输入不同的数列a 和b ,可以得到相应的相关位数的个数的输出,硬件验证正确。
2. 三位加法器 (1)程序
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity add3 is
port(a,b:in std_logic_vector(2downto 0); s:out std_logic_vector(3 downto 0)); end add3;
architecture beh of add3 is
signal sint:std_logic_vector(3 downto 0); signal aa,bb:std_logic_vector(3 downto 0); begin
aa
s(3 downto 0)
(2)生成模块
add3
a[2..0]b[2..0]
s[3..0]
(3)逻辑功能
inst
将三位二进制数a 和b 输入,则进行加法运算,运算结果以四位二进制数s 输出。
(4)仿真图
两个三位二进制数a 和b 输入三位加法器,即输入011和101,输出s 为a 和b 相加之和1000,即s=a+b。所以三位加法器设计正确。
(5)硬件验证
在EDA 实验箱上,将三位加法器的程序下载到芯片上,三位二进制数a 和b 由拨码开关输入,输出s 接到LED 灯上。可以看到,不同的输入a 和b ,输出s 为a 和b 相加之和,硬件验证正确。
3. 四位加法器 (1)程序
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity add4 is
port(a,b:in std_logic_vector(3 downto 0);
s:out std_logic_vector(4 downto 0)); end add4;
architecture beh of add4 is
signal sint:std_logic_vector(4 downto 0); signal aa,bb:std_logic_vector(4 downto 0); begin
aa
s(4 downto 0)
(2)生成模块
add4
a[3..0]b[3..0]
s[4..0]
inst
(3)逻辑功能
将四位二进制数a 和b 输入,则进行加法运算,运算结果以五位二进制数s 输出。
(4)仿真图
两个四位二进制数a 和b 输入四位加法器,即输入0110和0011,输出s 为a 和b 相加之和01001,即s=a+b。所以四位加法器设计正确。
(5)硬件验证
在EDA 实验箱上,将四位加法器的程序下载到芯片上,四位二进制数a 和b 由拨码开关输入,输出s 接到LED 灯上。可以看到,不同的输入a 和b ,输出s 为a 和b 相加之和,硬件验证正确。
4. 单脉冲发生器 (1)程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY puls IS
PORT (PUL,M:IN STD_LOGIC; Q,NQ:OUT STD_LOGIC); END puls;
ARCHITECTURE BEHAVE OF puls IS SIGNAL TEMP:STD_LOGIC; BEGIN Q
NQ
IF M'EVENT AND M='1' THEN IF PUL='0' THEN TEMP
(2)生成模块
puls
PUL M
Q NQ
(3)逻辑功能
inst
有效时钟从m 端接入,pul 接一个按键。当时钟上升沿来临,且pul 按键按下时,输出端q 从低电平变为高电平,按键没按下或时钟上升沿没来临时,q 保持低电平;nq 和q 刚好相反。这样就可以通过按键在q 端产生时钟上升沿,在nq 端产生时钟下降沿。
(4)仿真图
时钟上升沿来临时,pul 没按下,即pul 为高电平时,输出端q 保持低电平,nq 保持高电平;当时钟上升沿来临,且pul 按下,即pul 为低电平时,q 从低电平变为高电平,产生了时钟上升沿,nq 从高电平变为低电平,产生了时钟下降沿。故单脉冲发生器设计正确。
(5)硬件验证
将单脉冲发生器的程序下载到芯片上,m 端接5Hz 时钟,pul 接按键,输出q 分配管脚到LED 灯上。开始灯亮,说明q 保持低电平,当按下pul 后很快等就灭了,说明q 变成了高电平,也就是产生了上升沿,所以硬件验证正确。
5. 移位寄存器 (1)程序 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity shift is
port(clk:in std_logic; rst,en:in std_logic; date:in std_logic;
q1,q2,q3,q4:out std_logic_vector(3 downto 0)); end shift;
architecture one of shift is
signal q_temp:std_logic_vector(15 downto 0); begin
p_a:process(rst,clk) begin
if rst='0' then
q_temp'0'); elsif clk'event and clk='1' then
q_temp(15 downto 0)
end process p_a; p_b:process(en) begin
if en='0' then
q1
end process p_b; end one;
(2)生成模块
shif t
clk rst en date
q1[3..0]q2[3..0]q3[3..0]q4[3..0]
(3)逻辑功能
inst
该移位寄存器是串入并出移位寄存器,且为左移输入。当rst 有效时清零,rst 无效时,每来一个时钟上升沿,从date 端输入一个一位二进制数,然后存到寄存器内。当en 使能端有效时,将寄存器中的数16位并行输出。这样就实现了一组16位数列串行输入并行输出。
(4)仿真图
rst始终无效,不清零。前16个时钟上升沿期间,en 使能端无效,故输出为初始值,全为0,但是数据date 每来一个时钟上升沿输入了1个数,共输入16个数,存在寄存器中,依次是1111 0111 0111 1111。16个上升沿之后,en 使能端有效,这16个数并行输出,从高位到低位,即q4 q3 q2 q1 是1111 0111 0111 1111。故串入并出左移移位寄存器设计正确。
四、总体设计电路图
1. 原理图
该设计电路原理图为十六位数字相关器原理图,将要检测的两个16位数字序列按对应位分成四个一组,得到四组,然后将其对应的四组分别输入四个四位数字相关器,相关器的结果再经过相加,就得到两个16位数字序列对应位相同的位的个数。
这个为最终总体设计电路图,因为实验箱的拨码开关不够,故选用串入并出移位寄存器,先将两列16位数列a 和b 串行输入,都输入完成后一起并行输出。而这个时钟的控制则有单脉冲发生器产生。如原理图,单脉冲的输出为移位寄存器的时钟,移位寄存器的输出分别接到16位移位寄存器的输入,于是按一次键则同时输入a 和b 的一个数,当两16位数输入完成后,由en 使能端控制一起输出给16位数字相关器,经过比较得到相应结果。
2. 管脚分配
3. 仿真图
由m 端和pul 端控制下的单脉冲发生器将产生的单脉冲用于其后的移位寄存器的时钟,led1 和led2 的下降沿的来临说明移位寄存器的时钟上升沿的来临,然后每来一个上升沿a 和b 输入一个数,当en 使能端有效时,寄存器结果输出给16位数字相关器。Reset 始终无效不清零。在en 使能端有效之前,a 和b 的对应16位中有四位不同,12位相同,故输出结果c 为01100,即为12,仿真验证结果正确。
3. 硬件实现
将原理图下载到芯片后,将原理图中的m 端与时钟相连,即将IO_CLK与IO3相连,pul 端为按键PB[0],en 端为PB[1],reset为复位键,输入a 和b 用拨码SW[0]和SW[1],输出接五个LED 灯,而led1 led2 led3 分别接EP1C12板上的四位LED 的前三个。于是每按下pul 一次,看到led1 和led2同时由亮到灭,则输入了a 和b 的一个数,用
拨码开关改变a 和b 的数输入,16个数之后按下en 使能端的按键,则将锁存器中的数并行输出,则得到输出,由LED 等的亮灭显示的二进制数表示相关位数的个数。
心 得 体 会
数字相关器实现了数字通信过程中帧同步字的检测,在数字通信系统中具有重要的作用,广泛应用于帧同步字检测、扩频接收机、误码校正以及模式匹配等领域。本次设计采用 FPGA对高速数字相关器进行设计,并进行了编译仿真和下载实现。作为一个大三的多接触书本理论知识而不动手实践的学生,我认为这次课程设计很有意义,我也从中学到了很多。
首先,这是一次把课本理论知识和实践相结合的机会。我们可以从中看到理论知识的必要以及实践的重要。这次课程设计可以加深我们对课本知识的理解掌握,同时领悟到实践的重要。
其次,从这次课程设计中我学到了很多以前不知道的、又比较实用的知识。比如对vhdl 语言的深入学习以及学以致用,还有认识了EDA 实验箱,知道了怎么使用,学会了编程,加深了对quartus 2 的软件的理解和加强了使用该软件的能力。
此外,我学会了自己动手动脑去解决问题,一次一次的尝试和失败也磨练了我的耐心和对待成功失败的从容态度,当自己的努力有了成果的时候,那种自信和快乐也是一种充实而美好的体会。
希望我可以凭借这次课设学到的一切,实现更美好的未来。