数字集成电路课程设计报告通讯集成电路.docx
- 文档编号:15419559
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:48
- 大小:1.25MB
数字集成电路课程设计报告通讯集成电路.docx
《数字集成电路课程设计报告通讯集成电路.docx》由会员分享,可在线阅读,更多相关《数字集成电路课程设计报告通讯集成电路.docx(48页珍藏版)》请在冰点文库上搜索。
数字集成电路课程设计报告通讯集成电路
集成电路设计
课程设计报告
题目:
E1数据存储和读取
院系:
电子工程学院
专业班级:
学号:
姓名:
导师姓名:
报告日期:
设计概述
E1数据存储和读取
1.1设计任务
本设计用电路实现把输入的E1数据码流0到31数据顺序写入双口RAM中,以字节的形式输入,时钟频率为256KHz,并以0到31循环写,然后把数据分为4组,即:
0481216202428
1591317212529
26101418222630
37111519232731
每组以64KHz频率按31到0的顺序均匀循环连续输出。
1.2设计目的
本设计主要实现E1数据的存储和读取,实现通信系统中数据的转换和传输。
这里我们只涉及到一路的E1数据流。
1.3使用软件及环境设备
本设计主要在windows环境下实现详细设计,在lniux环境下实现仿真,综合和STA。
使用的软件如下
1)Modelsim6.1实现VerilogHDL语言的设计和仿真。
2)Synopsys公司的软件有:
NC-Verilog实现功能仿真和时序仿真;
DC实现逻辑综合;
PT实现静态时序分析。
1.设计方案
本设计要求完成E1数据的存储和读取。
根据要求,我们绘出顶层框图。
图17顶层框图
引脚
功能
clk
系统时钟设定为(4096MHz)
rst
系统复位信号
E1
输入数据,一位二进制位
Data_out[7:
0]
E1数据输出,八位二进制位
表9top引脚定义
2.设计定义
根据设计需求,本设计共分为:
时钟模块(div):
用来提供整个系统中的各种时钟信号;
数据转换模块(data_change):
将串行数据转换为8位的并行数据,便于存储了转发;
双口RAM模块(ram_double):
用来存储数据流中的数据,双口RAM便于存储和读取,此处我们设计的RAM的读写使用的是一个时钟,即同步的RAM;
读地址模块(rd_add):
用来提供读取数据的地址,从RAM中读出要输出的数据;
写地址模块(wr_add):
用来产生存储到RAM的地址;
数据选择模块(choice):
用来产生分组信息,将相应的数据按要求存放到相应的FIFO中;
FIFO模块:
将数据存储按要求分为四组,FIFO用来存储这四组数据;
比较输出模块(compare):
将FIFO中的数据按照要求顺序输出。
共八个模块。
模块结构关系如下图所示:
3.1分频模块(div)
功能描述:
本模块完成系统时钟(4096MHz)的分频,分别产生2048MHz,512MHz,256MHz的时钟。
电路设计框图:
图1分频模块框图
引脚定义:
div模块
引脚
功能
I/O
clk
主时钟
I
rst
复位信号
I
clk_2048
二分频时钟
O
clk_512
八分频时钟
O
clk_256
16分频时钟
O
表1分频模块引脚定义
时序图
图2分频模块时序图
3.2数据转换模块(data_change)
功能描述:
本模块实现把一位的二进制数转换成八位的二进制数。
当sign信号有效时,读出数据。
电路设计框图:
图3数据转换模块框图
引脚定义:
data_change模块
引脚
功能
I/O
E1
数据流输入
I
clk
时钟信号,系统时钟
I
rst
复位信号
I
data_out[7:
0]
数据转换为八位格式
O
表2数据转换模块引脚定义
时序图:
图4数据转换模块时序图
3.3双口RAM模块(ram_double)
功能描述:
本模块实现数据存储和读取。
电路设计框图:
图5RAM模块框图
引脚定义:
ram_double模块
引脚
功能
I/O
wr_en
写使能
I
wr_add
写地址
I
rd_add
读地址
I
data[7:
0]
数据存入RAM
I
q[7:
0]
数据读出RAM
O
表3RAM模块引脚定义
时序图:
图6RAM模块时序图
3.4读地址模块(Rd_add)
功能描述:
本模块实现对ram_double模块读数据的地址的操作。
电路设计框图:
图7rd_add模块框图
rd_add模块
引脚
功能
I/O
clk
时钟信号(2048)
I
rst
复位信号
I
rd_en
读使能信号
I
rd_add[5:
0]
读地址信号
O
表4引脚定义:
表7rd_add模块引脚定义
时序图:
图8rd_add模块时序图
3.5写地址模块(wr_add)
功能描述:
本模块实现对ram_double模块写数据的地址的操作。
电路设计框图:
图9wr_add模块框图
引脚定义:
wr_add模块
引脚
功能
I/O
clk
时钟信号(2048)
I
rst
复位信号
I
wr_en
写使能信号
I
wr_add[5:
0]
写地址信号
O
表5wr_add模块引脚定义
时序图:
图10wr_add模块时序图
3.6数据选择模块(choice)
功能描述:
本模块实现对ram读出的数据进行分别存储到四个FIFO(0-3)里,以便并行输出。
电路设计框图:
图11choice模块框图
引脚定义:
choice模块
引脚
功能
I/O
data_in[7:
0]
RAM输出数据
I
full[3:
0]
判断FIFO(0-3)信号
I
rdadress[5:
0]
读地址信号
I
clk
时钟信号(256)
I
表6choice模块引脚定义
时序图:
图12choice模块时序图
3.7FIFO模块
功能描述:
本模块实现数据的缓存功能功能。
电路设计框图:
图13FIFO模块框图
引脚定义:
FIFO模块
引脚
功能
I/O
clk
时钟信号
I
rst
复位信号
I
rdeq
读使能信号
I
wreq
写使能信号
I
data_in[7:
0]
数据输入信号
I
data0_out[7:
0]
数据输出信号
O
full
控制信号
O
表7FIFO模块引脚定义
时序图:
图14FIFO模块时序图
3.8比较输出模块(compare)
功能描述:
本模块实现四组数据的输出。
每组以64KHz频率按31到0的顺序均匀循环连续输出。
电路设计框图:
图15compare模块框图
引脚定义:
compare模块
引脚
功能
I/O
clk
时钟信号
I
rst
复位信号
I
flag[3:
0]
控制信号
I
data_in0[7:
0]
数据输入信号
I
data_in1[7:
0]
数据输入信号
I
data_in2[7:
0]
数据输入信号
I
data_in3[7:
0]
数据输入信号
I
data0_out[7:
0]
数据输出信号
O
表8compare模块引脚定义
时序图:
图16compare模块时序图
3.综合电路图
4.设计流程及结果
5.1设计输入
电路设计,顶层、各子模块的设计源代码
1)顶层设计代码:
moduleinformation(clk,rst,data_E1,data_out);
inputclk;
inputrst;
inputdata_E1;
output[7:
0]data_out;
wireclk_2048,clk_256,clk_512;
wire[5:
0]rdaddress;
wirewren;
wire[5:
0]wraddress;
wire[7:
0]data_change;
wire[3:
0]full;
wire[3:
0]flag;
wire[7:
0]data0,data1,data2,data3;
wire[3:
0]empty;
wire[7:
0]data_out0,data_out1,data_out2,data_out3;
wire[7:
0]data_ram;
divmydiv(.clk(clk),.rst(rst),.clk_2048(clk_2048),
.clk_256(clk_256),.clk_512(clk_512));
rd_addmyrd_add(.clk(clk_2048),.rst(rst),
.rd_add(rdaddress),.rden(wren));
wr_addmywr_add(.clk(clk_2048),.rst(rst),
.wren(wren),.wr_add(wraddress));
data_changemydata_change(.data(data_E1),.clk(clk),.rst(rst),
.data_out(data_change),.sign(wren));
choicemychoice(.clk(clk_256),.rst(rst),.flag(flag),
.data_in(data_ram),.rdaddress(rdaddress),
.data0(data0),.data1(data1),.data2(data2),
.data3(data3),.full(full),.rden(wren));
comparemycompare(.clk(clk_256),.rst(rst),.flag(flag[0]),
.data_in0(data_out0),.data_in1(data_out1),
.data_in2(data_out2),.data_in3(data_out3),
.data_out(data_out));
fifo123myfifo0(.clk(clk_512),.data_in(data0),.rdreq(flag[0]),
.wrreq(flag[0]),.empty(empty[0]),.full(full[0]),
.data_out(data_out0),.rst(rst));
fifo123myfifo1(.clk(clk_512),.data_in(data1),.rdreq(flag[0]),
.wrreq(flag[1]),.empty(empty[1]),.full(full[1]),
.data_out(data_out1),.rst(rst));
fifo123myfifo2(.clk(clk_512),.data_in(data2),.rdreq(flag[0]),
.wrreq(flag[2]),.empty(empty[2]),.full(full[2]),
.data_out(data_out2),.rst(rst));
fifo123myfifo3(.clk(clk_512),.data_in(data3),.rdreq(flag[0]),
.wrreq(flag[3]),.empty(empty[3]),.full(full[3]),
.data_out(data_out3),.rst(rst));
ram_double2myram_double(.clock_wr(clk_2048),.clock_rd(clk_2048),
.data(data_change),.rdaddress(rdaddress),
.wraddress(wraddress),.wren(wren),
.q(data_ram));
Endmodule
2)个子模块代码:
modulechoice(clk,rst,data_in,rdaddress,data0,data1,data2,data3,flag,full,rden);
inputrden;
input[7:
0]data_in;
input[5:
0]rdaddress;
inputclk,rst;
input[3:
0]full;
outputreg[3:
0]flag;
outputreg[7:
0]data0,data1,data2,data3;
wire[5:
0]rd_add;
assignrd_add=rdaddress+1'b1;
always@(posedgeclkornegedgerst)begin
if(!
rst)begin
flag<=4'b0;
data0<=8'd0;
data1<=8'd0;
data2<=8'b0;
data3<=8'b0;
end
elsebegin
case(rd_add[1:
0])
2'b00:
begin
if(!
full[0])begin
flag<=4'b0001;
data0<=data_in;
end
elsedata0<=data0;
end
2'b01:
begin
if(!
full[1])begin
flag<=4'b0010;
data1<=data_in;
end
elsedata1<=data1;
end
2'b10:
begin
if(!
full[2])begin
flag<=4'b0100;
data2<=data_in;
end
elsedata2<=data2;
end
2'b11:
begin
if(!
full[3])begin
flag<=4'b1000;
data3<=data_in;
end
elsedata3<=data3;
end
default:
begin
flag<=4'b0;
end
endcase
end
end
endmodule
modulecompare(clk,rst,flag,data_in0,data_in1,data_in2,data_in3,data_out);
inputclk;
inputflag;
inputrst;
input[7:
0]data_in0,data_in1,data_in2,data_in3;
outputreg[7:
0]data_out;
reg[7:
0]ram[3:
0];
always@(posedgeclkornegedgerst)begin
if(!
rst)begin
ram[3]<=8'b0;
ram[2]<=8'b0;
ram[1]<=8'b0;
ram[0]<=8'b0;
end
elsebegin
if(flag==1'b1)begin
ram[3]<=data_in3;
ram[2]<=data_in2;
ram[1]<=data_in1;
ram[0]<=data_in0;
end
elsebegin
ram[3]<=ram[3];
ram[2]<=ram[2];
ram[1]<=ram[1];
ram[0]<=ram[0];
end
end
end
reg[1:
0]counter;
always@(posedgeclkornegedgerst)begin
if(!
rst)begin
data_out<=8'b0;
counter<=2'd1;
end
elsebegin
counter<=counter-1'b1;
data_out<=ram[counter];
end
end
endmodule
moduledata_change(data,clk,rst,data_out,sign);
inputclk,rst,data;
outputreg[7:
0]data_out;
outputsign;
reg[2:
0]count;
regsign;
always@(posedgeclkornegedgerst)
begin
if(!
rst)
begin
count<=3'b000;
sign<=1'b0;
end
else
begin
count<=count+3'b001;
if(count==3'b111)
begin
sign<=1'b1;
count<=3'b000;
end
else
sign<=1'b0;
end
end
always@(posedgeclkornegedgerst)begin
if(!
rst)begin
data_out<=8'b0;
end
elsebegin
data_out[0]<=data;
data_out[7:
1]<=data_out[6:
0];
end
end
endmodule
modulediv(clk,rst,clk_2048,clk_256,clk_512);
inputclk;
inputrst;
outputregclk_2048;
outputregclk_256;
outputregclk_512;
reg[1:
0]counter_8;
reg[2:
0]counter_16;
always@(posedgeclkornegedgerst)begin
if(!
rst)begin
counter_8<=3'b0;
clk_512<=1'b0;
end
elsebegin
counter_8<=counter_8+1'b1;
if(counter_8==2'd3)begin
clk_512<=~clk_512;
counter_8<=3'b0;
end
end
end
always@(posedgeclkornegedgerst)begin
if(!
rst)begin
clk_2048<=1'b0;
end
elsebegin
clk_2048<=~clk_2048;
end
end
always@(posedgeclkornegedgerst)begin
if(!
rst)begin
counter_16<=3'b0;
clk_256<=1'b0;
end
elsebegin
counter_16<=counter_16+1'b1;
if(counter_16==3'd7)begin
clk_256<=~clk_256;
counter_16<=3'b0;
end
end
end
endmodule
modulefifo123(clk,rst,empty,full,wrreq,rdreq,data_in,data_out);
inputclk;
inputrst;
inputwrreq;
inputrdreq;
input[7:
0]data_in;
outputwireempty;
outputwirefull;
outputreg[7:
0]data_out;
regflag;
reg[2:
0]wrcnt;
reg[2:
0]rdcnt;
reg[7:
0]fifo[7:
0];
always@(posedgeclkornegedgerst)begin
if(!
rst)begin
rdcnt<=3'b0;
wrcnt<=3'b0;
data_out<=8'b0;
flag<=1'b0;
end
elsecase({wrreq,rdreq,full,empty})
4'b1000:
begin//write
fifo[wrcnt]<=data_in;
wrcnt<=wrcnt+1;
flag<=1'b1;
end
4'b1001:
begin//write
fifo[wrcnt]<=data_in;
wrcnt<=wrcnt+1;
flag<=1'b1;
end
4'b1101:
begin//write
fifo[wrcnt]<=data_in;
wrcnt<=wrcnt+1;
flag<=1'b1;
end
4'b0100:
begin//read
data_out<=fifo[rdcnt];
rdcnt<=rdcnt+1;
flag<=1'b0;
end
4'b0110:
begin//read
data_out<=fifo[rdcnt];
rdcnt<=rdcnt+1;
flag<=1'b0;
end
4'b1110:
begin//read
data_out<=fifo[rdcnt];
rdcnt<=rdcnt+1;
flag<=1'b0;
end
4'b1100:
begin//writeandread
fifo[wrcnt]<=data_in;
wrcnt<=wrcnt+1;
flag<=1'b1;
data_out<=fifo[rdcnt];
rdcnt<=rdcnt+1;
flag<=1'b0;
end
default:
begin
wrcnt<=wrcnt;
rdcnt<=rdcnt;
end
endcase
end
assignfull=(wrcnt==rdcnt)&flag;
assignempty=(wrcnt==rdcnt)&~flag;
endmodule
moduleram_double2(clock_wr,clock_rd,data,rdaddress,wraddress,wren,q);
inputclock_wr;
inputclock_rd;
input[7:
0]data;
input[5:
0]rdaddress;
input[5:
0]wraddress;
inputwren;
output[7:
0]q;
wireclock_wr;
wireclock_rd;
wire[7:
0]data;
wire[5:
0]rdaddress;
w
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字集成电路 课程设计 报告 通讯 集成电路
![提示](https://static.bingdoc.com/images/bang_tan.gif)