1 / 32

作者:何小威 齐树波 胡冰 王淼 时间: 2004.12-2005.1

连续输入数据处理 Greatest Common Divisor --- 最大公约数 Combined adder and subtractor --- 组合加法器. 作者:何小威 齐树波 胡冰 王淼 时间: 2004.12-2005.1. 连续输入数据处理. 题目 设计思想 FSM 状态图 程序及测试代码 仿真结果 综合分析 设计感悟. 对题目的几点说明. 1 ,当 Start 信号变为低的时候,表示输入数 据无效,系统回到初始状态。 2 ,当 Rst 信号变为低的时候,系统复位。

Download Presentation

作者:何小威 齐树波 胡冰 王淼 时间: 2004.12-2005.1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 连续输入数据处理Greatest Common Divisor ---最大公约数Combined adder and subtractor ---组合加法器 作者:何小威 齐树波 胡冰 王淼 时间:2004.12-2005.1

  2. 连续输入数据处理 • 题目 • 设计思想 • FSM状态图 • 程序及测试代码 • 仿真结果 • 综合分析 • 设计感悟

  3. 对题目的几点说明 • 1,当Start信号变为低的时候,表示输入数 据无效,系统回到初始状态。 • 2,当Rst信号变为低的时候,系统复位。 • 3,数据输入的过程中,系统可以在任意时刻复位。 • 4,输入数据人为地不超过20个。

  4. 基本设计思想概述 • 时序题目,有结果的输出延时问题。 • 根据具体的性能要求来决定是在数据输入结束后立刻流出结果,还是允许延时若干时钟周期后再流出结果,在我们小组的设计中,采取尽快流出结果的设计方式。 • 数据一边输入一边处理,充分利用乘法器和加法器,通过状态图控制结果输出选择。

  5. 将逻辑表达式改写 • Y4=x1*(x2+x3+x4)+x2*(x3+x4)+x3*x4 • Y3=x1*(x2+x3)+x2*x3 • 考虑使用两个数据通路同时对输入数据进行处理,最后由数据选择器选择输出结果 • 如下图

  6. 各站的描述

  7. FSM图示描述

  8. 程序描述部分 • FSM控制部分 • 数据通路部分 • 结果输出部分

  9. 9个状态采用4位格雷码定义 • 以下是FSM控制流程 • always@(present_state or Serial_in) • begin • case(present_state) • State0: //initial process • begin • Sel=3'b000; • if(!Serial_in) • Next_state=State0; • else • Next_state=State1; // state jump • end • State1: • begin • if(!Serial_in) • Next_state=StateY; • else • Next_state=State2; • end

  10. State2: begin • if(!Serial_in) • Next_state=StateY; • else • Next_state=State3; • end • State3 : begin • if(!Serial_in) • Next_state=StateY3; • else • Next_state=State4; • end • State4: • begin • if(!Serial_in) • Next_state=StateY4; • else • Next_state=State5; • end • State5: • begin • if(!Serial_in) • Next_state=StateY; • else • Next_state=State5; • end

  11. StateY: //output process • begin • Sel=3'b100; • Next_state=State0; • end • StateY3: • begin • Sel=3'b010; • Next_state=State0; • end • StateY4: • begin • Sel=3'b001; • Next_state=State0; • end • default: • Next_state=State0; • endcase • end

  12. 数据通路代码 • always@(posedge clk) • begin • if(!Rst) • begin • Z0<=8'b0; • Z4<=14'b0; • Z5<=19'b0; • Z6<=11'b0; • present_state<=State0; // state jump • end • else • begin • if(!Start) • begin • Z0<=8'b0; • Z4<=14'b0; • Z5<=19'b0; • Z6<=11'b0; • present_state<=State0; • end //Start=0 then jump to state • else • Z0<=Serial_in; Z4<=Z3; • Z5<=Z2; • Z6<=Z1; //inner register relation • present_state<=Next_state; • end • end

  13. 内部寄存器之间关系代码 • always@(Z0 or Z4 or Z5 or Z6 or Rst or Start) //data process • begin • if((!Rst)||(!Start)) • begin • Z1<=10'b0; • Z2<=18'b0; • Z3<=13'b0; • end • else • Z1<=Z0+Z6; • Z2<=Z0*Z6+Z5; • Z3<=Z0[7:4]*Z0[3:0]+Z4; • end

  14. 结果输出代码 • always@(Sel or Z0 or Z4 or Z5 or Z6) //output selection • case(Sel) • 3'b000: begin Y<=14'bz; Y3<=19'bz; • Y4<=18'bz; Done<= 1'b0; • end • 3'b100: begin Y<=Z4; Y3<=19'bz; • Y4<=18'bz; Done<= 1'b1; • end • 3'b010: begin Y<=14'bz; Y3<=Z5; Y4<=18'bz; • Done<= 1'b1; • end • 3'b001: begin Y<=14'bz; Y3<=19'bz; Y4<=Z5[17:0]; • Done<= 1'b1; • end • default: begin Y<=14'bz; Y3<=19'bz; Y4<=18'bz; • Done<= 1'b0; • end • endcase

  15. Testbanch部分测试码 • initial //initial process • begin • clk=1; Rst=0; Start=0; Serial_in=8'b0; #(0.1*Delay) Start=1; Rst=1; • #Delay Serial_in= 8'b0100_0010; • #Delay Serial_in= 8'b0001_0010; • #Delay Serial_in= 8'b1000_0010; • #(0.2*Delay) Rst=0; • #Delay Rst=1; • #(0.1*Delay) Serial_in= 8'b0010_0010; • #Delay Serial_in= 8'b0001_0100; • #Delay Serial_in= 8'b0000_0000; • #Delay Rst=0; • #Delay Rst=1; • #(2*Delay) Serial_in= 8'b0000_0101; • #Delay Serial_in= 8'b0001_0011; • #Delay Serial_in= 8'b0001_0010 • #Delay Serial_in= 8'b0000_0000; • #(10*Delay) $finish; • end

  16. 逻辑仿真波形比较 • ModelSim 5.8c进行功能仿真 • 根据前面的测试码的输入验证逻辑功能 • Serial_in= 8‘b0010_0010; Serial_in= 8'b0001_0100; Serial_in= 8‘b0000_0000; 按逻辑结果应为2*2+1*4=8 二进制结果应为:1000

  17. Serial_in= 8'b0000_0101; Serial_in= 8'b0000_0011; Serial_in= 8‘b0001_0010; Serial_in= 8‘b0000_0000; 按逻辑结果应为=5*3+5*18+3*18=159; 二进制结果应为:10011111

  18. Serial_in= 8'b0000_0010; Serial_in= 8'b0000_0011; Serial_in= 8'b0001_0000; Serial_in= 8'b0000_1011; Serial_in= 8'b0000_0000; • 逻辑结果应为:2*3+2*16+2*11+3*16+3*11+16*11=317 • 二进制应为:100111101

  19. Serial_in= 8'b0001_0010; Serial_in= 8'b0010_0011; Serial_in= 8'b0010_0100; Serial_in= 8'b0100_0111; Serial_in= 8'b0110_0101; Serial_in= 8'b0000_0000; 逻辑结果应为:1*2+2*3+2*4+4*7+6*5=74 二进制结果应为:1001010

  20. 综合得到RTL级电路图 • Software:Synplify pro 5.2 • Technology:Altera MAX9000 • Port: EPM9320 • Frequency:100MHz

  21. Technology view

  22. Simple logic gate equivalents: 159 • Register bits: 55 • I/O cells: 63 • Details: • A11DD: 2 • A12DD: 3 • A13DD: 1 • A14DD: 3 • A18DD: 1 • A4DD: 1 • A5DD: 1 • A6DD: 1 • SOFT: 1 • SYNLPM_LATRS1: 3 • S_DFF: 55 • and: 201 • false: 1 • inv: 33 • mux: 1 • tri: 50 • true: 1 • xor: 2

  23. 结果设计分析 • 1, 逻辑级数稍长,门级延时可能比较大 • 2,3个加法器,2个乘法器 • 3,4个数据选择器,3个三态门 • 4,4个D触发器 • 5,基本逻辑功能得到实现

  24. 另外一种方案 • 使用较多的寄存器,使用计数器来控制逻辑 • 代价是结果输出延时可能会比较大

  25. 几点设计感悟 • 1,很多的方面需要考虑,遇到了很多没有想到的问题,只有做过才会知道。For example,不同always语句中不能对同一个变量赋值,仿真没有错误,综合时才发现,恍然大悟。连续赋值和阻塞赋值不能写在一个循环里。 • 2,多请教一些牛人会有很大帮助 • 3,对仿真综合软件的使用参考一些书籍

  26. 多谢指点!

More Related