简单卷积器的设计报告Word下载.docx

上传人:b****5 文档编号:16464024 上传时间:2022-11-23 格式:DOCX 页数:21 大小:192.55KB
下载 相关 举报
简单卷积器的设计报告Word下载.docx_第1页
第1页 / 共21页
简单卷积器的设计报告Word下载.docx_第2页
第2页 / 共21页
简单卷积器的设计报告Word下载.docx_第3页
第3页 / 共21页
简单卷积器的设计报告Word下载.docx_第4页
第4页 / 共21页
简单卷积器的设计报告Word下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

简单卷积器的设计报告Word下载.docx

《简单卷积器的设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《简单卷积器的设计报告Word下载.docx(21页珍藏版)》请在冰豆网上搜索。

简单卷积器的设计报告Word下载.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1