电子科大EDA大赛上机题.docx
《电子科大EDA大赛上机题.docx》由会员分享,可在线阅读,更多相关《电子科大EDA大赛上机题.docx(18页珍藏版)》请在冰豆网上搜索。
![电子科大EDA大赛上机题.docx](https://file1.bdocx.com/fileroot1/2023-1/22/da22bca8-9115-468f-b8d2-5b9963e7238e/da22bca8-9115-468f-b8d2-5b9963e7238e1.gif)
电子科大EDA大赛上机题
EDA大赛上机报告
学院:
微电子与固体电子学院
学生姓名学号:
蓝武201421030321
刘志超201421030323
钟毅201421030325
1对4双向数据通信系统设计
一、设计要求
设计一个1对4双向数据通信系统,示意图如下:
主机过双向交换单元和4个从机通讯,其具体通信过程如下:
(1)主机不定期向任意从机发送一组数据,数据总长度位2~8个byte;
(2)主机和双向交换单元之间通过并行总线交换数据,并行总线由数据总线,地址总线,控制总线三部分构成,其中数据总线位宽位8bits;
(3)双向交换单元与每个从机之间通过RX和TX两根信号线完成双向数据传输,传输采取异步传输模式;
(4)从机接收数据后将数据回传到主机,处理1个Byte的数据需要耗时4个时钟周期,换言之处理数据总长度决定从机处理时间;
(5)主机接收到处理完毕的数据,整个传输过程结束。
二、设计思路及实现方案
1,主机相当于激励产生模块,随机产生一组数据,数据总长度位2~8个byte,随机数据由人为testbench给出,数据总长度转化8位带宽,设计到一个串并转换。
把并行数据存入FIFO模块。
数据存储完拉高主机传输总线,停止数据传输。
2,根据并行总线(包括数据总线8位,地址总线2位,控制总线2位)传输给双向交换单元,根据地址总线片选从机,根据控制总线使能发送和接收。
只要从机能够把fifo中的数据取完,并返回。
则给出握手信号
3,从机相当于UART发送接收机。
当控制单元接收到到从机信号时,给出握手信号给主机,使得传输线有效。
三、工作原理
四、系统框图
五、主要模块说明
1、UART模块
2、串并转换模块
3.FIFO模块
六、仿真结果及说明
七、资源报告
八、设计总结
九、源代码
8位串行数据排序设计
一、设计要求
设计一个电路实现以下功能:
(1)前8个时钟周期从数据输入端口依次输入8个不同大小的数据,数据为8位无符号数。
(2)从第9个时钟周期开始从大到小依次将前8个时钟周期输入的数据输出。
(3)到第16个时钟周期时输出完毕,开始接受下一轮数据输入。
要求:
A、尽量使用最少资源实现,同时最大限度提高处理速度。
B、设计合理的接口握手信号。
C、在设计报告中详细阐述设计思想并给出功能验证方案、验证结果、综合报告、时序分析在内的对电路设计的综合分析。
二、设计思路及实现方案
前8个时钟握手信号(isen)拉高,代表输入数据有效。
每一个时钟内将输入的数据和之前的已经排好顺序的数据进行比较大小,按从大到小的顺序分别存放到8个寄存器中;后8个时钟依次对数据从大到小输出。
比较大小的方法:
采用类似于二分法的方式,对输入数据先和已排好数据列的中间值比较,再分情况取其中某一段的中间数据比较。
举其中需要比较最多的一种情况经行讨论:
数据八d8和已有的d1——d7比较,d1到d7是已经排好序的从大到小的数,d8先和d4比较,再和d2、d6比较,最后和d1、d3、d5、d7比较,这样最多只需要3级比较就可以完成每一个时钟的比较,有利于提高电路的运行速度。
三、工作原理
电路采用时序设计,按要求每16个时钟周期完成一次数据的输入、比较、输出,比较大小采用8位的比较器来实现,根据输入数据的数量,我们最多采用3级数据比较完成每前8个时钟周期的比较,后8个时钟周期依次输出数据。
四、系统框图
4.1系统结构图
4.2状态转换图
前8个状态代表数据输入和大小比较,后8个状态代表数据输出;
五、主要模块说明
顶层模块3个输入,一个输出,握手信号放在内部,采用一个寄存器isen控制。
六、仿真结果及说明
从图中可以看到,当握手信号为低的时候,代表此时数据输入无效,输出端显示上一回合的排序结果,从图中可以看到,输出为23,22,21,20,19,18,17,16,排序正确;当握手信号为高的时候,代表此时数据输入有效,电路对输入的数据进行排序,而输出维持在0,从图中看到,这次输入的数据位32——39,而这几个数据在8个时钟周期后降序输出了,39,38,37,36……
七、资源报告
7.1RTL级图:
7.2资源利用表
7.3时序总结
报告显示,该电路可以达到260m,能较好地实现要求
八、设计总结
本设计采用过了仿顺序操作的方式,利用了16个时钟周期完成了数据输入、大小比较、数据输出。
大小比较中,我们采用了二分法的思想,可以利用最多3级比较,更快地实现了数据的比较,增加了时钟频率。
最后报告显示,设计总共用了88个寄存器,电路速度可以达到260m,结果理想。
九、源代码
9.1设计代码
`timescale1ns/1ps
//////////////////////////////////////////////////////////////////////////////////
//Company:
//Engineer:
//
//CreateDate:
09:
30:
0805/22/2015
//DesignName:
//ModuleName:
queue8
//ProjectName:
//TargetDevices:
//Toolversions:
//Description:
//
//Dependencies:
//
//Revision:
//Revision0.01-FileCreated
//AdditionalComments:
//
//////////////////////////////////////////////////////////////////////////////////
modulequeue8(clk,rstn,pin,pout
);
inputclk;
inputrstn;
input[7:
0]pin;
outputpout;
reg[7:
0]pout;
reg[3:
0]i;
regisen;
reg[7:
0]d1;
reg[7:
0]d2;
reg[7:
0]d3;
reg[7:
0]d4;
reg[7:
0]d5;
reg[7:
0]d6;
reg[7:
0]d7;
reg[7:
0]d8;
always@(posedgeclkornegedgerstn)begin
if(!
rstn)begin
//reset
pout<=8'd0;
i<=4'b0;
isen<=1'b1;
end
else
case(i)
0:
if(isen)begin
i<=i+1'b1;
d1<=pin;
pout<=7'b0;
end
1:
if(isen)begin
i<=i+1'b1;
if(pin>=d1)begin
d1<=pin;
d2<=d1;
end
elsebegin
d2<=pin;
end
end
2:
if(isen)begin
i<=i+1'b1;
if(pin>=d1)begin
d1<=pin;
d2<=d1;
d3<=d2;
end
elseif(pin>=d2)begin
d2<=pin;
d3<=d2;
end
else
d3<=pin;
end
3:
if(isen)begin
i<=i+1'b1;
if(pin>=d2)begin
if(pin>=d1)begin
d1<=pin;
d2<=d1;
d3<=d2;
d4<=d3;
end
elsebegin
d2<=pin;
d3<=d2;
d4<=d3;
end
end
elseif(pin>=d3)begin
d3<=pin;
d4<=d3;
end
else
d4<=pin;
end
4:
if(isen)begin
i<=i+1'b1;
if(pin>=d2)begin
if(pin>=d1)begin
d1<=pin;
d2<=d1;
d3<=d2;
d4<=d3;
d5<=d4;
end
elsebegin
d2<=pin;
d3<=d2;
d4<=d3;
d5<=d4;
end
end
elseif(pin>=d3)begin
d3<=pin;
d4<=d3;
d5<=d4;
end
elseif(pin>=d4)begin
d4<=pin;
d5<=d4;
end
else
d5<=pin;
end
5:
if(isen)begin
i<=i+1'b1;
if(pin>=d3)begin
if(pin>=d2)begin
if(pin>=d1)begin
d1<=pin;
d2<=d1;
d3<=d2;
d4<=d3;
d5<=d4;
d6<=d5;
end
elsebegin
d2<=pin;
d3<=d2;
d4<=d3;
d5<=d4;
d6<=d5;
end
end
elsebegin
d3<=pin;
d4<=d3;
d5<=d4;
d6<=d5;
end
end
elseif(pin>=d4)begin
d4<=pin;
d5<=d4;
d6<=d5;
end
elseif(pin>=d5)begin
d5<=pin;
d6<=d5;
end
elsebegin
d6<=pin;
end
end
6:
if(isen)begin
i<=i+1'b1;
if(pin>=d3)
if(pin>=d2)
if(pin>=d1)begin
d1<=pin;
d2<=d1;
d3<=d2;
d4<=d3;
d5<=d4;
d6<=d5;
d7<=d6;
end
elsebegin
d2<=pin;
d3<=d2;
d4<=d3;
d5<=d4;
d6<=d5;
d7<=d6;
end
elsebegin
d3<=pin;
d4<=d3;
d5<=d4;
d6<=d5;
d7<=d6;
end
elsebegin
if(pin>=d5)
if(pin>=d4)begin
d4<=pin;
d5<=d4;
d6<=d5;
d7<=d6;
end
elsebegin
d5<=pin;
d6<=d5;
d7<=d6;
end
elseif(pin>=d6)begin
d6<=pin;
d7<=d6;
end
elsebegin
d7<=pin;
end
end
end
7:
if(isen)begin
i<=i+1'b1;
isen<=0;
if(pin>=d4)begin
if(pin>=d2)
if(pin>=d1)begin
d1<=pin;
d2<=d1;
d3<=d2;
d4<=d3;
d5<=d4;
d6<=d5;
d7<=d6;
d8<=d7;
end
elsebegin
d2<=pin;
d3<=d2;
d4<=d3;
d5<=d4;
d6<=d5;
d7<=d6;
d8<=d7;
end
elseif(pin>=d3)begin
d3<=pin;
d4<=d3;
d5<=d4;
d6<=d5;
d7<=d6;
d8<=d7;
end
elsebegin
d4<=pin;
d5<=d4;
d6<=d5;
d7<=d6;
d8<=d7;
end
end
elseif(pin>=d6)begin
if(pin>=d5)begin
d5<=pin;
d6<=d5;
d7<=d6;
d8<=d7;
end
elsebegin
d6<=pin;
d7<=d6;
d8<=d7;
end
end
elseif(pin>=d7)begin
d7<=pin;
d8<=d7;
end
elsebegin
d8<=pin;
end
end
8:
begin
i<=i+1;
pout<=d1;
end
9:
begin
i<=i+1;
pout<=d2;
end
10:
begin
i<=i+1;
pout<=d3;
end
11:
begin
i<=i+1;
pout<=d4;
end
12:
begin
i<=i+1;
pout<=d5;
end
13:
begin
i<=i+1;
pout<=d6;
end
14:
begin
i<=i+1;
pout<=d7;
end
15:
begin
i<=4'b0;
isen<=1;
pout<=d8;
end
endcase
end
endmodule
9.2测试代码
`timescale1ns/1ps
modulequeue_tb;
//Inputs
regclk;
regrstn;
reg[7:
0]pin;
//Outputs
wire[7:
0]pout;
queue8uut(
.clk(clk),
.rstn(rstn),
.pin(pin),
.pout(pout)
);
initialbegin
//InitializeInputs
clk=0;
rstn=1;
pin=0;
#50rstn=0;
#120rstn=1;
#3000$stop;
end
always#(25)clk=~clk;
always@(negedgeclk)
begin
if(!
rstn)
pin=8'b0;
else
pin=pin+1'b1;
end
endmodule