简单卷积器的设计报告Word下载.docx
《简单卷积器的设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《简单卷积器的设计报告Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
inputCLK,//采用10MHZ的时钟
reset,//复位信号
start,//因为RAM的空间是有限的,当RAM存满后采样和卷积都会停止。
//此时给一个start的高电平脉冲将会开始下一次的卷积。
nbusy;
//从A/D转换器来的信号表示转换器的忙或闲
outputwr,//RAM写控制信号
enout1,enout2,//enout1是存储卷积低字节结果RAM的片选信号
//enout2是存储卷积高字节结果RAM的片选信号
nconvst,//给A/D转换器的控制信号,命令转换器开始工作,低电平有效
address;
//地址输出
input[7:
0]indata;
//从A/D转换器来的数据总线
output[7:
0]outdata;
//写到RAM去的数据总线
wirenbusy;
regwr;
regnconvst,
enout1,
enout2;
reg[7:
reg[10:
0]address;
reg[8:
0]state;
reg[15:
0]result;
reg[23:
0]line;
reg[11:
0]counter;
reghigh;
reg[4:
0]j;
regEOC;
parameterh1=1,h2=2,h3=3;
//假设的系统系数
parameterIDLE=9'
b000000001,START=9'
b000000010,NCONVST=9'
b000000100,
READ=9'
b000001000,CALCU=9'
b000010000,WRREADY=9'
b000100000,
WR=9'
b001000000,WREND=9'
b010000000,WAITFOR=9'
b100000000;
parameterFMAX=20;
//因为A/D转换的时间是随机的,为保证按一定的频率采样,A/D
//转换控制信号应以一定频率给出。
这里采样频率通过FMAX控制
//为500KHZ。
always@(posedgeCLK)
if(!
reset)
begin
state<
=IDLE;
nconvst<
=1'
b1;
enout1<
=1;
enout2<
counter<
=12'
b0;
high<
=0;
wr<
line<
=24'
address<
=11'
end
else
case(state)
IDLE:
if(start==1)
//counter是一个计数器,记录已
//用的RAM空间
=START;
else
//START状态控制A/D开始转换
START:
if(EOC)
=NCONVST;
//NCONVST状态是A/D转换保持阶段
NCONVST:
=READ;
end
//READ状态读取A/D转换结果,计算卷积结果
READ:
={line[15:
0],indata};
=CALCU;
CALCU:
result<
=line[7:
0]*h1+line[15:
8]*h2+line[23:
16]*h3;
=WRREADY;
//将卷积结果写入RAM时,先写入低字节,再写入高字节
//WRREADY状态是写RAM准备状态,建立地址和数据信号
WRREADY:
begin
=counter;
high)outdata<
=result[7:
0];
elseoutdata<
=result[15:
8];
=WR;
//WR状态产生片选和写脉冲
WR:
high)enout1<
elseenout2<
=WREND;
//WREND状态结束一次写操作,若还未写入高字节则转到WRREADY状
//态开始高字节写入
WREND:
high)
elsestate<
=WAITFOR;
//WAITFOR状态控制采样频率并判断RAM是否已被写满
WAITFOR:
if(j==FMAX-1)
=counter+1;
counter[11])state<
$display($time,"
Theramisused
up."
);
$stop;
default:
state<
endcase
//assignrd=1;
//RAM的读信号始终保持为高
//j记录时钟,与FMAX共同控制采样频率
//由于直接用CLK的上升沿对nbusy判断以
//决定某些操作是否运行时,会因为两个信号
//的跳变沿相隔太近而令状态机不能正常工作。
因此
//利用CLK的下降沿建立EOC信号与nbusy同步,相位
//相差180度,然后用CLK的上升沿判断操作是否进行。
always@(negedgeCLK)
EOC<
=nbusy;
reset||state==START)
j<
=j+1;
endmodule
2、测试程序,主要目的是尽可能检测出各种极限情况。
//---------------------------testcon1.v-------------------
moduletestcon1;
wirewr,
enin,
wire[10:
regrd,
CLK,
reset,
start;
wirenconvst;
wire[7:
integeri;
parameterHALF_PERIOD=1000;
//产生10KHZ的时钟
initial
rd=1;
i=0;
CLK=1;
forever#HALF_PERIODCLK=~CLK;
//产生置位信号
reset=1;
#(HALF_PERIOD*2+50)reset=0;
#(HALF_PERIOD*3)reset=1;
//产生开始卷积控制信号
start=0;
#(HALF_PERIOD*7+20)start=1;
#(HALF_PERIOD*2)start=0;
#(HALF_PERIOD*1000)start=1;
assignenin=1;
con1con(.address(address),.indata(indata),.outdata(outdata),.wr(wr),
.nconvst(nconvst),.nbusy(nbusy),.enout1(enout1),
.enout2(enout2),.CLK(CLK),.reset(reset),.start(start));
sramramlow(.Address(address),.Data(outdata),.SRW(wr),.SRG(rd),.SRE(enout1));
adcadc(.nconvst(nconvst),.nbusy(nbusy),.data(indata));
下面是一个波形图,通过该波形图可看清整个程序的时序。
五、心得与收获
VerilogHDL就是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,HDL语言本身是专门面向硬件与系统设计的,使用它可使我同时获得设计实际电路的经验。
本次的基于Veilog的简单卷积器的设计,使我初步掌握了使用Veilog设计程序的基本步骤流程,熟悉使用了HDL语言,并且完成了本次课设的目的与要求。
为以后的工作与学习打好了基础。
设计过程中难免会出现不懂不会的情况,但是通过查阅资料,与同学相互讨论,逐一克服了困难。
通过这次的课程设计,发现了自身存在的不足之处,如思维不严谨,使用仿真软件不熟练等等,以后一定会通过经常性的针对性的练习加以克服!
附录一A/D转换器的VerilogHDL模型机所需要的技术参数
所用的A/D转换器为AD7886,其功能图如下图所示:
AD7886的时序控制有两种方法:
第1种是
和
输入信号控制AD7886三态输出,如上图所示,但A/D转换中三态输出封锁,这种方法适合微处理器在AD7886转换结束后直接把数据读出;
第二种是
接到低电平,启动A/D转换开始后,数据线输出封锁,直到转换结束,数据输出才有效,如下图所示,这种方法可以用A/D转换结束BUSY的上升沿触发外部锁存器锁存数据。
在上述两种时序中,AD7886进行转换都是由NCONVST控制的。
NCONVST的下降沿使采保开始跟踪信号.直到NC0NVST上升沿來了.ADC才进行转换。
NCONVST低脉宽度决定了跟踪-保持的建立时间。
在A/D转换过程中,BUSY输出位低,转换结束,BUSY变为高,表示可以取走转换结果。
本设计采用第二种时序控制AD7886工作。
//---------A/D转换器的VerilogHDL行为模型如下:
moduleadc(nconvst,nbusy,data);
inputnconvst;
//A/D启动脉冲ST,即上图中
outputnbusy;
//A/D工作标志,即上图中
outputdata;
//数据总线,从AD.DATA文件中读取数据后经端口输出
reg[7:
0]databuf,i;
//内部寄存器
regnbusy;
wire[7:
0]data;
0]data_mem[0:
255];
reglink_bus;
integertconv,
t5,
t8,
t9,
t12;
integerwideth1,
wideth2,
wideth;
//时间参数定义(依据AD7886手册):
always@(negedgenconvst)
tconv=9500+{$random}%500;
//(type950ns,max1000ns)ConversionTime
t5={$random}%1000;
//(max100ns)CONVSTtoBUSYPropagationDlay
//CL=10pf
t8=200;
//(min20ns)CL=20pfDataSetupTimePriortoBUSY
//(min10ns)CL=100pf
t9=100+{$random}%900;
//(min10ns,max100ns)BusRelinquishTimeAfterCONVST
t12=2500;
//(type)BUSYHightoCONVSTLow,SHAAcquisitionTime
initial
begin
$readmemh("
adc.data"
data_mem);
//从数据文件adc.data中读取数据
i=0;
nbusy=1;
link_bus=0;
assigndata=link_bus?
databuf:
8'
bzz;
//三态总线
/*----------------------------------------------------------------------------
在信号nconvst的负跳降沿到来后,隔t5秒nbusy信号置为低,tconv是AD将模拟信号转换为数字信号的时间,在信号nconvst的正跳降沿到来后经过tconv时间后,输出nbusy信号变为高。
---------------------------------------------------------------------------*/
always@(negedgenconvst)
fork
#t5nbusy=0;
@(posedgenconvst)
#tconvnbusy=1;
join
/*--------------------------------------------------------------------------
nconvst信号的下降沿触发,经过t9延时后,把数据总线输出关闭置为高阻态,如图示。
nconvst信号的上升沿到来后,经过(tconv-t8)时间,输出一个字节(8位数据)到databuf,该数据来自于data_mem。
而data_mem中的数据是初始化时从数据文件AD.DATA中读取的。
此时应启动总线的三态输出。
---------------------------------------------------------------------------*/
#(tconv-t8)databuf=data_mem[i];
if(wideth<
10000&
&
wideth>
500)
if(i==255)i=0;
elsei=i+1;
elsei=i;
//在模数转换期间关闭三态输出,转换结束时启动三态输出
#t9link_bus=1'
//关闭三态输出,不允许总线输出
#(tconv-t8)link_bus=1'
/*------------------------------------------------------------------------
当nconvst输入信号的下一个转换的下降沿与nbusy信号上升沿之间时间延迟小于t12时,
将会出现警告信息,通知设计者请求转换的输入信号频率太快,A/D器件转换速度跟不上。
仿真模型不仅能够实现硬件电路的输出功能,同时能够对输入信号进行检测,
当输入信号不符合手册要求时,显示警告信息。
-------------------------------------------------------------------------*/
//检查A/D启动信号的频率是否太快
always@(posedgenbusy)
#t12;
if(!
nconvst)
$display("
Warning!
SHAAcquisitionTimeistooshort!
"
//else$display("
SHAAcquisitionTimeisenough!
"
//检查A/D启动信号的负脉冲宽度是否足够和太宽
always@(negedgenconvst)
wideth=$time;
@(posedgenconvst)wideth=$time-wideth;
if(wideth<
=500||wideth>
10000)
nCONVSTPulseWidth=%d"
wideth);
nCONVSTPulseWidthistoonarrowortoowide!
//$stop;
附录二.2K*8位异步CMOS静态RAMHM-65162模型:
/******************************************************************************
*FileName:
sram.v*
*Function:
2K*8bitAsynchronousCMOSStaticRAM*
*****************************************************************************/
/*****************************************************************************
*ModuleName:
sram*
*Description:
*Reference:
HM-65162referencebook*
*sramisaVerilogHDLmodelforHM-65162,2K*8bitAsynchronousCMOSStatic*
*RAM.ItisusedinsimulationtosubstitutetherealRAMtoverifywhether
*thewritingorreadingoftheRAMisOK.Thismoduleisabehavioralmodel*
*forsimulationonly,notsynthesizable.It'
swritingandreadingfunction*
*areverified.*
***************************************************************************/
//-----------------------sram.v------------------------------------------
modulesram(Address,Data,SRG,SRE,SRW);
input[10:
0]Address;
inputSRG,//Outputenable
S