电子系统仿真与实现结题报告.docx
Harbin Institute of Technology电子系统方针与实现结题报告题 目:基于FPGA和SystemVue的模拟/数字混合系统设计与实现一 研究内容本设计使用了HDL和IP核设计技术实现了一个完整的ISE设计流程,在系统调试阶段,使用SystemVue对系统进行调试和验证。设计的主要研究内容为模拟转数字系统的实现,即通过运算放大器对交流信号进行放大,通过模/数转换器ADC,将模拟信号转换成数字信号,并在FPGA内经过运算处理后,得到所测量模拟信号的频率和幅度信息,并将这个信息显示在7段数码管上。二 基本原理及框图下图即为基于FPGA和SystemVue的模拟转数字系统的实现原理图。虚线内为FPGA内部完成的逻辑,使用Verilog语言编写。 FPGA主要实现的功能包括:(1) 分频器模块将外部提供的100MHz晶振时钟进行分频,为下列模块提供时钟驱动:1. 给串行ADC控制器提供驱动时钟;2. 给频率和幅度测量单元提供驱动时钟;3. 给7段数码管驱动显示逻辑提供驱动时钟。(2) 串行ADC控制器模块完成的功能包括:1. 为串行ADC提供驱动时钟和片选信号;2. 将ADC输出的串行数据转换成并行数据。(3) 频率和幅度测量单元模块主要完成的功能包括:1. 测量输入串行ADC的正弦模拟信号的频率值,并且将测量的频率值转换成BCD码;2. 测量输入串行ADC的正弦模拟信号的幅度值,并且将测量的幅度值转换成BCD码。(4) 2选1多路复用器,根据外部提供的选择信号,选择在7段数码管上显示幅度值或频率值。(5) 7段数码管驱动显示逻辑的功能包括:1. 提供7段数码管扫描电路2. 控制频率或幅度值正确的显示。从FPGA实现的功能可以看出,最重要的部分即串行ADC控制器模块,该模块功能是否正确执行关系到整个系统的可靠性,因此需要对该模块进行反复的测试与验证,从而达到设计要求。本设计采用SystemVue软件的HDL和Modelsim联合仿真功能对该设计进行仿真验证。具体的实现流程为:在元件库中选择硬件设计(Hardware Design),在硬件设计库中找到HDL Cosimulation模块并且将其添加到原理图中,双击该模块,将Verilog设计的所有子模块封装起来,这样会创建一个与设计的Verilog语言描述的功能完全一样的模块。连接好各模块并放置好信号源、接收器等后,点击Run Analyses,SystemVue会自动编译VHDL代码并调用Modelsim,所有在顶层实体的信号也将被添加到的ModelSim波形文件中,这样我们就可以观察仿真结果是否正确,从而验证程序的正确性。三 设计流程为保证串行ADC控制器模块设计功能的正确性,使用SystemVue中HDL联合Modelsim平台对该设计进行功能验证,在波形窗口上分析运行后的结果,对比采样得到的数据和转换后的并行数据是否符合设计要求。根据设计要求,FPGA内部逻辑采用状态机模式编写,下图为状态转换图:按照上图,完成Verilog程序的编写,程序代码如下:module ad ( CLK, RST, SDATA1, SDATA2, SCLK, nCS, DATA1, DATA2, START, DONE); input CLK; input RST; input SDATA1; input SDATA2; output SCLK; output nCS; output 11:0 DATA1; output 11:0 DATA2; input START; output DONE; / General usagewire SCLK; / User interface signalsreg nCS; reg 11:0 DATA1; reg 11:0 DATA2; reg DONE; / TYPE states:parameter states_Idle = 0;parameter states_ShiftIn = 1;parameter states_SyncData = 2;reg 1:0 current_state; reg 1:0 next_state; reg 15:0 temp1; reg 15:0 temp2; wire clk_div; reg 2:0 clk_counter; reg 3:0 shiftCounter; reg enShiftCounter; reg enParalelLoad; / -always (posedge RST or posedge CLK) begin : clock_divide if (RST = 1'b 1) begin clk_counter <= 3'b 000; end else begin clk_counter <= clk_counter + 1'b 1; end endassign clk_div = clk_counter2; assign SCLK = clk_counter2; / -always (posedge clk_div) begin : counter if (enShiftCounter = 1'b 1) begin temp1 <= temp114:0, SDATA1; temp2 <= temp214:0, SDATA2; shiftCounter <= shiftCounter + 1'b 1; end else if (enParalelLoad = 1'b 1 ) begin shiftCounter <= 4'b 0000; DATA1 <= temp111:0; DATA2 <= temp211:0; end end/ - always (posedge clk_div) begin : SYNC_PROC if (RST = 1'b 1) begin current_state <= states_Idle; end else begin current_state <= next_state; end endalways (current_state) begin : OUTPUT_DECODE if (current_state = states_Idle) begin enShiftCounter <= 1'b 0; DONE <= 1'b 1; nCS <= 1'b 1; enParalelLoad <= 1'b 0; end else if (current_state = states_ShiftIn ) begin enShiftCounter <= 1'b 1; DONE <= 1'b 0; nCS <= 1'b 0; enParalelLoad <= 1'b 0; / if current_state = SyncData then end else begin enShiftCounter <= 1'b 0; DONE <= 1'b 0; nCS <= 1'b 1; enParalelLoad <= 1'b 1; end endalways (current_state or START or shiftCounter) begin : NEXT_STATE_DECODE next_state <= current_state; / default is to stay in current state case (current_state) states_Idle: begin if (START = 1'b 1) begin next_state <= states_ShiftIn; end end states_ShiftIn: begin if (shiftCounter = 4'h F) begin next_state <= states_SyncData; end end states_SyncData: begin / if (START = 1'b 0) / begin next_state <= states_Idle; end end / default: begin next_state <= states_Idle; end endcase endendmodule / module AD1接下来进行SystemVue模拟,在元件库中选择硬件设计(Hardware Design),在硬件设计库中找到HDL Cosimulation模块并且将其添加到原理图中,双击该模块,如下图所示将写好的Verilog代码添加到模块中并添加引脚。值得注意的是,时钟信号clk可以不特意添加,使用SystemVue自带时钟会使设计更加简单,添加方法为在HDL Settings选项卡下的Optional Settings中添加clk时钟,其周期即为上方Iteration time中所添加的时间。设置完成后,点击OK选项,即生成了与所编译的Verilog语言功能完全一致的HDL模块,如下图所示:如下图所示为原理图的START输入信号部分,由一个方波信号发生器SquareGen组成;由于HDL模块的输入数据类型必须为fix,故添加一个数据类型转换器FloatToFxp,该转换器的功能是将方波信号发生器SquareGen发出的方波信号(数据类型为实信号real)转换为fix类型,可以作为HDL模块的输入:如下图所示为串行数据SDATA1和SDATA2的输入端,由一个随机数发生器RandomBits和一个数据类型转换器FloatToFxp组成;如下图所示为HDL模块清零使能RST信号的输入端,在本设计中默认为高电平。最后,在输出端口添加接收器Sink,完成整个电路的设计,如下图所示:四 仿真结果与分析进行串并转换后的仿真结果如下图所示:可以看出该模块将串行输入数据转化为12位的并行数据,之后可以再进行各种数据处理,如计算输入数据的幅度值和频率等,这些就较为简单且不再属于SystemVue的范畴,故略去。