信号与信息处理研究生作业.docx
《信号与信息处理研究生作业.docx》由会员分享,可在线阅读,更多相关《信号与信息处理研究生作业.docx(35页珍藏版)》请在冰豆网上搜索。
信号与信息处理研究生作业
2009研究生VHDL作业习题
题目一、请分别画出如下VHDL程序所描述的一个电路模型。
(1)
Process(CLK)
Begin
if(CLK'eventandCLK'1')then
X<=AandB;
Y<=X;
Z<=Y;
Endif;
EndProcess;
(2)
Process(CLK)
VariableX,Y:
std_logic;
Begin
If(CLK'eventandCLK'1')then
X:
=AandB;
Y:
=X;
Z<=Y;
Endif;
EndProcess;
(3)
Process(CLK)
Begin
if(CLK'eventandCLK'1')then
Z<=Y;
Y<=X;
X<=AandB;
Endif;
EndProcess;
(4)
Process(CLK)
VariableX,Y:
std_logic;
Begin
If(CLK'eventandCLK'1')then
Z<=Y;
Y:
=X;
X:
=AandB;
Endif;
EndProcess;
解答:
信号用于说明全局变量,变量用于说明局部量。
信号和变量值的代入不仅形式不同,而且其操作过程也不同。
在变量的赋值语句中,该语句一旦被执行,其值立即被赋予变量。
在执行下一条语句时,该变量的值就为上一句新赋的值。
在信号的赋值语句中,该语句即使被执行也不会使信号立即发生代入。
下一条语句执行时,仍使用原来的信号值。
直到进程结束之后,所有信号代入语句的实际代入才顺序进入处理。
其VHDL描述的电路如下:
(1)
(2)
(3)
(4)
题目二、采用SR锁存器可实现时钟信号的双相化,其如图所示,请画出其对应输入的输出波形,并指出其特征。
解答:
由于输出端NQ和Q又反馈到电路中作为输入,所以为了区别开,我们用NQ(n-1)和Q(n-1)表示前一状态,用NQ(n)和Q(n)表示现态,则NQ(n)和Q(n)可表示如下:
假设各个门的时延是相同的,则根据该锁存器的电路得到各信号波形如下所示:
串并转换相加器
要求
1)画出系统的功能框图并给出设计思想
2)用VHDL或Verilog写出代码
3)进行设计实现,写出设计实验报告
电路的输入/输出信号如下:
输入信号:
●Clock:
时钟信号;
●Reset:
reset信号;
●S_data_en:
数据有效信号,当该信号为高电平时,串行数据为有效数据;
●Data_a,data_b:
串行数据,当s_data_en为高时,在data_a,data_b上将一次传送从低位开始的8位数据。
输出信号:
●Out_en:
输出数据使能信号;
●Result[7..0]:
8比特相加结果;
●Result_ca:
进位信号;
解:
分析实验:
该电路由2个8位串并转化器和一个8位加法器组成,如图:
对于串并转换电路,采用有限状态机来实现。
因为系统有复位状态,所以可以从复位状态开始设计,令复位状态为起始状态S0。
下面给出该状态的文字描述:
S0:
系统复位状态。
电路为同步复位,因此,如果输入复位信号reset(高电平)有效,无论此时输入信号data为何值,在时钟上升沿,系统进入复位状态S0。
系统将保持在此状态值直到串并转换开始信号s_data_en有效(高电平)为止。
在S0状态,输出信号out_en为低电平,表示并行数据输出端result上的是无效信号。
如果在某个时钟周期复位信号reset无效(低电平),并且串并转换信号s_data_en有效,则在系统后面的8个时钟周期接收外部串行数据输入,此时系统进入一个新状态,记为S1。
S1:
系统接收第一位串行数据状态。
如果当前状态为S0,并当复位信号reset无效(低电平),串并转换开始信号s_data_en有效(高电平)时,系统进入这一状态;如果当前状态为S9,复位信号无效(低电平)并且串并转换开始信号s_data_en有效(高电平),系统也进入这一状态。
在S1状态下,系统在每个时钟上升沿将外部输入的串行数据锁存,输出信号out_en依然为低电平,表明系统正在进行串并转换中,并行数据输出端result上的是无效信号。
如果在S1状态出现复位信号reset有效(高电平),则系统转至复位状态S0,否则,系统进入下一个状态S2。
S2:
系统接收第二位串行数据状态。
在状态S1,如果输入复位信号reset无效(低电平),在下一个时钟周期,系统接收第二位串行数据输入,系统进入此状态。
在S2状态,输出信号out_en依然为低电平,表明此时系统正在进行串并信号转换中,并行信号输出端result上的值是无效信号。
如果在S2状态出现复位信号reset有效(高电平),则系统转至复位状态S0,否则,系统在下个时钟周期开始接收第三位串行数据输入,并且系统进入新状态S3。
S3:
系统接收第三位串行数据状态。
在状态S2,如果输入复位信号reset无效(低电平),在下一个时钟周期,系统接收第三位串行数据输入,系统进入此状态。
在S3状态,输出信号out_en依然为低电平,表明此时系统正在进行串并信号转换中,并行信号输出端result上的值是无效信号。
如果在S3状态出现复位信号reset有效(高电平),则系统转至复位状态S0,否则,系统在下个时钟周期开始接收第四位串行数据输入,并且系统进入新状态S4。
S4:
系统接收第四位串行数据状态。
在状态S3,如果输入复位信号reset无效(低电平),在下一个时钟周期,系统接收第四位串行数据输入,系统进入此状态。
在S4状态,输出信号out_en依然为低电平,表明此时系统正在进行串并信号转换中,并行信号输出端result上的值是无效信号。
如果在S4状态出现复位信号reset有效(高电平),则系统转至复位状态S0,否则,系统在下个时钟周期开始接收第五位串行数据输入,并且系统进入新状态S5。
接下来的S5,S6,S7三个状态都同S3,S4一样,一直到S8状态。
S8:
系统接收第八位串行数据状态。
在状态S8,如果输入复位信号reset无效(低电平),在下一个时钟周期,系统接收第八位串行数据输入,系统进入此状态。
在S8状态,输出信号out_en依然为低电平,表明此时系统正在进行串并信号转换中,并行数据输出端result上的值是无效信号。
如果在S8状态出现复位信号reset有效(高电平),则系统转至复位状态S0,否则,系统在下个时钟周期将接收到的八位串行数据通过并行数据输出端result输出,并且系统进入新状态S9。
S9:
系统将八位串行数据并行输出状态。
在状态S8,如果输入复位信号reset无效(低电平),在下一个时钟周期,系统接收到的八位串行数据通过并行数据输出端result输出8位并行数据,系统进入此状态。
在S9状态,输出信号out_en为高电平,表明此时系统串并信号转换完成,并行数据输出端result上的值是有效信号。
如果在S9状态中出现复位信号reset有效(高电平),则系统转至复位状态S0;如果在S9状态复位信号reset信号无效(低电平)并且不出现串并转换开始信号,即s_data_en无效(低电平),系统下个时钟周期也进入复位状态S0;如果复位信号reset无效(低电平),并且串并转换开始信号s_data_en有效(高电平),则下个状态开始接收第一位串行数据输入,系统进入S1状态。
根据以上分析,可写出串并转换模块的VHDL代码为:
entityseries_parallelis
Port(clk:
instd_logic;
reset:
instd_logic;
start:
instd_logic;
data:
instd_logic;
done:
outstd_logic;
result:
outstd_logic_vector(7downto0));
endseries_parallel;
architectureBehavioralofseries_parallelis
typestateis(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9);
signalcurrent_state:
state:
=s0;
signalnext_state:
state;
begin
nxtstate:
process(clk)
begin
if(clk'eventandclk='1')then
current_state<=next_state;
endif;
endprocessnxtstate;
control:
process(current_state,reset,start)
variableshift:
std_logic_vector(7downto0):
="00000000";
begin
casecurrent_stateis
whens0=>
if(reset='0'andstart='1')then
next_state<=s1;
done<='0';
else
next_state<=s0;
endif;
whens1=>
if(reset='0'andstart='1')then
next_state<=s2;
done<='0';
shift:
=shift(6downto0)&data;
elsif(reset='1')then
next_state<=s0;
endif;
whens2=>
if(reset='0'andstart='1')then
next_state<=s3;
done<='0';
shift:
=shift(6downto0)&data;
elsif(reset='1')then
next_state<=s0;
endif;
whens3=>
if(reset='0'andstart='1')then
next_state<=s4;
done<='0';
shift:
=shift(6downto0)&data;
elsif(reset='1')then
next_state<=s0;
endif;
whens4=>
if(reset='0'andstart='1')then
next_state<=s5;
done<='0';
shift:
=shift(6downto0)&data;
elsif(reset='1')then
next_state<=s0;
endif;
whens5=>
if(reset='0'andstart='1')then
next_state<=s6;
done<='0';
shift:
=shift(6downto0)&data;
elsif(reset='1')then
next_state<=s0;
endif;
whens6=>
if(reset='0'andstart='1')then
next_state<=s7;
done<='0';
shift:
=shift(6downto0)&data;
elsif(reset='1')then
next_state<=s0;
endif;
whens7=>
if(reset='0'andstart='1')then
next_state<=s8;
done<='0';
shift:
=shift(6downto0)&data;
elsif(reset='1')then
next_state<=s0;
endif;
whens8=>
if(reset='0'andstart='1')then
next_state<=s9;
done<='0';
shift:
=shift(6downto0)&data;
elsif(reset='1')then
next_state<=s0;
endif;
whens9=>
if(reset='0'andstart='1')then
next_state<=s1;
done<='1';
result<=shift;
elsif(reset='1'orstart='0')then
next_state<=s0;
endif;
endcase;
endprocesscontrol;
endBehavioral;
对串并转换模块进行仿真,可知其能实现要求的功能。
图2.串并转换模块的仿真波形
八位带进位的加法器模块
八位带进位的加法器模块的VHDL代码如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityadd8is
port(data_a:
instd_logic_vector(7downto0);
data_b:
instd_logic_vector(7downto0);
in_en:
instd_logic;
out_en:
instd_logic;
result:
outstd_logic_vector(7downto0);
result_ca:
outstd_logic);
endadd8;
architectureBehavioralofadd8is
signala,b,temp:
std_logic_vector(8downto0);
begin
process(data_a,data_b,in_en,out_en)
begin
a<='0'&data_a(7downto0);
b<='0'&data_b(7downto0);
ifin_en='1'then
temp<=a+b;
endif;
ifout_en='1'then
result(7downto0)<=temp(7downto0);
result_ca<=temp(8);
endif;
endprocess;
endBehavioral;
对八位带进位的加法器模块进行仿真,可知其能实现要求的功能。
图3.八位带进位的加法器模块仿真的波形
顶层模块
图4.顶层模块(top)原理图
图5.顶层模块(top)的仿真波形
小结
由各个功能模块及最后顶层模块的仿真可以看出,此电路可由有限状态机很好地实现。
当复位信号reset无效(低电平),且串行数据为有效(高电平)时,两个分别输入的串行数据分别为data_a和data_b,进行串并转换并相加后,在输出数据使能信号out_en有效(高电平)时,由result(7:
0)输出8bit的相加结果
随机数发生器的原理分析与设计实现
一、问题说明:
随机数发生器可产生两个随机数,由一开关(RIN)进行控制,RIN为1时随机数发生器被清除,RIN为0时随机数发生器将产生1-6的两个随机数,可由LED数码管显示。
二、设计实验要求
1.根据给出的逻辑电路图(附在题后),自行分析该随机数发生器的逻辑功能(可借助仿真工具进行人机交互的功能仿真和分析)。
2.利用图形或VHDL语言,采用相应的EDA工具,进行设计输入、功能仿真及设计实现等,最后进行数据下载和硬件功能检验。
3.写电路的设计实验和原理分析报告。
三、实验步骤
1.原理图分析
(1)顶层图分析
该实验用到的顶层图如下所示:
在顶层图模块中,时钟信号CLK和触发信号IPAD作为输入,输出八位并行数据在七段数码显示管上显示。
对顶层模块仿真,得到波形如下:
从仿真图中可以看出,在触发信号IPAD的触发下,该模块能产生随机数,说明该模块功能正确。
下面分别对顶层模块中的每一个小模块的功能进行分析。
(2)ROLL模块
ROLL模块的电路原理图如下所示
其中IFD和FD模块是ISE软件自带的模块,二者均是D触发器,其真值表相同,如下所示:
对该模块进行仿真,得到仿真图如下所示:
由子模块真值表和电路图以及仿真结果分析可知,ROLL模块的功能是:
将输入持续高电平信号延迟一个时钟输出,而且输出的高电平持续时间少一个时钟周期。
(3)MUXCON模块
ROLL模块的电路原理图如下所示
该原理图中,CB2RE也是ISE软件自带模块,它是一个2-bit同步计数器。
其真值表如下:
Input
Output
R
CE
C
Q1Q0
1
×
↑
0
0
0
×
保持
0
1
↑
加1
在MUXCON原理图中,将CE接高电平,这样该模块的输出处于清零和加状态,输出的SO和S1作为数码显示管的片选信号。
对该模块仿真,结果如下:
从仿真图中我们可以看出,当RL为低电平时,S1S0依次为00、01、10、11,在RL为高电平时清零。
(4)RANDOM模块
RANDOM模块是核心模块,它的原理图如下:
该模块调用了两个DICK子模块,DICK模块的电路原理图如下:
对DICK原理图进行仿真,结果如下:
从仿真图中可以看出,在RL处于高电平期间,由e0、e1、e2三个输出口产生随机数。
因此RANDOM模块的功能也是产生随机数。
对RANDOM模块进行仿真,得到仿真波形如下:
从仿真图中可以看到,在RL为高电平时,该模块输出六位随机数。
(5)SELECT模块
SELECT模块的电路原理图如下所示:
对该模块进行仿真,得仿真波形图如下:
由该仿真图可以看出,该模块是一个数据选择器,其真值表如下:
Input
Output
S1
S0
O3O2O1
0
0
000
0
1
000
1
0
B3B2B1
1
1
A3A2A1
(6)7SEG模块
7SEG模块是一个七段数码管译码器,其电路原理图如下:
I1,I2,I3为输入端,A,B,C,D,E,F,G为输出端。
对该模块进行仿真,得到仿真波形如下所示:
以其中一组波形分析,当输入i3i2i1为010时,输出abcdefg为0010010,对应七段数码管如下:
数码管上显示的2与输入的010能正确对应。
2.下载运行
顶层模块仿真正确后就可以将该模块转化成.bit二进制文件,下载到FPGA芯片中运行。
由于实验中使用的是Xilinx公司的spartanⅢ,内部时钟位50MHz,为了是数码管能稳定显示数据,需要对该频率进行分频,实验证明采取50000分频能观察到理想的结果。
分频模块的vhdl语言描述如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entityfdiv50kis
Port(clk:
instd_logic;
clkout:
outstd_logic);
endfdiv50k;
architectureBehavioraloffdiv50kis
signalclk_temp:
std_logic:
='0';
signalcounter:
integer:
=1;
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(counter=50000)then
counter<=1;
clk_temp<=notclk_temp;
else
counter<=counter+1;
endif;
endif;
endprocess;
clkout<=clk_temp;
endBehavioral;
交通灯控制器的设计与实现
1.问题说明
该交通灯系统为一个十字路口交通管理信号灯,用于主干道与乡间公路的交叉路口,要求是优先保证主干道的畅通,因此平时处于“主干道绿灯,乡间道红灯”状态,只有在乡间公路有车辆要穿行主干道时才将交通灯切向“主干道红灯,乡间道绿灯”,一旦乡间公路无车辆通过路口,交通灯又回到“主绿,乡红”的状态。
此外,主干道每次通行的时间不得短于1分钟,乡间公路每次通行时间不得长于20秒。
而在两个状态交换过程中出现的“主黄,乡红”和“主红,乡黄”状态,持续时间都为4秒。
2.实验要求
(1)根据以上说明,画出逻辑电路图。
(2)利用VHDL语言,在相应的EDA工具上进行设计输入、功能仿真及设计实现,最后对所选的FPGA进行数据下载和检验。
(3)写出设计实验报告。
3.实验步骤及分析
(1)设计方案
交通灯的状态转换规律如图所示:
乡有车
S=1
主绿,乡红
主黄,乡红
4秒
4秒
主红,乡绿
主红,乡黄
乡无车
S=0
图1.交通灯的状态转换规律
乡间公路有车辆欲穿行路口时,应向交通灯控制器发一个请求信号S,这可以由乡间公路右侧埋设的传感器产生。
由于系统的运行有4个状态,因而控制器也应有4个状态。
系统的6个输出各与一定的状态相对应,只要通过一些门电路即可完成对信号灯的控制,但由于信号灯的功率一般都很大,所以在每盏灯前