资源描述:
《通过模块之间的调用实现自顶向下的设计.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、通过模块之间的调用实现自顶向下的设计 练习十.通过模块之间的调用实现自顶向下的设计目的:学习状态机的嵌套使用实现层次化、结构化设计。现代硬件系统的设计过程与软件系统的开发相似,设计一个大规模的集成电路的往往由模块多层次的引用和组合构成。层次化、结构化的设计过程,能使复杂的系统容易控制和调试。在VerilogHDL中,上层模块引用下层模块与C语言中程序调用有些类似,被引用的子模块在综合时作为其父模块的一部分被综合,形成相应的电路结构。在进行模块实例引用时,必须注意的是模块之间对应的端口,即子模块的端口与父模块的内部信号必须明确
2、无误地一一对应,否则容易产生意想不到的后果。下面给出的例子是设计中遇到的一个实例,其功能是将并行数据转化为串行数据送交外部电路编码,并将解码后得到的串行数据转化为并行数据交由CPU处理。显而易见,这实际上是两个独立的逻辑功能,分别设计为独立的模块,然后再合并为一个模块显得目的明确、层次清晰。//----------------p_to_s.v---------------------------------modulep_to_s(D_in,T0,data,SEND,ESC,ADD_100);outputD_in,T0;//D
3、_in是串行输出,T0是移位时钟并给//CPU中断,以确定何时给出下个数据。input[7:0]data;//并行输入的数据。inputSEND,ESC,ADD_100;//SEND、ESC共同决定是否进行并到串//的数据转化。ADD_100决定何时置数。wireD_in,T0;reg[7:0]DATA_Q,DATA_Q_buf; assignT0=!(SEND&ESC);//形成移位时钟。.assignD_in=DATA_Q[7];//给出串行数据。 always@(posedgeT0ornegedgeADD_100)/
4、/ADD_100下沿置数,T0上沿移位。beginif(!ADD_100)DATA_Q=data;elsebeginDATA_Q_buf=DATA_Q<<1;//DATA_Q_buf作为中介,以令综合器DATA_Q=DATA_Q_buf;//能辨明。endendendmodule在p_to_s.v中,由于移位运算虽然可综合,但是不是简单的RTL级描述,直接用DATA_Q<=DATA_Q<<1的写法在综合时会令综合器产生误解。另外,在该设计中,由于时钟T0的频率较低,所以没有象以往那样采用低电平置数,而是采用ADD_100的下降
5、沿置数。//---------------------s_to_p.v---------------------------modules_to_p(T1,data,D_out,DSC,TAKE,ADD_101);outputT1;//给CPU中断,以确定CPU何时取转化//得到的并行数据。output[7:0]data;inputD_out,DSC,TAKE,ADD_101;//D_out提供输入串行数据。DSC、TAKE//共同决定何时取数。wire[7:0]data;wireT1,clk2;reg[7:0]data_la
6、tch,data_latch_buf; assignclk2=DSC&TAKE;//提供移位时钟。assignT1=!clk2; assigndata=(!ADD_101)?data_latch:8’bz;always@(posedgeclk2)begindata_latch_buf=data_latch<<1;//data_latch_buf作缓冲data_latch=data_latch_buf;//,以令综合器能辩明。data_latch[0]=D_out;endendmodule将上面的两个模块合并起来的sys.v
7、的源代码://-------------------sys.v---------------------------`include“./p_to_s.v”`include“./s_to_p.v”modulesys(D_in,T0,T1,data,D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101);inputD_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101;inout[7:0]data;outputD_in,T0,T1; p_to_sp_to_s(.D_in(D_i
8、n),.T0(T0),.data(data),.SEND(SEND),.ESC(ESC),.ADD_100(ADD_100));s_to_ps_to_p(.T1(T1),.data(data),.D_out(D_out),.DSC(DSC),.TAKE(TAKE),.ADD_