SOC实验设计报告

  • 格式:doc
  • 大小:847.00 KB
  • 文档页数:26

soc实验设计报告一、实验时间:2010.5.24——2010.6.12二、实验目的:通过独立地完成一个数字系统的VHDL/V erilog HDL描述和利用SYNOPSYS 的VHDL/V erilog HDL仿真环境对这一描述进行仿真并进行综合,完整的从事一个数字VLSI 系统的设计过程,理解和掌握现代集成电路的设计流程,硬件描述语言,综合理论等高层次设计方法以及它和物理实现之间的关系。

巩固在理论课阶段学习的相关知识。

三、实验设备和系统实验中代码的编写和仿真是在modelsim中完成的,使用的是modelsim se 6.5b的版本。

实验的综合是在quartus9.0中完成的。

四、实验内容设计一个数字信号处理器系统,其功能为:在8位微控Intel8051的控制下对输入信号进行数字滤波处理并根据输入数据的大小产生一组控制液晶板的显示。

工作过程如下:1.系统框图(1)Intel8051是微处理器;(2)TH99CHLS是要实现的系统;(3)Display是一个液晶显示板。

它包括三个显示区:一个时间显示区,一个数字显示区和一个由16个小方块组成的信号幅度显示,其结构见下图所示。

对应的管脚接高电平时,液晶板上的线段显示;接低电平时,线段消失。

2.工作过程(1)在外部信号PEbar的控制下,芯片从端口in读入一个八位数据;(2)在(1)中输入的数据与微处理器给出的另一个八位数据进行按位“与”操作;(3)在(2)中处理过的数据经数字滤波后从端口out输出;(4)TH98CHLS内部产生一组时间信号,包括时和分,其格式为:(hh:mm)。

这组时间信号的初始值由微处理器给出,微处理器可以随时对时间信号进行修改;(5)送往液晶显示板的信号有三组:a. (4)中产生的时间信号,经七段译码后从端口hour和minute出;b. (3)中经数字滤波的信号,在转换成十进制并做七段译码后,百位经端口d00,十位经端口d10,个位经端口d01送出;c. (3)中经数字滤波的信号,在经过xy 压缩后通过端口ap送出;五、数据通道由滤波器公式可知采用通常的调配方法,用四个步长来实现。

如图所示:这样的方法虽然可行,但资源的使用太大,需要7个乘法器和3个加法器,同时逻辑综合后也会消耗很大的面积和功耗,为了提高资源的利用效率,我们需要对数据通路和控制器重新设计,尽量减少资源数量,同时在速度和代价上做出相应的优化。

由于公式中的描述乘法器过多而牺牲了很大的代价,在设计中,先以减少乘法器为目的,但如果只采用一个乘法器,控制步又变得相对冗长,所以,在这个实验中,采用6个时钟步长,根据“基于距离”的资源调配方法,实现算子的调度与资源的调配,同时,对寄存器也进行了优化,使得其采用更少的寄存器。

资源分配的优化如下图所示:上图采用6个步长,资源包括:乘法器M1、M2,加法器A1、A2,寄存器:r1、r2、r3、r4。

当然使用6个步长较上一种方案可能速度上有所牺牲,但带来了寄存器代价和资源代价的很大改善。

六、控制码简化及控制器的实现控制码的位数为15,分别为C0…C14,每一步控制码的状态如下表所示:控制步C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C141 0 0 0 0 0 0 0 X X 0 1 1 1 1 12 1 0 1 0 1 0 1 0 0 0 1 1 1 1 13 0 1 0 1 0 1 0 1 X X 0 1 1 0 14 1 1 1 1 1 1 1 1 X X 0 1 1 0 15 1 1 1 1 X X X X 1 1 1 1 0 1 06 X X X X X X X X X X 1 0 0 0 1根据上表,C0C2C4C6C10和C1C3C5C7C8C9分别可以简化,控制码优化后如下表所示:控制步C0 C1 C11 C12 C13 C141 0 0 1 1 1 12 1 0 1 1 1 13 0 1 1 1 0 14 0 1 0 0 1 15 1 1 1 0 1 0 6111七、系统设计根据实验要求,首先进行系统功能划分,我们将系统划分为四个模块,分别是系统接口模块、时钟产生模块、数字滤波器模块和显示模块。

(1)接口模块(v .vin )该模块前端与Intel8051相连,主要负责与单片机Intel8051之间的通信,接收单片机给出的数据。

后端分别与时钟产生模块和数字滤波器模块相连,主要负责为这两个模块提供相应数据。

在代码中,该模块所对应的名字是v .vin ,相对应的测试模块是vin_test.v (2)时钟产生模块(time_generate.v )该模块前端与接口模块相连,从接口模块得到时钟计时的初始值,包括小时和分钟的具体数值,时钟产生模块在这个值的基础上继续时钟的变化,并且将这种变化实时变化的时钟具体数值送到输出端口。

