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

32
连连连连连连连连 Greatest Common Divisor --- 连连连连连 Combined adder and subtr actor --- 连连连连连 连连 连连连 连连连 连连 连连 连连2004.12-2005.1

description

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

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

连续输入数据处理Greatest Common Divisor

--- 最大公约数Combined adder and subtractor

--- 组合加法器作者:何小威 齐树波 胡冰 王淼

时间: 2004.12-2005.1

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

试设计一个模块(写出 Verilog描述,模拟并综合),完成如下功能: 模块的数据以串行方式输入,以输入控制信号 Start=1表示输入数据有效,并以 8’b0 表示一组输入数据的结束。

模块根据输入数据的数目(连续串行输入的输入数据数目不超过 20个)决定其具体操作类型,即: 若输入数据为 4个,依次为 x1、x2、x3、x4,则 y4 = x1*x2 + x1*x3 +x1*x4 +x2*x3 + x2*x4 + x3*x4, 否则 y4为高阻态; 若输入数据为 3个,依次为 x1、x2、x3,则 y3 = x1*x2 + x1*x3 +x2*x3, 否则 y3为高阻态; 若输入数据少于 3 个或多于 4 个,则将每一个输入数据 xi分为高 4位 xih和低 4 位 xil

并相乘, y = Σ i=1

i=n(xih*xil)

否则 y为高阻态。 输出 Done表示一次数据处理结束,其有效电平为高,维持一个时钟周期。

Start Serial_in

y4 y3 y

Done

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

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

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

各站的描述

Serial_in

clk clk

clk

clk

Z0 Z11

Z6 Z2

Z5

Xih4 Xil4

Z3 Z4

sel

sel

FSM 图示描述

程序描述部分 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_i

n= 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

Z5[17:0]

[17:0]Q[17:0][17:0] D[17:0]

Z5_8[17:0]

0

1

0*18[17:0]

[17:0]

Z4[13:0]

[13:0]Q[13:0][13:0] D[13:0]

un7_Z2[17:0]

+[17:0]

[17:0][17:0]

Z4_8[13:0]

0

1

0*14[13:0]

[13:0]

un9_Z3[13:0]

+[13:0]

[13:0][7:0]

Z6[10:0]

[10:0]Q[10:0][10:0] D[10:0]

Z1_6[10:0]

0

1

[10:0][10:0]

0*11un3_Z1[10:0]

+[10:0]

[10:0][7:0]

Z0[7:0]

[7:0]Q[7:0][7:0] D[7:0]un8_Z2[17:0]

*[7:0]

[17:0][10:0]

un1_Z0[7:0]

*[7:4]

[7:0][3:0]

Y3_9[17:0]

[17:0][17:0]

Y_9[13:0]

[13:0][13:0]

Y4_tb_9[17:0]

[17:0][17:0]

Z0_8[7:0]

0

1

[7:0][7:0]

0*8

Done25

[0][1][2]

Done24

[1][0][2]

Done23

[2][0][1]

rom

Done_9

[2:0] A[2:0] DOUT

un1_Rst

Rst

Sel[2:0] [2:0]

Serial_in[7:0][7:0]

clk

Start

Rst

clk

Serial_in[7:0] [7:0]

Done

Y4[18:0]

Y3[17:0][17:0]

Y[13:0][13:0]

0[17:0]

Technology view

S_DFF

present_state[0]

DCLK

1 CLRN1 PRN

[0]Q

G_104

[3][1]

G_105

[3]

G_110

[2][0]

G_119

[1][2]

Next_state92_0_and3

[2][3]

Next_state93_0_and3

[3]

un1_un1_un1_present_state_0_and3

[1]

present_state_8_i_and3[1]

[0]

present_state_8_i_or3[0]

present_state_8_i_xor3[0]

[1]

G_117

present_state_8_i[0]

present_state_8_i_and3[0]

[2]

present_state_8_i_and3[2]present_state_8_i_and3_0.G_158

[0][1]

G_117.G_159

[1][2]

G_117.G_160

[7][0]

G_117.G_161

[5][6]

G_117.G_162

[3][4]

G_117.G_163

G_117.G_164

present_state_8_i_and3_2.G_165

[2][0]

present_state_8_i_0.G_169

present_state_8_i_0.G_170

N_163_i

present_state[3:0][3:0]

Serial_in[7:0] [7:0]

G_117_i

N_208_i

Rst

N_207_i

N_180_i

Next_state93

Next_state92

G_105

clk

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 ,对仿真综合软件的使用参考一些书籍

多谢指点!