作者:何小威 齐树波 胡冰 王淼 时间: 2004.12-2005.1
-
Upload
flavia-hancock -
Category
Documents
-
view
205 -
download
18
description
Transcript of 作者:何小威 齐树波 胡冰 王淼 时间: 2004.12-2005.1
连续输入数据处理Greatest Common Divisor
--- 最大公约数Combined adder and subtractor
--- 组合加法器作者:何小威 齐树波 胡冰 王淼
时间: 2004.12-2005.1
试设计一个模块(写出 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 考虑使用两个数据通路同时对输入数据进行处理,最后由数据选择器选择输出结果 如下图
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 ,很多的方面需要考虑,遇到了很多没有想到的问题,只有做过才会知道。 For example,不同 always 语句中不能对同一个变量赋值,仿真没有错误,综合时才发现,恍然大悟。连续赋值和阻塞赋值不能写在一个循环里。 2 ,多请教一些牛人会有很大帮助 3 ,对仿真综合软件的使用参考一些书籍