在代码中,该模块对应的名字是time_generate.v ,相应的测试模块是time_gen_test.v(3)数字滤波器模块(filter_opt.v )该模块前端与接口模块相连,从接口模块获得滤波器的系数b0,b1,b2,b3,b4,b5,b6以及要进行数字滤波的数据。

滤波器所用到的转移函数为:6655443322110FIRB B B B B B B (Z)HB------++++++=zzzzzz,其中0B ——6B 均由微处理器给出。

在代码中,该模块对应的名字是filter_opt.v ,相应的测试代码是filter_opt_test.v(4)显示模块(display.v )该模块前端与时钟产生模块和数字滤波器模块相连,从这两个模块获得要显示的数据信息,后端直接与液晶屏相连接,通过一系列内部数据转换,将要显示的数据转换为直接控制相应液晶引脚的信号,驱动液晶显示所要显示的信息。

在代码中,该模块对应的名字是display.v ,相应的测试文件时display_test.v另外还有一个顶层模块,也就是将以上四个模块相互连接封装成一个整体。

在代码中,顶层模块对应的名字是top.v ,相应的测试文件时top_test.v其中接口部分根据实验要求中的Intel8051协议,分别从处理器及输入接口读取一组数 据输出到滤波器模块和时钟发生器中;而微处理器给出的时间通过时钟发生器再输出到显示 模块中;同样,数字滤波器的输出值,经过压缩输出到显示模块中,这个的开方根的实现运 用简单的查表法。

八、各个模块的代码编写及仿真结果 (1)接口模块(v .vin )module vin(clk,rst_n,pebar,wbar,cs,ale, abus,dbus,vin,hr_en,mt_en,b0,b1,b2,b3,b4,b5,b6,hour,minute,xn_0,xn_1,xn_2,xn_3,xn_4,xn_5,xn_6); input clk,rst_n,pebar,wbar,cs,ale;input[7:0] abus,dbus,vin;output reg hr_en,mt_en;output reg [5:0] hour;output reg [7:0] minute;output reg [7:0] b0,b1,b2,b3,b4,b5,b6;output reg [7:0] xn_0,xn_1,xn_2,xn_3,xn_4,xn_5,xn_6; reg[15:0] addr;always@(negedge ale)beginif(cs==0)beginaddr[15:8]<=abus;addr[7:0]<=dbus;endendalways@(posedge clk)beginif(rst_n==0)beginb0<=0;b1<=0;b2<=0;b3<=0;b4<=0;b5<=0;b6<=0;hour<=0;hr_en<=0;minute<=0;mt_en<=0;xn_0<=0;xn_1<=0;xn_2<=0;xn_3<=0;xn_4<=0;xn_5<=0;xn_6<=0;endelse if((cs==0)&(ale==0)&(wbar))begincase(addr[3:0])4'b0000:b0<=dbus;4'b0001:b1<=dbus;4'b0010:b2<=dbus;4'b0011:b3<=dbus;4'b0100:b4<=dbus;4'b0101:b5<=dbus;4'b0110:b6<=dbus;4'b0111:begin hour<=dbus;hr_en<=1;end4'b1000:begin minute<=dbus;mt_en<=1;endendcaseendelse if(pebar==1)beginxn_0<=vin;xn_1<=xn_0;xn_2<=xn_1;xn_3<=xn_2;xn_4<=xn_3;xn_5<=xn_4;xn_6<=xn_5;endendendmodule接口测试模块(vin_test.v)`timescale 1ns/1nsmodule vin_test;reg clk,rst_n,pebar,wbar,cs,ale;reg[7:0] abus,dbus,vin;wire hr_en,mt_en;wire[5:0] hour;wire[7:0] minute;wire[7:0] b0,b1,b2,b3,b4,b5,b6;wire[7:0] xn_0,xn_1,xn_2,xn_3,xn_4,xn_5,xn_6;initialbeginclk=0;rst_n=1;pebar=0;wbar=1;cs=1;ale=0;abus=8'b00000011;dbus=8'b00000111;vin=8'b00010101;#30 rst_n=0;#40 rst_n=1;#20 cs=0;#20 ale=1;#20 ale=0;#20 dbus=8'b00100010;#20 wbar=0;#20 wbar=1;#20 pebar=1;#20 pebar=0;endalways #10 clk=~clk;vin vin_0(.clk(clk),.rst_n(rst_n),.pebar(pebar),.wbar(wbar),.cs(cs),.ale(ale),.abus(abus),.dbus(dbus),.vin(vin),.hr_en(hr_en),.mt_en(mt_en),.b0(b0),.b1(b1),.b2(b2),.b3(b3),.b4(b4),.b5(b5),.b6(b6),.hour(hour),.minute(minute),.xn_0(xn_0),.xn_1(xn_1),.xn_2(xn_2),.xn_3(xn_3),.xn_4(xn_4),.xn_5(xn_5),.xn_6( xn_6));endmodule仿真结果:从仿真图上可以看出,当cs为低电平且ale为高电平时,数据线上携带的是地址信息,程序执行addr[15:8]<=abus;addr[7:0]<=dbus的操作。