数字系统设计实践实验报告.docx
《数字系统设计实践实验报告.docx》由会员分享,可在线阅读,更多相关《数字系统设计实践实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
数字系统设计实践实验报告
实验项目四信号存储与回放
实验报告
吴衡106040363王皓106040026
目录
摘要和关键词2
一.设计任务与要求2
1.1设计任务2
1.2技术指标2
1.3题目评析2
二.实验方案2
2.1方案流程图2
2.2方案解析3
三.系统硬件设计4
3.1系统的总体设计(设计思想、设计步骤),系统的计算。
4
3.2单元电路(或称功能模块)的设计,单元的参数计算。
4
3.3单元电路的功能以及工作原理的分析(单元具体电路图)。
5
3.3.1直通回路模块:
5
3.3.2存储第一个数据的存储器模块:
6
3.3.3DPCM模块:
6
3.3.4解码器模块:
7
3.3.5单次播放控制器:
7
3.3.6主控片段与RAM模块:
8
四.代码算法解析8
4.1存储第一个数据的存储器模块代码(cunchu.vhdl)8
代码解析:
8
4.2DPCM模块代码:
(zhuanhuan.vhdl)9
代码解析:
9
4.3解码器模块代码:
(shuzhi.vhdl)9
代码解析:
10
4.4单次播放控制器代码:
(kongzhi2.vhdl)10
代码解析:
10
4.5主控片段模块代码:
(kongzhi.vhdl)11
代码解析:
11
五.系统测试12
5.1RAM测试:
12
5.2各模块测试:
12
5.3示波器输出:
12
六.附录13
6.1存储第一个数据的存储器模块代码:
(cunchu.vhdl)13
6.2DPCM模块代码:
(zhuanhuan.vhdl)13
6.3解码器模块代码:
(shuzhi.vhdl)14
6.4单次播放控制器代码:
(kongzhi2.vhdl)14
6.5主控片段模块代码:
(kongzhi.vhdl)15
6.6电路总实验图:
16
七.实验声明16
摘要和关键词:
信号存储、回放,ADC、DPCM、信号、解码
一.设计任务与要求
1.1设计任务
设计并制作一个数字化信号存储与回放系统。
1.2技术指标
1.信号频率为200Hz,波形为单极性正弦波和三角波,Vpp~4V;
2.ADC:
采样频率fs=4kHz,字长=8位;
3.信号存储时间≥4秒;
4.DAC:
转换频率fC=4kHz,字长=8位;
5.示波器观察,回放波形无明显失真;
6.回放方式:
直通方式(采集数据后直接回放,不存储)、单次回放、循环回放;
7.数据编码:
4位DPCM(1位符号,3位数据)。
1.3题目评析
题中的重点难点有三:
一是怎样存储波形,这里包含了最大失真误差计算,DPCM算法实现等问题;二是怎样由存储的数据编译出波形;三是怎样使仪器能在频率与频率控制字之间切换显示。
二.实验方案
2.1方案流程图
DPCM编解码:
图中的编码器和解码器分别先成对预测误差量化值的编/解码
2.2方案解析
首先把由ADC得到的数字化波形进行DPCM编码,将8位的数据经DPCM编码后成4位数据存入存储器中,同时,将数据的第一个数字保存下来用于数据还原计算。
在输出时就可以将存储的4位数据重新解码成波形数据,从而输出数据。
PCM编解码
(1)均匀量化
把输入信号的取值域按等距离分割的量化称为均匀量化。
在均匀量化中,每个量化区间的量化电平均取在各区间的中点。
其量化间隔取决于输入信号的变化范围和量化电平数。
当信号的变化范围和量化电平数确定后,量化间隔也被确定。
(2)A律十三折线编码
在13折线法中,无论输入信号是正还是负,均按8段折线(8个段落)进行编码。
若用折叠二进制码来表示输入信号的抽样量化值时,其中用第一位表示量化值的极性,其余7位(第二位至第八位)则可表示抽样量化值的绝对大小。
具体做法:
用第二至第四位(段落码)的8种可能状态来分别代表8个段落的起点电平,其它4位码(段内码)的16种可能状态用来代表每一段落的16个均匀划分的量化级。
上述编码方法是把压缩、量化和编码合为一体的方法。
三.系统硬件设计
3.1系统的总体设计(设计思想、设计步骤),系统的计算。
3.2单元电路(或称功能模块)的设计,单元的参数计算。
1、RAM表大小的计算:
根据题意,ADC的采样频率fs=4kHz,信号存储时间≥4秒,所以RAM表大小为4K×4秒=16000,取实际可用值16384(=2^16)。
2、数据输入大小及输出大小计算(输入8位二进制数据,而输出有10位可选,如何充分利用输入输出也可以优化最终波形):
将输入8位二进制数据除以2,再用DPCM编码,可以使输入的8位二进制数据大小减半,DPCM编码的精度提高一倍。
最后输出时采用高8位输出时,与采用低8位相比数据增大4倍,放大数据弥补采样时的数据除以2造成的不足(比如用高8位输出8位数据“11111111”时,输出数据“1111111100”是采用低8位输出数据“001111111”的4倍)。
3.3单元电路的功能以及工作原理的分析(单元具体电路图)。
3.3.1直通回路模块:
(图一)
(图二)
功能说明:
图一中:
clk为系统时钟,即采样时钟4KHz,gound为ADC的OE使能口,clk0和PIO分别为ADC的采样时钟和DAC的采样时钟。
图二中:
set0为控制口,当其为‘1’时数据选择器选择In[7..0]即直通。
3.3.2存储第一个数据的存储器模块:
功能说明:
这里cunchu模块为人为编写的编码器,能在aclr上升沿时,读入8位数据保存下来,并持续输出,直到下次aclr上升沿有效时,再次读入8位数据保存下来并持续输出。
3.3.3DPCM模块:
功能说明:
这里zhuanhuan模块为人为编写的编码器,能根据输入的三个数据进行编码,输出4位DPCM值。
首先从In[7..0]读入数据,经过lpm_dff0延时器延时1个时钟周期产生数据B,minu减法器将数据B与新数据In[7..0]做差得到临时值res_tep[7..0],将三个数据:
In[7..0],B,临时值res_tep[7..0]送入zhuanhuan模块中计算得到DPCM值输出res[3..0]。
3.3.4解码器模块:
功能说明:
这里shuzhi模块为人为编写的解码器,能根据q[3..0]的数值与输入量tmp[7..0]解码出8位波形数据。
首先在RAM存储数据时,解码器由于其clk与采样时钟clk接在一起所以一直在工作,由于RAM首先在写状态,所以输出的数据q[3..0]一直为0。
先看解码器的数据选择器部分,在RAM为写状态时,wr为‘1’所以lpm_mux1数据选择器一直选择从先前的第一位数据的存储器中读数据,由于q[3..0]为0,所以经shuzhi模块相加后数值一直不变。
当RAM到写状态时,wr为‘0’,lpm_mux1数据选择器选择先前计算好的值给shuzhi模块,同时RAM读出数据q[3..0],由于lpm_mux1数据选择器控制口一直是‘0’,所以每个时钟周期,会从RAM中读出一个数据与先前的结果相加,即解码得到波形数据。
3.3.5单次播放控制器:
功能说明:
这里kongzhi2模块为人为编写的控制器,能根据控制量set1和sr_num[7..0]控制输出波形数据,当set1为‘0’时,当sr_num[7..0]>1时,输出闸门关闭,输出持续低电平,sr_num[7..0]<2时输出闸门开启,输出波形数据,即实现了单次播放功能。
首先,lpm_counter0为14位计数器,记录4s时间,其为工程核心计时器,计时器记满一周期,输出一个脉冲给lpm_counter1,lpm_counter1为8位计数器用于显示系统已经工作了几个周期了。
3.3.6主控片段与RAM模块:
功能说明:
这里kongzhi模块为人为编写控制器,控制RAM的读写状态。
当aclr有效时,wr为‘1’,接着根据计数器输出量sr_in[13..0]控制wr的状态。
四.代码算法解析
4.1存储第一个数据的存储器模块代码(cunchu.vhdl)
entitycunchuis
port
(
en:
instd_logic;
input:
instd_logic_vector(7downto0);
sr_out:
outstd_logic_vector(7downto0)
);
endentity;
architecturertlofcunchuis
begin
process(en)
begin
if(en'eventanden='1')then
sr_out<=input;
endif;
endprocess;
endrtl;
代码解析:
当en在上升沿有效时,更新存储器模块数据,其余时候持续输出存储的数据。
4.2DPCM模块代码:
(zhuanhuan.vhdl)
entityzhuanhuanis
port
(
sr_inA,sr_inB,sr_in:
instd_logic_vector(7downto0);
sr_out:
outstd_logic_vector(3downto0)
);
endentity;
architecturertlofzhuanhuanis
typestatetypeis(s0,s1);
signalstate:
statetype;
begin
P1:
process(sr_inB)
begin
ifsr_inA>=sr_inBthen
state<=s0;
elsestate<=s1;
endif;
endprocessP1;
P2:
process(state)
begin
casestateis
whens0=>sr_out(3)<='0';if(sr_in>7)thensr_out(2downto0)<="111";elsesr_out(2downto0)<=sr_in(2downto0);endif;
whens1=>sr_out(3)<='1';if(sr_in<249)thensr_out(2downto0)<="111";elsesr_out(2downto0)<=8-(sr_in(2downto0));endif;
endcase;
endprocessP2;
endrtl;
代码解析:
当s0状态时表示A>=B,则A-B>0,所以sr_out(3)<='0'若A与B的差大于7则存储7,否则存储低3位数据。
当s0状态时表示A
当sr_in=249时,sr_in的实际值应为-7,若sr_in<249则sr_in的实际值小于-7,所以需存储最大数‘111’即sr_out(3)<='0';if(sr_in>7)thensr_out(2downto0)<="111"。
4.3解码器模块代码:
(shuzhi.vhdl)
entityshuzhiis
port
(
clk:
instd_logic;
sr_in:
instd_logic_vector(3downto0);
tmp:
instd_logic_vector(7downto0);
sr_out:
outstd_logic_vector(7downto0)
);
endentity;
architecturertlofshuzhiis
signalst_tmp:
std_logic_vector(7downto0);
begin
st_tmp<="00000"&sr_in(2downto0);
process(clk)
begin
if(clk'eventandclk='1')then
if(sr_in(3)='0')thensr_out<=tmp+st_tmp;
elseif(tmp>st_tmp)thensr_out<=tmp-st_tmp;endif;
endif;
endif;
endprocess;
endrtl;
代码解析:
当时钟上升沿有效时,根据sr_in(3)来判断正负,‘0’表示正,则应加上3位数解码:
sr_out<=tmp+st_tmp;否则,只有被减数大于减数时(这里若不加判断直接相减可能会出现下方波形跑到上方导致波形段的现象)才进行相减。
4.4单次播放控制器代码:
(kongzhi2.vhdl)
entitykongzhi2is
port
(
set:
instd_logic;
sr_in:
instd_logic_vector(7downto0);
sr_num:
instd_logic_vector(7downto0);
sr_out:
outstd_logic_vector(7downto0)
);
endentity;
architecturertlofkongzhi2is
begin
sr_out<=sr_inwhenset='1'else
"00000000"whensr_num>1elsesr_in;
endrtl;
代码解析:
当set为‘1’时,不进行输出控制,即始终循环播放,当其为‘0’时,根据系统运行周期进行判断,闸门只在系统周期<2时开放,大于2后持续输出低电平。
4.5主控片段模块代码:
(kongzhi.vhdl)
entitykongzhiis
port
(
aclr:
instd_logic;
sr_in:
instd_logic_vector(13downto0);
wr:
bufferstd_logic
);
endentity;
architecturertlofkongzhiis
typestatetypeis(s0,s1);
signalstate:
statetype;
begin
P1:
process(aclr)
begin
if(aclr='1')then
state<=s0;
elsestate<=s1;
endif;
endprocessP1;
P2:
process(state,sr_in)
begin
casestateis
whens0=>wr<='1';
whens1=>if(sr_in=16383)then
wr<='0';
endif;
endcase;
endprocessP2;
endrtl;
代码解析:
主控制器是系统的核心部分,其根据aclr(清零键),sr_in(采样时间)来控制wr(RAM的读写)。
当aclr高电平有效时,进入状态s0,s0为起始状态,wr为‘1’即RAM为写状态。
其余时候为s1状态,在s1状态时当sr_in=1638即系统运行一周期后,wr为‘0’即RAM由写变读,并始终为读,直到数据清零。
五.系统测试
5.1RAM测试:
5.2各模块测试:
5.3示波器输出:
循环输出(黄线为输出波形,蓝线为输入波形)
六.附录
6.1存储第一个数据的存储器模块代码:
(cunchu.vhdl)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitycunchuis
port
(
en:
instd_logic;
input:
instd_logic_vector(7downto0);
sr_out:
outstd_logic_vector(7downto0)
);
endentity;
architecturertlofcunchuis
begin
process(en)
begin
if(en'eventanden='1')then
sr_out<=input;
endif;
endprocess;
endrtl;
6.2DPCM模块代码:
(zhuanhuan.vhdl)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityzhuanhuanis
port
(
sr_inA,sr_inB,sr_in:
instd_logic_vector(7downto0);
sr_out:
outstd_logic_vector(3downto0)
);
endentity;
architecturertlofzhuanhuanis
typestatetypeis(s0,s1);
signalstate:
statetype;
begin
P1:
process(sr_inB)
begin
ifsr_inA>=sr_inBthen
state<=s0;
elsestate<=s1;
endif;
endprocessP1;
P2:
process(state)
begin
casestateis
whens0=>sr_out(3)<='0';if(sr_in>7)thensr_out(2downto0)<="111";elsesr_out(2downto0)<=sr_in(2downto0);endif;
whens1=>sr_out(3)<='1';if(sr_in<249)thensr_out(2downto0)<="111";elsesr_out(2downto0)<=8-(sr_in(2downto0));endif;
endcase;
endprocessP2;
endrtl;
6.3解码器模块代码:
(shuzhi.vhdl)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityshuzhiis
port
(
clk:
instd_logic;
sr_in:
instd_logic_vector(3downto0);
tmp:
instd_logic_vector(7downto0);
sr_out:
outstd_logic_vector(7downto0)
);
endentity;
architecturertlofshuzhiis
signalst_tmp:
std_logic_vector(7downto0);
begin
st_tmp<="00000"&sr_in(2downto0);
process(clk)
begin
if(clk'eventandclk='1')then
if(sr_in(3)='0')thensr_out<=tmp+st_tmp;
elseif(tmp>st_tmp)thensr_out<=tmp-st_tmp;endif;
endif;
endif;
endprocess;
endrtl;
6.4单次播放控制器代码:
(kongzhi2.vhdl)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitykongzhi2is
port
(
set:
instd_logic;
sr_in:
instd_logic_vector(7downto0);
sr_num:
instd_logic_vector(7downto0);
sr_out:
outstd_logic_vector(7downto0)
);
endentity;
architecturertlofkongzhi2is
begin
sr_out<=sr_inwhenset='1'else
"00000000"whensr_num>1elsesr_in;
endrtl;
6.5主控片段模块代码:
(kongzhi.vhdl)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitykongzhiis
port
(
aclr:
instd_logic;
sr_in:
instd_logic_vector(13downto0);
wr:
bufferstd_logic
);
endentity;
architecturertlofkongzhiis
typestatetypeis(s0,s1);
signalstate:
statetype;
begin
P1:
process(aclr)
begin
if(aclr='1')then
state<=s0;
elsestate<=s1;
endif;
endprocessP1;
P2:
process(state,sr_in)
begin
casestateis
whens0=>wr<='1';
whens1=>if(sr_in=16383)then
wr<='0';
endif;
endcase;
endprocessP2;
endrtl;
6.6电路总实验图:
七.实验声明
本实验为本组独立设计完成,许多其他小组若有采用本组实验代码及算法流程的属盗用!
!
!
本组从未允许其他小组用本实验通过实验验收。
本