320 likes | 423 Views
连续输入数据处理 Greatest Common Divisor --- 最大公约数 Combined adder and subtractor --- 组合加法器. 作者:何小威 齐树波 胡冰 王淼 时间: 2004.12-2005.1. 连续输入数据处理. 题目 设计思想 FSM 状态图 程序及测试代码 仿真结果 综合分析 设计感悟. 对题目的几点说明. 1 ,当 Start 信号变为低的时候,表示输入数 据无效,系统回到初始状态。 2 ,当 Rst 信号变为低的时候,系统复位。
E N D
连续输入数据处理Greatest Common Divisor ---最大公约数Combined adder and subtractor ---组合加法器 作者:何小威 齐树波 胡冰 王淼 时间:2004.12-2005.1
连续输入数据处理 • 题目 • 设计思想 • FSM状态图 • 程序及测试代码 • 仿真结果 • 综合分析 • 设计感悟
对题目的几点说明 • 1,当Start信号变为低的时候,表示输入数 据无效,系统回到初始状态。 • 2,当Rst信号变为低的时候,系统复位。 • 3,数据输入的过程中,系统可以在任意时刻复位。 • 4,输入数据人为地不超过20个。
基本设计思想概述 • 时序题目,有结果的输出延时问题。 • 根据具体的性能要求来决定是在数据输入结束后立刻流出结果,还是允许延时若干时钟周期后再流出结果,在我们小组的设计中,采取尽快流出结果的设计方式。 • 数据一边输入一边处理,充分利用乘法器和加法器,通过状态图控制结果输出选择。
将逻辑表达式改写 • Y4=x1*(x2+x3+x4)+x2*(x3+x4)+x3*x4 • Y3=x1*(x2+x3)+x2*x3 • 考虑使用两个数据通路同时对输入数据进行处理,最后由数据选择器选择输出结果 • 如下图
程序描述部分 • FSM控制部分 • 数据通路部分 • 结果输出部分
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
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
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
数据通路代码 • 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
内部寄存器之间关系代码 • 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
结果输出代码 • 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
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
逻辑仿真波形比较 • ModelSim 5.8c进行功能仿真 • 根据前面的测试码的输入验证逻辑功能 • Serial_in= 8‘b0010_0010; Serial_in= 8'b0001_0100; Serial_in= 8‘b0000_0000; 按逻辑结果应为2*2+1*4=8 二进制结果应为:1000
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
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
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
综合得到RTL级电路图 • Software:Synplify pro 5.2 • Technology:Altera MAX9000 • Port: EPM9320 • Frequency:100MHz
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
结果设计分析 • 1, 逻辑级数稍长,门级延时可能比较大 • 2,3个加法器,2个乘法器 • 3,4个数据选择器,3个三态门 • 4,4个D触发器 • 5,基本逻辑功能得到实现
另外一种方案 • 使用较多的寄存器,使用计数器来控制逻辑 • 代价是结果输出延时可能会比较大
几点设计感悟 • 1,很多的方面需要考虑,遇到了很多没有想到的问题,只有做过才会知道。For example,不同always语句中不能对同一个变量赋值,仿真没有错误,综合时才发现,恍然大悟。连续赋值和阻塞赋值不能写在一个循环里。 • 2,多请教一些牛人会有很大帮助 • 3,对仿真综合软件的使用参考一些书籍