专用集成电路设计报告周训文组讲解文档格式.docx
《专用集成电路设计报告周训文组讲解文档格式.docx》由会员分享,可在线阅读,更多相关《专用集成电路设计报告周训文组讲解文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
功能仿真也称前仿真(区分综合后仿真)是在RTL层进行的仿真,其特点是不考虑构成电路的逻辑和门的时间延迟,着重考虑电路在理想环境下的行为和设计构想的一致性;
(3)模拟电路仿真:
调用相关器件模型对网表所描述的电路进行物理级仿真;
(4)逻辑综合:
用硬件描述语言(Verilog或VHDL)设计电路,需要将语言描述转换为电路图描述,即用芯片制造商提供的基本电路单元(综合库)实现用硬件描述语言描述的RTL级电路的功能,这个过程就称为综合;
(5)布局布线:
自动布局布线是目前普遍采用的芯片后端设计方法。
设计者使用EDA工具,快速、自动地完成逻辑门的放置和门间电路的连接;
(6)Systemverilog断言:
使用systemverilog语言对数字电路进行断言,看它是否满足我们设计所定指标。
三.系统分析
1.项目功能描述
全局循环功能:
对《十个小印第安人》,《梁祝》和《天空之城》三首乐曲按顺序进行全局循环播放。
顺序播放功能:
对三首歌曲按顺序播放一遍。
单曲循环功能:
对三首歌中的任意一首歌曲进行重复播放。
快跳功能:
对音乐进行往前跳几个字节或上一首或上一句播放。
暂停功能:
对正在播放中的音乐进行暂停播放。
随机播放功能:
对三首歌曲进行随机播放。
歌曲刷新功能:
把ram表中的所有歌曲进行刷新,亦把ram表中已有的歌曲全部擦除换上新歌曲。
2.系统组成
(1)音乐硬件演奏电路基本原理
硬件电路的发声原理:
声音的频谱范围约在几十到几千赫兹,若能将基准时钟信号分频,使芯片输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
乐曲中的每一音符对应着一个确定的频率,要使芯片发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。
然而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间,这两个因素是乐曲能够连续演奏的关键。
(2)音符频率的获得
多个不同频率的信号可通过对某个基准频率进行分频器获得。
由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。
若基准频率过低,则分频系数过小,四舍五入取整后的误差较大;
若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。
实际上应该综合考虑这两个方面的因素,即在尽量减少误差的前提下,选取合适的基准频率。
本设计中选取2MHz的基准频率。
对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。
为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。
下表中各音符的分频系数就是从4MHz的基准频率二分频得到的2MHz频率基础上计算得到的。
由于最大分频系数是8191,故分频器采用13位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,即
,此时扬声器不会发声。
(表1音符频率编码表)
(3)乐曲节奏的控制
本设计中存储的乐谱为《梁祝》,《十个小印第安人》和《天空之城》,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。
(4)音乐节拍的产生
本设计将乐谱中的音符数据存储在RAM中,如《美丽的神话》中的第一个音符为“6”,此音在逻辑中停留了2个时钟节拍,即0.5秒的时间,相应地,音符“6”就要在RAM中连续地存储两个地址,当碰到一个4Hz的时钟上升沿,相应地就从RAM中输出一个音符数据。
(5)音乐硬件演奏电路总体设计流程
当一个4Hz的时钟脉冲来到时,音乐节拍发生器模块输出一个音符数据给音符译码模块,音符译码模块输出此音符相应的分频系数,将分频系数送给分频模块,当2MHz的时钟脉冲来到时,分频模块就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来。
连续的4Hz的时钟脉冲就将音乐节拍发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。
曲子也就流畅的播放出来了,当乐曲完成一遍演奏后,乐曲发生器能自动从头开始循环演奏。
四.系统设计
数字模块详细划分
4.1时钟节拍发生器
图1时钟节拍发生器
图1所示为时钟节拍发生器,其实质为一个分频计数器,在正常播放模式下,它将2MHz时钟分频成2hz时钟信号;
在快速播放模式下,它将2MHz时钟分频成4hz时钟。
表1节拍发生器端口描述
信号
I/O
宽度
功能描述
reset
I
1
全局异步复位信号(高电平有效)
clk2mhz
2MHz时钟信号
fast
快进信号(高电平有效)
clk
O
2hz或4hz的时钟输出信号
clkk
o
给刷新模块所用的时钟
halt
暂停信号
4.2地址计数模块
图2地址计数器模块
图2所示为地址计数器模块,它的功能是按照音乐节拍输出相应音符地址。
在正常播放模式下,该计数器的时钟频率为2Hz,快速播放模式为4Hz。
当EN为高电平时,LD为低电平时,每来一个时钟上升沿,地址计数器加1,输出给乐曲数据存储器RAM,根据相应地址将从RAM的输出口输向音符译码电路Tonetaba,所存储的乐曲就开始连续自然的演奏起来。
二进制计数器的位数将根据所存放乐曲简谱基本节拍数来决定,对乐曲《十个小印第安人》,《梁祝》和《天空之城》片段其最小节拍数为75,最大节拍数为105,然而ram表中药存储三首歌,总地址达到329,所以选择计数器的位数为9位。
表2地址计数器端口信号描述
RST
异步复位信号(高电平有效)
节拍发生器产生的2Hz或4hz时钟信号
LD
置数信号(高电平有效)
EN
计数器使能信号(高电平有效)
data_in
9
置数数据输入端
addr_out
当前音符在RAM中的地址
4.3缓存模块地址计数器
图3缓存模块地址
图3所示为缓存模块地址计数器,它的功能是为缓存乐谱数据开辟地址空间,当状态机需要进行对RAM空间中的歌曲刷新时,从缓存模块中相应的地址取出相应的数据存入到RAM相应的地址中,以备用来进行刷新歌曲。
表3fifo端口信号描述
ab
在刷新歌曲时用的选择开关
计数器所用的时钟周期
cnt_en
刷新歌曲时是计数器工作的时能端
rst
复位信号
cnt
7
计数器的输出地址
flag
判断计数器是否为满
4.4音符译码模块
图4音符译码模块
图4所示为音符译码模块,它的功能是将RAM输出的音符数据转换成该音符所对应的初始值,输出给分频模块,分频模块根据该初始值对4MHz时钟进行分频。
表4音频译码端口信号描述
index
5
RAM输出的音符数据
tone
13
音符所对应的初始值
4.5分频模块
图5分频模块
图5所示为分频模块,它的功能是根据不同音符的初始值对2MHz的时钟进行相应的分频,产生该音符所对应频率的波形。
分频后所得波形由spks端口输出。
如图6所示,分频模块由主分频模块和二分频模块组成。
对2Mhz频率分频后的输出信号是一些脉宽极窄的尖脉冲信号。
为提高输出信号的驱动能力,使扬声器有足够的功率发音,输出信号需要通过一个二分频模块,将原来的主分频器的输出脉冲均衡为占空比为1/2的对称方波,这时方波的频率正是音符所对应的频率。
图6分频模块组成
表6分频模块端口信号描述
音频译码模块输出的音符所对应的初始值
Clk2mhz
节拍发生器模块提供的2mHz时钟信号
全局异步复位信号
音乐播放暂停信号(高电平时有效)
spks
音符所对应的频率的输出方波
eno
使能信号
4.6tm模块
图7音符存储模块
图7为判断缓存和转存是否为满,它的基本功能是在起内部组建一个计数器,如果复位信号有效,那么计数器的值为零;
如果在缓存或者转存模块,此时的计数器值也为零;
当toven有效,那么计数器就自动加1,当计数器的值全为1时,tov就为1。
表7RAM模块端口信号描述
Cs0
缓存模块的使能选择信号
Cs1
转存模块的使能选择信号
时钟信号的四分频信号
toven
状态机给出的判断缓存或者转存模块是否为满的标志
tov
判断转存,缓存为满的标志
4.7RANDOM模块
图8随机模块
图8为随机模块,其基本原理是当需要随机播放一首歌曲时,按照自己所约定的随机数,由状态机给出随机数,最后达到随机播放功能。
全局时钟
random
3
输出的随机数,给状态机
表8随机模块端口信号描述
4.8memory模块
图9记忆模块
如图9所示,memo记忆模块的作用是记忆当前播放哪一首歌曲。
比如在顺序播放模式下第一首歌曲到第二首歌曲,那么此时cnum就记录第二首歌曲的所有地址。
Cnumdly就是cnum的一个时钟延迟,而pnum是记录上一首歌曲的所有地址,例如当播放第三首歌时,pnum就为第二首歌曲的所有地址。
表9记忆模块端口信号描述
Clk
节拍发生器产生的4Hz或8hz时钟信号
addr
地址计数器所产生的地址
cnum
2
记录当前曲目编码
pnum
记录过去曲目编码
cnumdly
当前曲目编码的一个延时,其效果与pnum等同
4.9zo3模块
图10zo3模块
如图10所示,zo3的作用是当连续探测到三个零时,那么表示这首歌曲结束,例如,在第一首歌曲后面连续探测到三个零,播放顺序为顺序播放,那么它就立刻播放第二首歌曲。
表10zo3模块端口信号描述
din
22个音符
Zo3
歌曲结束标志
Zo3pos
4.9状态机
Idle:
初始化状态
S0:
置数状态
S1:
顺序播放状态
S2:
判断状态(随机,单曲循环,全局循环,快跳,回放上一首,回放上一句)
S3:
缓存状态
S4:
转存状态
S5:
转存是否结束状态
五.仿真波形
验证规划:
测试点
验证项目
顺序播放
mode=000时,是否正常顺序播放三首,最后停在末地址。
随机播放
mode为010时,是否能随机播放歌曲。
单曲循环播放
mode为001时,能否正常单曲循环播放。
前跳播放
mode为011时,能否进行前跳播放。
全曲循环播放
mode为111时,能否进行全曲循环播放。
顺序播放模式下的前跳
当mode=000时,突然将mode的值变为011,看其是否能完成顺序播放下进行前跳功能
随机模式下的前跳
当mode=010时,突然将mode的值变为011,看其是否能完成随机播放下进行前跳功能
单曲循环模式下的前跳
当mode=001时,突然将mode的值变为011,看其是否能完成单曲循环播放下进行前跳功能
顺序播放变随机播放
mode=000时进行顺序播放,当mode变为010时看能否变成随机播放。
顺序播放变单曲循环
mode=000时进行顺序播放,当mode变为001时看能否变成单曲循环播放。
随机播放变顺序播放
mode=010时进行随机播放,当mode变为000时看能否变成顺序播放。
随机播放变单曲循环播放
mode=010时进行随机播放,当mode变为001时看能否变成单曲循环播放。
单曲循环变顺序播放
mode=001时进行单曲循环播放,当mode变为000时看能否变成顺序播放。
单曲循环变随机播放
mode=001时进行单曲循环播放,当mode变为010时看能否变成随机播放
全曲循环模式下变顺序播放再变全曲
mode=111时进行全曲循环播放,当mode=000时,看能否进行顺序播放,如果能再让mode=111,变回全曲循环模式
全曲循环变随机播放再变全曲
mode=111时进行全曲循环播放,当mode变为010时,看能否进行随机播放,如果能再让mode=111,变回全曲循环模式
全曲循环变单曲循环再变全曲
mode=111时进行全曲循环播放,当mode变为001时,看能否进行单曲循环播放,如果能再让mode=111,变回全曲循环模式
顺序播放模式下由第二首跳转到第一首
mode=000时进行顺序模式,当mode变为100且128<
=addr<
256时,看能否跳到第一首歌。
顺序播放模式下由第三跳转到第二首
mode=000时进行顺序模式,当256<
384且mode=100时,看能否跳到第二首歌。
顺序播放模式下由第一首跳转到第一首
mode=000时进行顺序模式,当0<
128且mode=100时,看能否跳转到第一首歌的首地址。
单曲循环模式下由第三首跳到第二首
mode=001时进行单曲循环模式,当256<
384时,看能否跳到第二首歌。
单曲循环模式下由第二首跳到第一首
mode=001时进行单曲循环模式,当128<
随机模式下由当前歌曲跳到上一首
mode=010时进行随机模式,当0<
384时,看能否跳到上一首歌。
全曲循环模式由当前句跳到上一句
mode=111时进行全曲循环模式,当mode变为101时看能否由当前句跳到上一句。
顺序模式下由当前句跳到上一句
mode=000时进行顺序模式,当mode变为101时看能否由当前句跳到上一句。
随机模式下由当前句跳到上一句
mode=010时进行随机模式,当mode变为101时看能否由当前句跳到上一句。
全曲循环播放下前跳
当mode=111时,突然将mode的值变为011,看其是否能完成全曲播放下进行前跳功能。
顺序播放下进行刷新
mode=000,突然将mode的值变为110,看在顺序播放下能否进行刷新。
单曲循环播放下进行刷新
mode=001,突然将mode的值变为110,看在单曲循环播放下能否进行刷新。
随机播放模式下进行刷新
mode=010,突然将mode的值变为110,看在随机模式播放下能否进行刷新。
全曲循环播放模式下进行刷新
mode=111,突然将mode的值变为110,看在全曲循环播放下能否进行刷新。
具体验证项目:
1.1顺序播放下刷新
当mode为000时,进行顺序播放,当前地址从0开。
当mode发生变化时,即mode为6。
当mode为6时,数据先存入到缓冲区,然后在进入到ram中。
1.2单曲循环播放下进行刷新
Mode为1时,进行单曲循环(第一首)播放
当mode发生变化时,进行歌曲刷新
1.3随机播放模式下进行刷新
Mode=2时,进行随机(第二首)播放
当mode发生变化时,进行刷新歌曲(顺序刷新,即先刷第一首,然后第二首,最后第三首)
1.4全曲循环播放模式下进行刷新
Mode为7时,进行全曲循环播放
当mode发生变化时,进行刷新歌曲
六.断言部分
1地址计数器:
(1)当复位信号有效地址计数器就清零【a_asyn_rst:
assertproperty(@(posedgeclk)rst|->
(addr_out==0))】。
(2)当置数端有效把data_in的值给地址计数器【a_syn_load:
`assert_clk(ld|=>
($past(data_in)==addr_out))】。
(3)当置数端无效并且地址使能端无效,那么地址计数器的值不变【a_syn_hold:
`assert_clk(~ld&
~en|=>
addr_out==$past(addr_out,1))】。
(4)当置数端无效并且地址使能端有效,那么地址计数器完成自动加1【a_syn_add_norm:
en&
(~(&
addr_out))|=>
addr_out==($past(addr_out,1)+1))】。
(5)当置数端无效,使能端有效并且地址计数器的地址全为1,那么地址溢出【a_syn_add_overflow:
(&
addr_out)|=>
(addr_out==0))】。
仿真波形如下图:
图
(1)仿真概况
图
(2)计数器自加和溢出
1ns的时候rst通过;
11ns的时候保持被激活,12ns的时候通过;
23ns的时候计数器自加功被启动,24ns的时候测试通过;
65ns的时候,计数器的置数段被激活,66ns的时候测试通过;
77ns的时候,计数器的溢出被激活,78ns的时候测试通过。
2刷新地址计数器
(1)当复位信号有效地址计数器就清零【a_syn_rst:
assertproperty(@(posedgeclk)rst|->
(cnt==0))】。
(2)当计数器全为1,flag为1【a_syn_flag:
`assert_clk($rose(&
cnt)|->
(flag==1))】。
(3)当状态不是在缓存和转存模块时,计数器自动清零【a_syn_clear:
`assert_clk((~ab)|->
(cnt==0))】。
(4)当状态在缓存和转存模块并且计数器时能端有效并且计数器的值不全为1时,计数器自动加1【a_syn_norm:
`assert_clk((ab)&
(cnt_en)&
(~(cnt))|=>
cnt==($past(cnt,1)+1))】。
(5)当状态在缓存和转存模块并且地址计数器使能端无效时,计数器保持不变【a_syn_hold:
(~cnt_en)|=>
cnt==($past(cnt,1)))】。
(6)当状态在缓存和转存模块,使能端有效并且地址计数器的地址全为1【a_syn_overflow:
cnt_en&
cnt)|=>
(cnt==0))】。
图(3)刷新地址总体概况
图(4)flag和地址溢出
287ns的时候,地址计数器的值全为1,此时flag测试通过;
287ns的时候,溢出被激活,288ns的时候测试通过。
3capa
(1)当复位信号有效pa,ca就清零【a_syn_rst1:
((pa==0)||(ca==0)))】。
(2)当dout有效,posdout的值为1【a_syn_posdout:
`assert_clk($rose(dout)|=>
(posdout==1))】。
(3)当doutdly有效,negdout的值为【a_syn_negdout:
`assert_clk($rose(doutdly)|=>
(negdout==1))】。
(4)只要dout有效,那么doutdly的值为上一个dout的值【a_syn_doutdly:
`assert_clk(doutdly==($past(dout)))】。
(5)只要pa有效,那么padly的值为pa的值【a_syn_padly:
`assert_clk(padly==($past(pa)))】。
(6)当pald有效,那么pa的值为上一个pa_data的值【a_syn_pa1:
`assert_clk(pald|=>
(pa==$past(pa_data)))】。
(7)当pald无效并且negdout有效时,那么pa的值为上一个ca的值【a_syn_pa2:
`assert_cl