OpenCores
URL https://opencores.org/ocsvn/pid_controller/pid_controller/trunk

Subversion Repositories pid_controller

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 1 to Rev 2
    Reverse comparison

Rev 1 → Rev 2

/pid_controller/trunk/bench/PID_tb.v
0,0 → 1,213
/*PID controller testbench
Author: Zhu Xu
Email: m99a1@yahoo.cn
*/
 
 
module PID_tb;
reg clk=0;
reg rst=1;
 
always #1 clk=~clk;
 
initial begin
#10 rst=0;
end
 
//scoreboard
reg [15:0]kp=0;
reg [15:0]ki=0;
reg [15:0]kd=0;
reg [15:0]sp=0;
reg [15:0]pv=0;
reg [15:0]kpd;
reg [15:0]err[0:1];
reg [31:0]sigma=0;
reg [31:0]un=0;
reg [31:0]a=0;
reg [31:0]p=0;
reg [4:0]of=0;
reg [31:0]s=0;
initial begin
err[0]=0;
err[1]=0;
end
 
wire [31:0]value_sb[0:10];
assign value_sb[0]={{16{kp[15]}},kp};
assign value_sb[1]={{16{ki[15]}},ki};
assign value_sb[2]={{16{kd[15]}},kd};
assign value_sb[3]={{16{sp[15]}},sp};
assign value_sb[4]={{16{pv[15]}},pv};
assign value_sb[5]={{16{kpd[15]}},kpd};
assign value_sb[6]={{16{err[0][15]}},err[0]};
assign value_sb[7]={{16{err[1][15]}},err[1]};
assign value_sb[8]=un;
assign value_sb[9]=sigma;
assign value_sb[10]={27'b0,of};
 
function of_check_16bit;
input [15:0]a,b;
begin
s=a+b;
of_check_16bit=(a[15]&b[15]&(~s[15]))|((~a[15])&(~b[15])&s[15]);
end
endfunction
 
function of_check_32bit;
input [31:0]a,b;
begin
s=a+b;
of_check_32bit=(a[31]&b[31]&(~s[31]))|((~a[31])&(~b[31])&s[31]);
end
endfunction
 
task update_sb;
input [15:0]adr;
input [15:0]data;
begin
case(adr[15:2])
0:begin
kp=data;
kpd=kp+kd;
of[0]=of_check_16bit(kp,kd);
end
1:begin
ki=data;
end
2:begin
kd=data;
kpd=kp+kd;
of[0]=of_check_16bit(kp,kd);
end
3:begin
sp=data;
end
4:begin
pv=data;
err[1]=(~err[0])+1;
of[2]=of[1];
err[0]=sp+(~pv)+1;
of[1]=of_check_16bit(sp,((~pv)+1));
p={{16{err[0][15]}},err[0]}*{{16{ki[15]}},ki};
of[4]=of[4]|of_check_32bit(sigma,p);
sigma=sigma+p;
p={{16{err[0][15]}},err[0]}*{{16{kpd[15]}},kpd};
of[3]=of[4]|of_check_32bit(sigma,p);
a=sigma+p;
p={{16{err[1][15]}},err[1]}*{{16{kd[15]}},kd};
of[3]=of[3]|of_check_32bit(a,p);
un=a+p;
end
endcase
end
endtask
 
//wishbone master
wire [3:0]TAG_s2m;
wire [3:0]TAG_m2s;
wire ACK_s2m;
wire [31:0]ADR_m2s;
wire CYC_m2s;
wire [31:0]DAT_s2m;
wire [31:0]DAT_m2s;
wire ERR_s2m,RTY_s2m,STB_m2s,WE_m2s;
wire [3:0]SEL_m2s;
 
wb_master wb_master_0(
clk,
rst,
TAG_s2m,
TAG_m2s,
ACK_s2m,
ADR_m2s,
CYC_m2s,
DAT_s2m,
DAT_m2s,
ERR_s2m,
RTY_s2m,
SEL_m2s,
STB_m2s,
WE_m2s
);
 
 
reg [31:0]rdata;
task check_sb;
input [31:0]adr;
begin
wb_master_0.rd(adr,rdata);
if(adr<=10*4)begin
if(rdata==value_sb[adr[15:2]])begin
$display("%8dns read correct value from address=%8h data=%8h",$time,adr,rdata);
end
else begin
$display("%8dns read incorrect value from address=%8h rdata=%8h scoreboard=%8h",$time,adr,rdata,value_sb[adr[15:2]]);
end
end
else begin
if(rdata==0)begin
$display("%8dns read correct value from address=%8h data=%8h",$time,adr,rdata);
end
else begin
$display("%8dns read incorrect value from address=%8h rdata=%8h scoreboard=0",$time,adr,rdata);
end
end
end
endtask
 
 
 
//instantiation of PID
wire [31:0]o_un;
wire valid;
 
PID PID_0(
clk,
rst,
CYC_m2s,
STB_m2s,
WE_m2s,
ADR_m2s[15:0],
DAT_m2s,
ACK_s2m,
DAT_s2m,
o_un,
valid
);
 
 
//test procedure
reg signed[31:0]rdata_1=0;
initial begin
while(rst)begin
@(posedge clk);
end
wb_master_0.wr(0*4,32'h80,4'b1111);
update_sb(0*4,16'h80);
wb_master_0.wr(1*4,32'h5,4'b1111);
update_sb(1*4,16'h5);
wb_master_0.wr(2*4,32'h5,4'b1111);
update_sb(2*4,16'h5);
wb_master_0.wr(3*4,32'hf87,4'b1111);
update_sb(3*4,16'hf87);
wb_master_0.wr(4*4,32'h0,4'b1111);
update_sb(4*4,0);
repeat(1000)begin
wb_master_0.rd(8*4,rdata_1);
check_sb(8*4);
rdata_1=rdata_1>>>8;
wb_master_0.wr(4*4,rdata_1,4'b1111);
update_sb(4*4,rdata_1[15:0]);
end
#10 $finish;
end
 
 
 
 
 
 
endmodule
/pid_controller/trunk/bench/wb_master.v
0,0 → 1,306
`include "timescale.v"
 
// -*- Mode: Verilog -*-
// Filename : wb_master.v
// Description : Wishbone Master Behavorial
// Author : Winefred Washington
// Created On : Thu Jan 11 21:18:41 2001
// Last Modified By: .
// Last Modified On: .
// Update Count : 0
// Status : Unknown, Use with caution!
 
// Description Specification
// General Description: 8, 16, 32-bit WISHBONE Master
// Supported cycles: MASTER, READ/WRITE
// MASTER, BLOCK READ/WRITE
// MASTER, RMW
// Data port, size: 8, 16, 32-bit
// Data port, granularity 8-bit
// Data port, Max. operand size 32-bit
// Data transfer ordering: little endian
// Data transfer sequencing: undefined
//
 
module wb_master(CLK_I, RST_I, TAG_I, TAG_O,
ACK_I, ADR_O, CYC_O, DAT_I, DAT_O, ERR_I, RTY_I, SEL_O, STB_O, WE_O);
 
input CLK_I;
input RST_I;
input [3:0] TAG_I;
output [3:0] TAG_O;
input ACK_I;
output [31:0] ADR_O;
output CYC_O;
input [31:0] DAT_I;
output [31:0] DAT_O;
input ERR_I;
input RTY_I;
output [3:0] SEL_O;
output STB_O;
output WE_O;
reg [31:0] ADR_O;
reg [3:0] SEL_O;
reg CYC_O;
reg STB_O;
reg WE_O;
reg [31:0] DAT_O;
wire [15:0] mem_sizes; // determines the data width of an address range
reg [31:0] write_burst_buffer[0:7];
reg [31:0] read_burst_buffer[0:7];
reg GO;
integer cycle_end;
integer address;
integer data;
integer selects;
integer write_flag;
//
// mem_sizes determines the data widths of memory space
// The memory space is divided into eight regions. Each
// region is controlled by a two bit field.
//
// Bits
// 00 = 8 bit memory space
// 01 = 16 bit
// 10 = 32 bit
// 11 = 64 bit (not supported in this model
//
assign mem_sizes = 16'b10_01_10_11_00_01_10_11;
 
function [1:0] data_width;
input [31:0] adr;
begin
casex (adr[31:29])
3'b000: data_width = mem_sizes[15:14];
3'b001: data_width = mem_sizes[13:12];
3'b010: data_width = mem_sizes[11:10];
3'b011: data_width = mem_sizes[9:8];
3'b100: data_width = mem_sizes[7:6];
3'b101: data_width = mem_sizes[5:4];
3'b110: data_width = mem_sizes[3:2];
3'b111: data_width = mem_sizes[1:0];
3'bxxx: data_width = 2'bxx;
endcase // casex (adr[31:29])
end
endfunction
always @(posedge CLK_I or posedge RST_I)
begin
if (RST_I)
begin
GO = 1'b0;
end
end
// read single
task rd;
input [31:0] adr;
output [31:0] result;
begin
cycle_end = 1;
address = adr;
selects = 255;
write_flag = 0;
GO <= 1;
@(posedge CLK_I);
// GO <= 0;
 
// wait for cycle to start
while (~CYC_O)
@(posedge CLK_I);
 
// wait for cycle to end
while (CYC_O)
@(posedge CLK_I);
 
result = data;
$display(" Reading %h from address %h", result, address);
end
endtask // read
task wr;
input [31:0] adr;
input [31:0] dat;
input [3:0] sel;
begin
cycle_end = 1;
address = adr;
selects = sel;
write_flag = 1;
data = dat;
GO <= 1;
@(posedge CLK_I);
// GO <= 0;
 
// wait for cycle to start
while (~CYC_O)
@(posedge CLK_I);
 
// wait for cycle to end
while (CYC_O)
@(posedge CLK_I);
$display(" Writing %h to address %h", data, address);
 
end
endtask // wr
 
// block read
task blkrd;
input [31:0] adr;
input end_flag;
output [31:0] result;
begin
write_flag = 0;
cycle_end = end_flag;
address = adr;
GO <= 1;
@(posedge CLK_I);
// GO <= 0;
 
while (~(ACK_I & STB_O))
@(posedge CLK_I);
result = data;
end
endtask // blkrd
 
// block write
task blkwr;
input [31:0] adr;
input [31:0] dat;
input [3:0] sel;
input end_flag;
begin
write_flag = 1;
cycle_end = end_flag;
address = adr;
data = dat;
selects = sel;
GO <= 1;
@(posedge CLK_I);
// GO <= 0;
 
while (~(ACK_I & STB_O))
@(posedge CLK_I);
end
endtask // blkwr
 
// RMW
task rmw;
input [31:0] adr;
input [31:0] dat;
input [3:0] sel;
output [31:0] result;
begin
// read phase
write_flag = 0;
cycle_end = 0;
address = adr;
GO <= 1;
@(posedge CLK_I);
// GO <= 0;
 
while (~(ACK_I & STB_O))
@(posedge CLK_I);
result = data;
 
// write phase
write_flag = 1;
address = adr;
selects = sel;
GO <= 1;
data <= dat;
cycle_end <= 1;
@(posedge CLK_I);
// GO <= 0;
 
while (~(ACK_I & STB_O))
@(posedge CLK_I);
end
endtask // rmw
always @(posedge CLK_I)
begin
if (RST_I)
ADR_O <= 32'h0000_0000;
else
ADR_O <= address;
end
always @(posedge CLK_I)
begin
if (RST_I | ERR_I | RTY_I)
CYC_O <= 1'b0;
else if ((cycle_end == 1) & ACK_I)
CYC_O <= 1'b0;
else if (GO | CYC_O) begin
CYC_O <= 1'b1;
GO <= 1'b0;
end
end
 
// stb control
always @(posedge CLK_I)
begin
if (RST_I | ERR_I | RTY_I)
STB_O <= 1'b0;
else if (STB_O & ACK_I)
STB_O <= 1'b0;
else if (GO | STB_O)
STB_O <= 1'b1;
end
 
// selects & data
always @(posedge CLK_I)
begin
if (write_flag == 0) begin
SEL_O <= 4'b1111;
if (STB_O & ACK_I)
data <= DAT_I;
end
else begin
case (data_width(address))
2'b00: begin
SEL_O <= {3'b000, selects[0]};
DAT_O <= {data[7:0], data[7:0], data[7:0], data[7:0]};
end
2'b01: begin
SEL_O <= {2'b00, selects[1:0]};
DAT_O <= {data[15:0], data[15:0]};
end
2'b10: begin
SEL_O <= selects;
DAT_O <= data;
end
endcase
end
end
 
always @(posedge CLK_I)
begin
if (RST_I)
WE_O <= 1'b0;
else if (GO)
WE_O <= write_flag;
end
endmodule
 
 
 
 
 
/pid_controller/trunk/bench/timescale.v
0,0 → 1,306
`timescale 1ns/10ps
/pid_controller/trunk/RTL/booth.v
0,0 → 1,37
/*Booth Encoder
Author: Zhu Xu
Email: m99a1@yahoo.cn
*/
module booth_radix4(
input [2:0]codes,
output zero,
output double,
output negation
);
 
wire A;
assign A=codes[2];
wire B;
assign B=codes[1];
wire C;
assign C=codes[0];
wire nB,nC,nA;
assign nB=~B;
assign nC=~C;
assign nA=~A;
 
wire BC;
assign BC=B&C;
wire nBnC;
assign nBnC=nB&nC;
wire nBanC;
assign nBanC=nB|nC;
 
assign double=(nBnC&A)|(BC&nA);
assign negation=A&nBanC;
assign zero=(A&BC)|(nA&nBnC);
 
 
 
 
endmodule
/pid_controller/trunk/RTL/PID.v
0,0 → 1,496
/* PID controller
Author: Zhu Xu
Email: m99a1@yahoo.cn
 
sigma=Ki*e(n)+sigma
u(n)=(Kp+Kd)*e(n)+sigma+Kd*(-e(n-1))
 
Data width of Wishbone slave port can be can be toggled between 64-bit, 32-bit and 16-bit.
Address width of Wishbone slave port can be can be modified by changing parameter adr_wb_nb.
 
Wishbone compliant
Work as Wishbone slave, support Classic standard SINGLE/BLOCK READ/WRITE Cycle
 
registers or wires
[15:0]kp,ki,kd,sp,pv; can be both read and written through Wishbone interface, address: 0x0, 0x4, 0x8, 0xc, 0x10
[15:0]kpd; read only through Wishbone interface, address: 0x14
[15:0]err[0:1]; read only through Wishbone interface, address: 0x18, 0x1c
[15:0]mr,md; not accessable through Wishbone interface
[31:0]p,b; not accessable through Wishbone interface
[31:0]un,sigma; read only through Wishbone interface, address: 0x20, 0x24
 
 
[4:0]of; overflow register, read only through Wishbone interface, address: 0x28
of[0]==1 : kpd overflow
of[1]==1 : err[0] overflow
of[2]==1 : err[1] overflow
of[3]==1 : un overflow
of[4]==1 : sigma overflow
[0:15]rl; read lock, when asserted corelated reagister can not be read through Wishbone interface
[0:7]wl; write lock, when asserted corelated reagister can not be written through Wishbone interface
 
 
 
*/
 
`include "PID_defines.v"
 
module PID #(
`ifdef wb_16bit
parameter wb_nb=16,
`endif
`ifdef wb_32bit
parameter wb_nb=32,
`endif
`ifdef wb_64bit
parameter wb_nb=64,
`endif
adr_wb_nb=16
)(
//Wishbone Slave Interface
input i_clk,
input i_rst,
input i_wb_cyc,
input i_wb_stb,
input i_wb_we,
input [adr_wb_nb-1:0]i_wb_adr,
input [wb_nb-1:0]i_wb_data,
output o_wb_ack,
output [wb_nb-1:0]o_wb_data,
 
//u(n) output
output [31:0]o_un,
output o_valid
);
 
parameter kp_adr = 0,
ki_adr = 1,
kd_adr = 2,
sp_adr = 3,
pv_adr = 4,
kpd_adr = 5,
err_0_adr = 6,
err_1_adr = 7,
un_adr = 8,
sigma_adr = 9,
of_adr = 10;
 
wire rst;
assign rst=~i_rst;
 
reg [15:0]kp,ki,kd,sp,pv;
reg wlkp,wlki,wlkd,wlsp,wlpv;
 
wire [0:7]wl={wlkp,wlki,wlkd,wlsp,wlpv,3'h0};
 
reg wack; //write acknowledged
 
wire [2:0]adr;
`ifdef wb_16bit
assign adr=i_wb_adr[3:1];
`endif
`ifdef wb_32bit
assign adr=i_wb_adr[4:2];
`endif
`ifdef wb_64bit
assign adr=i_wb_adr[5:3];
`endif
 
wire [3:0]adr_1;
`ifdef wb_32bit
assign adr_1=i_wb_adr[5:2];
`endif
`ifdef wb_16bit
assign adr_1=i_wb_adr[4:1];
`endif
`ifdef wb_64bit
assign adr_1=i_wb_adr[6:3];
`endif
 
 
wire we; // write enable
assign we=i_wb_cyc&i_wb_we&i_wb_stb;
wire re; //read enable
assign re=i_wb_cyc&(~i_wb_we)&i_wb_stb;
 
reg state_0; //state machine No.1's state register
 
wire adr_check_1;
`ifdef wb_32bit
assign adr_check_1=i_wb_adr[adr_wb_nb-1:6]==0;
`endif
`ifdef wb_16bit
assign adr_check_1=i_wb_adr[adr_wb_nb-1:5]==0;
`endif
`ifdef wb_64bit
assign adr_check_1=i_wb_adr[adr_wb_nb-1:7]==0;
`endif
 
wire adr_check; //check address's correctness
`ifdef wb_16bit
assign adr_check=i_wb_adr[4]==0&&adr_check_1;
`endif
`ifdef wb_32bit
assign adr_check=i_wb_adr[5]==0&&adr_check_1;
`endif
`ifdef wb_64bit
assign adr_check=i_wb_adr[6]==0&&adr_check_1;
`endif
 
//state machine No.1
always@(posedge i_clk or negedge rst)
if(!rst)begin
state_0<=0;
wack<=0;
kp<=0;
ki<=0;
kd<=0;
sp<=0;
pv<=0;
end
else begin
if(wack&&(!i_wb_stb)) wack<=0;
case(state_0)
0: begin
if(we&&(!wack)) state_0<=1;
end
1: begin
if(adr_check)begin
if(!wl[adr])begin
wack<=1;
state_0<=0;
case(adr)
0: begin
kp<=i_wb_data[15:0];
end
1: begin
ki<=i_wb_data[15:0];
end
2: begin
kd<=i_wb_data[15:0];
end
3: begin
sp<=i_wb_data[15:0];
end
4: begin
pv<=i_wb_data[15:0];
end
endcase
 
end
end
else begin
wack<=1;
state_0<=0;
end
end
endcase
end
 
 
//state machine No.2
reg [14:0]state_2;
reg state_1;
 
wire update_kpd;
assign update_kpd=wack&&(~adr[2])&(~adr[0])&&adr_check; //adr==0||adr==2
 
wire update_esu; //update e(n), sigma and u(n)
assign update_esu=wack&&(adr==4)&&adr_check;
 
reg rlkpd;
reg rlerr_0;
reg rlerr_1;
reg rla;
reg rlsigma;
reg rlof;
 
reg [4:0]of;
reg [15:0]kpd;
reg [15:0]err[0:1];
 
wire [15:0]mr,md;
 
reg [31:0]p;
reg [31:0]a,sigma,un;
 
reg start; //start signal for multiplier
 
reg [1:0]mr_index;
reg md_index;
assign mr= mr_index==1?kpd:
mr_index==2?kd:ki;
assign md= md_index?err[1]:err[0];
 
reg cout;
wire cin;
wire [31:0]sum;
wire [31:0]product;
 
wire of_addition[0:1];
assign of_addition[0]=(p[15]&&a[15]&&(!sum[15]))||((!p[15])&&(!a[15])&&sum[15]);
assign of_addition[1]=(p[31]&&a[31]&&(!sum[31]))||((!p[31])&&(!a[31])&&sum[31]);
 
 
 
reg [31:0]reg_sum;
reg [31:0]reg_product;
reg reg_of_addition[0:1];
 
always@(posedge i_clk)begin
reg_sum<=sum;
reg_of_addition[0]<=of_addition[0];
reg_of_addition[1]<=of_addition[1];
reg_product<=product;
end
 
always@(posedge i_clk or negedge rst)
if(!rst)begin
state_1<=0;
state_2<=15'b000000000000001;
wlkp<=0;
wlki<=0;
wlkd<=0;
wlsp<=0;
wlpv<=0;
rlkpd<=0;
rlerr_0<=0;
rlerr_1<=0;
rla<=0;
rlsigma<=0;
rlof<=0;
of<=0;
kpd<=0;
err[0]<=0;
err[1]<=0;
p<=0;
a<=0;
sigma<=0;
un<=0;
start<=0;
mr_index<=0;
md_index<=0;
cout<=0;
end
else begin
case(state_1)
1: state_1<=0;
0:begin
case(state_2)
15'b0000000000001: begin
if(update_kpd)begin
state_2<=15'b000000000000010;
wlkp<=1;
wlkd<=1;
wlpv<=1;
rlkpd<=1;
rlof<=1;
end
else if(update_esu)begin
state_2<=15'b00000000001000;
wlkp<=1;
wlki<=1;
wlkd<=1;
wlsp<=1;
wlpv<=1;
rlkpd<=1;
rlerr_0<=1;
rlerr_1<=1;
rla<=1;
rlsigma<=1;
rlof<=1;
end
end
15'b000000000000010: begin
p<={{16{kp[15]}},kp};
a<={{16{kd[15]}},kd};
state_2<=15'b000000000000100;
state_1<=1;
end
15'b000000000000100: begin
kpd<=reg_sum[15:0];
wlkp<=0;
wlkd<=0;
wlpv<=0;
rlkpd<=0;
rlof<=0;
of[0]<=reg_of_addition[0];
state_2<=15'b000000000000001;
end
15'b000000000001000: begin
p<={{16{~err[0][15]}},~err[0]};
a<={31'b0,1'b1};
state_2<=15'b000000000010000;
end
15'b000000000010000: begin
state_2<=15'b000000000100000;
p<={{16{sp[15]}},sp};
a<={{16{~pv[15]}},~pv};
cout<=1;
end
15'b000000000100000: begin
err[1]<=reg_sum[15:0];
of[2]<=of[1];
 
state_2<=15'b000000001000000;
end
15'b000000001000000: begin
err[0]<=reg_sum[15:0];
of[1]<=reg_of_addition[0];
cout<=0;
start<=1;
state_2<=15'b000000010000000;
end
15'b000000010000000: begin
mr_index<=1;
state_2<=15'b000000100000000;
end
15'b000000100000000: begin
mr_index<=2;
md_index<=1;
state_2<=15'b000001000000000;
end
15'b000001000000000: begin
mr_index<=0;
md_index<=0;
start<=0;
state_2<=15'b000010000000000;
end
15'b000010000000000: begin
p<=reg_product;
a<=sigma;
state_2<=15'b000100000000000;
end
15'b000100000000000: begin
//need modi
 
p<=reg_product;
state_2<=15'b001000000000000;
end
15'b001000000000000: begin
 
a<=reg_product;
sigma<=reg_sum;
of[3]<=of[4]|reg_of_addition[1];
of[4]<=of[4]|reg_of_addition[1];
state_1<=1;
state_2<=15'b010000000000000;
end
15'b010000000000000: begin
a<=reg_sum; //Kpd*err0-Kd*err1
p<=sigma;
of[3]<=of[3]|reg_of_addition[1];
state_1<=1;
state_2<=15'b100000000000000;
end
15'b100000000000000: begin
un<=reg_sum;
of[3]<=of[3]|reg_of_addition[1];
state_2<=15'b000000000000001;
wlkp<=0;
wlki<=0;
wlkd<=0;
wlsp<=0;
wlpv<=0;
rlkpd<=0;
rlerr_0<=0;
rlerr_1<=0;
rla<=0;
rlsigma<=0;
rlof<=0;
end
endcase
end
endcase
end
 
 
wire ready;
multiplier_16x16bit_pipelined multiplier_16x16bit_pipelined(
i_clk,
rst,
start,
md,
mr,
product,
ready
);
 
adder_32bit adder_32bit_0(
a,
p,
cout,
sum,
cin
);
 
 
wire [wb_nb-1:0]rdata[0:15]; //wishbone read data array
`ifdef wb_16bit
assign rdata[0]=kp;
assign rdata[1]=ki;
assign rdata[2]=kd;
assign rdata[3]=sp;
assign rdata[4]=pv;
assign rdata[5]=kpd;
assign rdata[6]=err[0];
assign rdata[7]=err[1];
assign rdata[8]=un[15:0];
assign rdata[9]=sigma[15:0];
assign rdata[10]={11'b0,of};
`endif
 
`ifdef wb_32bit
assign rdata[0]={{16{kp[15]}},kp};
assign rdata[1]={{16{ki[15]}},ki};
assign rdata[2]={{16{kd[15]}},kd};
assign rdata[3]={{16{sp[15]}},sp};
assign rdata[4]={{16{pv[15]}},pv};
assign rdata[5]={{16{kpd[15]}},kpd};
assign rdata[6]={{16{err[0][15]}},err[0]};
assign rdata[7]={{16{err[1][15]}},err[1]};
assign rdata[8]=un;
assign rdata[9]=sigma;
assign rdata[10]={27'b0,of};
`endif
 
`ifdef wb_64bit
assign rdata[0]={{48{kp[15]}},kp};
assign rdata[1]={{48{ki[15]}},ki};
assign rdata[2]={{48{kd[15]}},kd};
assign rdata[3]={{48{sp[15]}},sp};
assign rdata[4]={{48{pv[15]}},pv};
assign rdata[5]={{48{kpd[15]}},kpd};
assign rdata[6]={{48{err[0][15]}},err[0]};
assign rdata[7]={{48{err[1][15]}},err[1]};
assign rdata[8]={{32{un[31]}},un};
assign rdata[9]={{32{sigma[31]}},sigma};
assign rdata[10]={59'b0,of};
`endif
 
assign rdata[11]=0;
assign rdata[12]=0;
assign rdata[13]=0;
assign rdata[14]=0;
assign rdata[15]=0;
 
 
wire [0:15]rl;
assign rl={5'b0,rlkpd,rlerr_0,rlerr_1,rla,rlsigma,rlof,5'b0};
 
wire rack; // wishbone read acknowledged
assign rack=(re&adr_check_1&(~rl[adr_1]))|(re&(~adr_check_1));
 
assign o_wb_ack=(wack|rack)&i_wb_stb;
 
assign o_wb_data=adr_check_1?rdata[adr_1]:0;
assign o_un=un;
assign o_valid=~rla;
 
 
endmodule
/pid_controller/trunk/RTL/CLA_fixed.v
0,0 → 1,259
/*Carry look-ahead adder
Author: Zhu Xu
Email: m99a1@yahoo.cn
*/
 
module operator_A(
input A,
input B,
output P,
output G
);
 
assign P=A^B;
assign G=A&B;
 
endmodule
 
module operator_B(
input P,G,P1,G1,
output Po,Go
);
 
assign Po=P&P1;
assign Go=G|(P&G1);
 
endmodule
 
module operator_C(
input P,G,G1,
output Go
);
 
assign Go=G|(P&G1);
 
endmodule
 
 
/* 32-bit prefix-2 Han-Carlson adder
stage 0: Number of Generation=32, NP=32, NOA=32, NOB=0, NOC=0.
stage 1: NG=16, NP=15, NOA=0, NOB=15, NOC=1.
stage 2: NG=16, NP=14, NOA=0, NOB=14, NOC=1.
stage 3: NG=16, NP=12, NOA=0, NOB=12, NOC=2.
stage 4: NG=16, NP=8, NOA=0, NOB=8, NOC=4.
stage 5: NG=16, NP=0, NOA=0, NOB=0, NOC=8.
stage 6; NG=32, NP=0, NOA=0, NOB=0, NOC=15.
*/
module adder_32bit(
input [31:0]i_a,i_b,
input i_c,
output [31:0]o_s,
output o_c
);
 
//stage 0
wire [31:0]P0,G0;
operator_A operator_A_0(i_a[0],i_b[0],P0[0],G0[0]);
operator_A operator_A_1(i_a[1],i_b[1],P0[1],G0[1]);
operator_A operator_A_2(i_a[2],i_b[2],P0[2],G0[2]);
operator_A operator_A_3(i_a[3],i_b[3],P0[3],G0[3]);
operator_A operator_A_4(i_a[4],i_b[4],P0[4],G0[4]);
operator_A operator_A_5(i_a[5],i_b[5],P0[5],G0[5]);
operator_A operator_A_6(i_a[6],i_b[6],P0[6],G0[6]);
operator_A operator_A_7(i_a[7],i_b[7],P0[7],G0[7]);
operator_A operator_A_8(i_a[8],i_b[8],P0[8],G0[8]);
operator_A operator_A_9(i_a[9],i_b[9],P0[9],G0[9]);
operator_A operator_A_10(i_a[10],i_b[10],P0[10],G0[10]);
operator_A operator_A_11(i_a[11],i_b[11],P0[11],G0[11]);
operator_A operator_A_12(i_a[12],i_b[12],P0[12],G0[12]);
operator_A operator_A_13(i_a[13],i_b[13],P0[13],G0[13]);
operator_A operator_A_14(i_a[14],i_b[14],P0[14],G0[14]);
operator_A operator_A_15(i_a[15],i_b[15],P0[15],G0[15]);
operator_A operator_A_16(i_a[16],i_b[16],P0[16],G0[16]);
operator_A operator_A_17(i_a[17],i_b[17],P0[17],G0[17]);
operator_A operator_A_18(i_a[18],i_b[18],P0[18],G0[18]);
operator_A operator_A_19(i_a[19],i_b[19],P0[19],G0[19]);
operator_A operator_A_20(i_a[20],i_b[20],P0[20],G0[20]);
operator_A operator_A_21(i_a[21],i_b[21],P0[21],G0[21]);
operator_A operator_A_22(i_a[22],i_b[22],P0[22],G0[22]);
operator_A operator_A_23(i_a[23],i_b[23],P0[23],G0[23]);
operator_A operator_A_24(i_a[24],i_b[24],P0[24],G0[24]);
operator_A operator_A_25(i_a[25],i_b[25],P0[25],G0[25]);
operator_A operator_A_26(i_a[26],i_b[26],P0[26],G0[26]);
operator_A operator_A_27(i_a[27],i_b[27],P0[27],G0[27]);
operator_A operator_A_28(i_a[28],i_b[28],P0[28],G0[28]);
operator_A operator_A_29(i_a[29],i_b[29],P0[29],G0[29]);
operator_A operator_A_30(i_a[30],i_b[30],P0[30],G0[30]);
operator_A operator_A_31(i_a[31],i_b[31],P0[31],G0[31]);
 
//stage 1
wire [15:0]G1;
wire [15:1]P1;
operator_C operator_C_stage_1_0(P0[0],G0[0],i_c,G1[0]);
operator_B operator_B_stage_1_1(P0[2],G0[2],P0[1],G0[1],P1[1],G1[1]);
operator_B operator_B_stage_1_2(P0[4],G0[4],P0[3],G0[3],P1[2],G1[2]);
operator_B operator_B_stage_1_3(P0[6],G0[6],P0[5],G0[5],P1[3],G1[3]);
operator_B operator_B_stage_1_4(P0[8],G0[8],P0[7],G0[7],P1[4],G1[4]);
operator_B operator_B_stage_1_5(P0[10],G0[10],P0[9],G0[9],P1[5],G1[5]);
operator_B operator_B_stage_1_6(P0[12],G0[12],P0[11],G0[11],P1[6],G1[6]);
operator_B operator_B_stage_1_7(P0[14],G0[14],P0[13],G0[13],P1[7],G1[7]);
operator_B operator_B_stage_1_8(P0[16],G0[16],P0[15],G0[15],P1[8],G1[8]);
operator_B operator_B_stage_1_9(P0[18],G0[18],P0[17],G0[17],P1[9],G1[9]);
operator_B operator_B_stage_1_10(P0[20],G0[20],P0[19],G0[19],P1[10],G1[10]);
operator_B operator_B_stage_1_11(P0[22],G0[22],P0[21],G0[21],P1[11],G1[11]);
operator_B operator_B_stage_1_12(P0[24],G0[24],P0[23],G0[23],P1[12],G1[12]);
operator_B operator_B_stage_1_13(P0[26],G0[26],P0[25],G0[25],P1[13],G1[13]);
operator_B operator_B_stage_1_14(P0[28],G0[28],P0[27],G0[27],P1[14],G1[14]);
operator_B operator_B_stage_1_15(P0[30],G0[30],P0[29],G0[29],P1[15],G1[15]);
 
 
 
//stage 2
wire [15:0]G2;
wire [15:2]P2;
assign G2[0]=G1[0];
operator_C operator_C_stage_2_1(P1[1],G1[1],G1[0],G2[1]);
operator_B operator_B_stage_2_2(P1[2], G1[2],P1[1],G1[1],P2[2],G2[2]);
operator_B operator_B_stage_2_3(P1[3], G1[3],P1[2],G1[2],P2[3],G2[3]);
operator_B operator_B_stage_2_4(P1[4], G1[4],P1[3],G1[3],P2[4],G2[4]);
operator_B operator_B_stage_2_5(P1[5], G1[5],P1[4],G1[4],P2[5],G2[5]);
operator_B operator_B_stage_2_6(P1[6], G1[6],P1[5],G1[5],P2[6],G2[6]);
operator_B operator_B_stage_2_7(P1[7], G1[7],P1[6],G1[6],P2[7],G2[7]);
operator_B operator_B_stage_2_8(P1[8], G1[8],P1[7],G1[7],P2[8],G2[8]);
operator_B operator_B_stage_2_9(P1[9], G1[9],P1[8],G1[8],P2[9],G2[9]);
operator_B operator_B_stage_2_10(P1[10], G1[10],P1[9],G1[9],P2[10],G2[10]);
operator_B operator_B_stage_2_11(P1[11], G1[11],P1[10],G1[10],P2[11],G2[11]);
operator_B operator_B_stage_2_12(P1[12], G1[12],P1[11],G1[11],P2[12],G2[12]);
operator_B operator_B_stage_2_13(P1[13], G1[13],P1[12],G1[12],P2[13],G2[13]);
operator_B operator_B_stage_2_14(P1[14], G1[14],P1[13],G1[13],P2[14],G2[14]);
operator_B operator_B_stage_2_15(P1[15], G1[15],P1[14],G1[14],P2[15],G2[15]);
 
//stage 3
wire [15:0]G3;
wire [15:4]P3;
assign G3[0]=G2[0];
assign G3[1]=G2[1];
operator_C operator_C_stage_3_2(P2[2],G2[2],G2[0],G3[2]);
operator_C operator_C_stage_3_3(P2[3],G2[3],G2[1],G3[3]);
operator_B operator_B_stage_3_4(P2[4], G2[4],P2[2],G2[2],P3[4],G3[4]);
operator_B operator_B_stage_3_5(P2[5], G2[5],P2[3],G2[3],P3[5],G3[5]);
operator_B operator_B_stage_3_6(P2[6], G2[6],P2[4],G2[4],P3[6],G3[6]);
operator_B operator_B_stage_3_7(P2[7], G2[7],P2[5],G2[5],P3[7],G3[7]);
operator_B operator_B_stage_3_8(P2[8], G2[8],P2[6],G2[6],P3[8],G3[8]);
operator_B operator_B_stage_3_9(P2[9], G2[9],P2[7],G2[7],P3[9],G3[9]);
operator_B operator_B_stage_3_10(P2[10], G2[10],P2[8],G2[8],P3[10],G3[10]);
operator_B operator_B_stage_3_11(P2[11], G2[11],P2[9],G2[9],P3[11],G3[11]);
operator_B operator_B_stage_3_12(P2[12], G2[12],P2[10],G2[10],P3[12],G3[12]);
operator_B operator_B_stage_3_13(P2[13], G2[13],P2[11],G2[11],P3[13],G3[13]);
operator_B operator_B_stage_3_14(P2[14], G2[14],P2[12],G2[12],P3[14],G3[14]);
operator_B operator_B_stage_3_15(P2[15], G2[15],P2[13],G2[13],P3[15],G3[15]);
 
//stage 4
wire [15:0]G4;
wire [15:8]P4;
assign G4[0]=G3[0];
assign G4[1]=G3[1];
assign G4[2]=G3[2];
assign G4[3]=G3[3];
operator_C operator_C_stage_4_4(P3[4],G3[4],G3[0],G4[4]);
operator_C operator_C_stage_4_5(P3[5],G3[5],G3[1],G4[5]);
operator_C operator_C_stage_4_6(P3[6],G3[6],G3[2],G4[6]);
operator_C operator_C_stage_4_7(P3[7],G3[7],G3[3],G4[7]);
operator_B operator_B_stage_4_8(P3[8], G3[8],P3[4],G3[4],P4[8],G4[8]);
operator_B operator_B_stage_4_9(P3[9], G3[9],P3[5],G3[5],P4[9],G4[9]);
operator_B operator_B_stage_4_10(P3[10], G3[10],P3[6],G3[6],P4[10],G4[10]);
operator_B operator_B_stage_4_11(P3[11], G3[11],P3[7],G3[7],P4[11],G4[11]);
operator_B operator_B_stage_4_12(P3[12], G3[12],P3[8],G3[8],P4[12],G4[12]);
operator_B operator_B_stage_4_13(P3[13], G3[13],P3[9],G3[9],P4[13],G4[13]);
operator_B operator_B_stage_4_14(P3[14], G3[14],P3[10],G3[10],P4[14],G4[14]);
operator_B operator_B_stage_4_15(P3[15], G3[15],P3[11],G3[11],P4[15],G4[15]);
 
//stage 5
wire [15:0]G5;
assign G5[0]=G4[0];
assign G5[1]=G4[1];
assign G5[2]=G4[2];
assign G5[3]=G4[3];
assign G5[4]=G4[4];
assign G5[5]=G4[5];
assign G5[6]=G4[6];
assign G5[7]=G4[7];
operator_C operator_C_stage_5_8(P4[8],G4[8],G4[0],G5[8]);
operator_C operator_C_stage_5_9(P4[9],G4[9],G4[1],G5[9]);
operator_C operator_C_stage_5_10(P4[10],G4[10],G4[2],G5[10]);
operator_C operator_C_stage_5_11(P4[11],G4[11],G4[3],G5[11]);
operator_C operator_C_stage_5_12(P4[12],G4[12],G4[4],G5[12]);
operator_C operator_C_stage_5_13(P4[13],G4[13],G4[5],G5[13]);
operator_C operator_C_stage_5_14(P4[14],G4[14],G4[6],G5[14]);
operator_C operator_C_stage_5_15(P4[15],G4[15],G4[7],G5[15]);
 
//stage 6
wire [31:0]G6;
assign G6[0]=G5[0];
assign G6[2]=G5[1];
assign G6[4]=G5[2];
assign G6[6]=G5[3];
assign G6[8]=G5[4];
assign G6[10]=G5[5];
assign G6[12]=G5[6];
assign G6[14]=G5[7];
assign G6[16]=G5[8];
assign G6[18]=G5[9];
assign G6[20]=G5[10];
assign G6[22]=G5[11];
assign G6[24]=G5[12];
assign G6[26]=G5[13];
assign G6[28]=G5[14];
assign G6[30]=G5[15];
operator_C operator_C_stage_6_0(P0[1],G0[1],G5[0],G6[1]);
operator_C operator_C_stage_6_1(P0[3],G0[3],G5[1],G6[3]);
operator_C operator_C_stage_6_2(P0[5],G0[5],G5[2],G6[5]);
operator_C operator_C_stage_6_3(P0[7],G0[7],G5[3],G6[7]);
operator_C operator_C_stage_6_4(P0[9],G0[9],G5[4],G6[9]);
operator_C operator_C_stage_6_5(P0[11],G0[11],G5[5],G6[11]);
operator_C operator_C_stage_6_6(P0[13],G0[13],G5[6],G6[13]);
operator_C operator_C_stage_6_7(P0[15],G0[15],G5[7],G6[15]);
operator_C operator_C_stage_6_8(P0[17],G0[17],G5[8],G6[17]);
operator_C operator_C_stage_6_9(P0[19],G0[19],G5[9],G6[19]);
operator_C operator_C_stage_6_10(P0[21],G0[21],G5[10],G6[21]);
operator_C operator_C_stage_6_11(P0[23],G0[23],G5[11],G6[23]);
operator_C operator_C_stage_6_12(P0[25],G0[25],G5[12],G6[25]);
operator_C operator_C_stage_6_13(P0[27],G0[27],G5[13],G6[27]);
operator_C operator_C_stage_6_14(P0[29],G0[29],G5[14],G6[29]);
operator_C operator_C_stage_6_15(P0[31],G0[31],G5[15],G6[31]);
 
assign o_s[0]=P0[0]^i_c;
assign o_s[1]=P0[1]^G6[0];
assign o_s[2]=P0[2]^G6[1];
assign o_s[3]=P0[3]^G6[2];
assign o_s[4]=P0[4]^G6[3];
assign o_s[5]=P0[5]^G6[4];
assign o_s[6]=P0[6]^G6[5];
assign o_s[7]=P0[7]^G6[6];
assign o_s[8]=P0[8]^G6[7];
assign o_s[9]=P0[9]^G6[8];
assign o_s[10]=P0[10]^G6[9];
assign o_s[11]=P0[11]^G6[10];
assign o_s[12]=P0[12]^G6[11];
assign o_s[13]=P0[13]^G6[12];
assign o_s[14]=P0[14]^G6[13];
assign o_s[15]=P0[15]^G6[14];
assign o_s[16]=P0[16]^G6[15];
assign o_s[17]=P0[17]^G6[16];
assign o_s[18]=P0[18]^G6[17];
assign o_s[19]=P0[19]^G6[18];
assign o_s[20]=P0[20]^G6[19];
assign o_s[21]=P0[21]^G6[20];
assign o_s[22]=P0[22]^G6[21];
assign o_s[23]=P0[23]^G6[22];
assign o_s[24]=P0[24]^G6[23];
assign o_s[25]=P0[25]^G6[24];
assign o_s[26]=P0[26]^G6[25];
assign o_s[27]=P0[27]^G6[26];
assign o_s[28]=P0[28]^G6[27];
assign o_s[29]=P0[29]^G6[28];
assign o_s[30]=P0[30]^G6[29];
assign o_s[31]=P0[31]^G6[30];
assign o_c=G6[31];
 
endmodule
/pid_controller/trunk/RTL/16x16bit_multiplier_pipelined.v
0,0 → 1,1413
/*16x16-bit multiplier
Author: Zhu Xu
Email: m99a1@yahoo.cn
*/
 
//Booth Encoder Array
module booth_array(
input [15:0]multiplier,
output [7:0]zero,
output [7:0]double,
output [7:0]negation
);
 
booth_radix4 booth_radix4_0(
{multiplier[1:0],1'b0},
zero[0],
double[0],
negation[0]
);
 
booth_radix4 booth_radix4_1(
multiplier[3:1],
zero[1],
double[1],
negation[1]
);
 
booth_radix4 booth_radix4_2(
multiplier[5:3],
zero[2],
double[2],
negation[2]
);
booth_radix4 booth_radix4_3(
multiplier[7:5],
zero[3],
double[3],
negation[3]
);
 
booth_radix4 booth_radix4_4(
multiplier[9:7],
zero[4],
double[4],
negation[4]
);
 
booth_radix4 booth_radix4_5(
multiplier[11:9],
zero[5],
double[5],
negation[5]
);
booth_radix4 booth_radix4_6(
multiplier[13:11],
zero[6],
double[6],
negation[6]
);
 
booth_radix4 booth_radix4_7(
multiplier[15:13],
zero[7],
double[7],
negation[7]
);
 
endmodule
 
/*partial product generator unit
generate one 17-bit partial with inversed MSB without correction bit for negation
*/
module partial_product_gen(
input [15:0]md, //multiplicand
input zero,
input double,
input negation,
output [16:0]pp
);
 
wire [15:0]nmd;
assign nmd=negation?~md:md;
 
wire [15:0]zmd;
assign zmd=zero?0:nmd;
 
assign pp=double?{~zmd[15],zmd[14:0],negation}:{~zmd[15],zmd[15:0]};
 
endmodule
 
module half_adder(
input A,
input B,
output S,
output carry
);
assign S=A^B;
assign carry=A&B;
endmodule
 
module full_adder(
input A,
input B,
input cin,
output S,
output cout
);
wire AB;
assign AB=A&B;
wire AxorB;
assign AxorB=A^B;
assign S=AxorB^cin;
assign cout=AB|(AxorB&cin);
endmodule
 
module compressor42(
input A,
input B,
input C,
input D,
input cin,
output S,
output carry,
output cout
);
wire AB;
assign AB=A&B;
wire AxorB;
assign AxorB=A^B;
wire CD;
assign CD=C&D;
wire CxorD;
assign CxorD=C^D;
 
wire AxBxCxD=AxorB^CxorD;
 
assign cout=AB|CD;
assign carry=(AB&CD)|(AxorB&CxorD)|((AxBxCxD)&cin);
 
assign S=AxBxCxD^cin;
 
endmodule
 
 
module multiplier_16x16bit_pipelined(
input i_clk,
input i_rst,
input i_start,
input [15:0]i_md,
input [15:0]i_mr,
output [31:0]o_product,
output o_ready
);
/////////////////////////////////////////////////////////////stage 0///////////////////////////////////////////////////
 
reg [15:0]md;
reg [15:0]mr;
reg stage_0_ready;
 
always @(posedge i_clk or negedge i_rst)begin
if(!i_rst)begin
md<=0;
mr<=0;
stage_0_ready<=0;
end
else begin
if(i_start)begin
md<=i_md;
mr<=i_mr;
end
stage_0_ready<=i_start;
end
end
 
wire [7:0]zero;
wire [7:0]double;
wire [7:0]negation;
 
booth_array booth_array_0(
mr,
zero,
double,
negation
);
 
 
//layer 0
wire layer_0_w0[1:0];
wire layer_0_w1;
wire layer_0_w2[2:0];
wire layer_0_w3[1:0];
wire layer_0_w4[3:0];
wire layer_0_w5[2:0];
wire layer_0_w6[4:0];
wire layer_0_w7[3:0];
wire layer_0_w8[5:0];
wire layer_0_w9[4:0];
wire layer_0_w10[6:0];
wire layer_0_w11[5:0];
wire layer_0_w12[7:0];
wire layer_0_w13[6:0];
wire layer_0_w14[8:0];
wire layer_0_w15[7:0];
wire layer_0_w16[8:0];
wire layer_0_w17[7:0];
wire layer_0_w18[6:0];
wire layer_0_w19[6:0];
wire layer_0_w20[5:0];
wire layer_0_w21[5:0];
wire layer_0_w22[4:0];
wire layer_0_w23[4:0];
wire layer_0_w24[3:0];
wire layer_0_w25[3:0];
wire layer_0_w26[2:0];
wire layer_0_w27[2:0];
wire layer_0_w28[1:0];
wire layer_0_w29[1:0];
wire layer_0_w30;
wire layer_0_w31;
partial_product_gen partial_product_gen_0(
md,
zero[0],
double[0],
negation[0],
{layer_0_w16[0],layer_0_w15[0],layer_0_w14[0],layer_0_w13[0],layer_0_w12[0],layer_0_w11[0],layer_0_w10[0],layer_0_w9[0],layer_0_w8[0],layer_0_w7[0],layer_0_w6[0],layer_0_w5[0],layer_0_w4[0],layer_0_w3[0],layer_0_w2[0],layer_0_w1,layer_0_w0[0]}
);
partial_product_gen partial_product_gen_1(
md,
zero[1],
double[1],
negation[1],
{layer_0_w18[0],layer_0_w17[0],layer_0_w16[1],layer_0_w15[1],layer_0_w14[1],layer_0_w13[1],layer_0_w12[1],layer_0_w11[1],layer_0_w10[1],layer_0_w9[1],layer_0_w8[1],layer_0_w7[1],layer_0_w6[1],layer_0_w5[1],layer_0_w4[1],layer_0_w3[1],layer_0_w2[1]}
);
partial_product_gen partial_product_gen_2(
md,
zero[2],
double[2],
negation[2],
{layer_0_w20[0],layer_0_w19[0],layer_0_w18[1],layer_0_w17[1],layer_0_w16[2],layer_0_w15[2],layer_0_w14[2],layer_0_w13[2],layer_0_w12[2],layer_0_w11[2],layer_0_w10[2],layer_0_w9[2],layer_0_w8[2],layer_0_w7[2],layer_0_w6[2],layer_0_w5[2],layer_0_w4[2]}
);
partial_product_gen partial_product_gen_3(
md,
zero[3],
double[3],
negation[3],
{layer_0_w22[0],layer_0_w21[0],layer_0_w20[1],layer_0_w19[1],layer_0_w18[2],layer_0_w17[2],layer_0_w16[3],layer_0_w15[3],layer_0_w14[3],layer_0_w13[3],layer_0_w12[3],layer_0_w11[3],layer_0_w10[3],layer_0_w9[3],layer_0_w8[3],layer_0_w7[3],layer_0_w6[3]}
);
partial_product_gen partial_product_gen_4(
md,
zero[4],
double[4],
negation[4],
{layer_0_w24[0],layer_0_w23[0],layer_0_w22[1],layer_0_w21[1],layer_0_w20[2],layer_0_w19[2],layer_0_w18[3],layer_0_w17[3],layer_0_w16[4],layer_0_w15[4],layer_0_w14[4],layer_0_w13[4],layer_0_w12[4],layer_0_w11[4],layer_0_w10[4],layer_0_w9[4],layer_0_w8[4]}
);
partial_product_gen partial_product_gen_5(
md,
zero[5],
double[5],
negation[5],
{layer_0_w26[0],layer_0_w25[0],layer_0_w24[1],layer_0_w23[1],layer_0_w22[2],layer_0_w21[2],layer_0_w20[3],layer_0_w19[3],layer_0_w18[4],layer_0_w17[4],layer_0_w16[5],layer_0_w15[5],layer_0_w14[5],layer_0_w13[5],layer_0_w12[5],layer_0_w11[5],layer_0_w10[5]}
);
partial_product_gen partial_product_gen_6(
md,
zero[6],
double[6],
negation[6],
{layer_0_w28[0],layer_0_w27[0],layer_0_w26[1],layer_0_w25[1],layer_0_w24[2],layer_0_w23[2],layer_0_w22[3],layer_0_w21[3],layer_0_w20[4],layer_0_w19[4],layer_0_w18[5],layer_0_w17[5],layer_0_w16[6],layer_0_w15[6],layer_0_w14[6],layer_0_w13[6],layer_0_w12[6]}
);
partial_product_gen partial_product_gen_7(
md,
zero[7],
double[7],
negation[7],
{layer_0_w30,layer_0_w29[0],layer_0_w28[1],layer_0_w27[1],layer_0_w26[2],layer_0_w25[2],layer_0_w24[3],layer_0_w23[3],layer_0_w22[4],layer_0_w21[4],layer_0_w20[5],layer_0_w19[5],layer_0_w18[6],layer_0_w17[6],layer_0_w16[7],layer_0_w15[7],layer_0_w14[7]}
);
//correction for negation
assign layer_0_w0[1]=negation[0];
//sign extension
assign layer_0_w16[8]=1;
assign layer_0_w17[7]=1;
//correction for negation
assign layer_0_w2[2]=negation[1];
//sign extension
assign layer_0_w19[6]=1;
//correction for negation
assign layer_0_w4[3]=negation[2];
//sign extension
assign layer_0_w21[5]=1;
//correction for negation
assign layer_0_w6[4]=negation[3];
//sign extension
assign layer_0_w23[4]=1;
//correction for negation
assign layer_0_w8[5]=negation[4];
//sign extension
assign layer_0_w25[3]=1;
//correction for negation
assign layer_0_w10[6]=negation[5];
//sign extension
assign layer_0_w27[2]=1;
//correction for negation
assign layer_0_w12[7]=negation[6];
//sign extension
assign layer_0_w29[1]=1;
//correction for negation
assign layer_0_w14[8]=negation[7];
//sign extension
assign layer_0_w31=1;
 
//layer 1
wire layer_1_w0[1:0];
wire layer_1_w1;
wire layer_1_w2[2:0];
wire layer_1_w3[1:0];
wire layer_1_w4[1:0];
wire layer_1_w5[1:0];
wire layer_1_w6[1:0];
wire layer_1_w7[3:0];
wire layer_1_w8[2:0];
wire layer_1_w9[2:0];
wire layer_1_w10[4:0];
wire layer_1_w11[3:0];
wire layer_1_w12[3:0];
wire layer_1_w13[5:0];
wire layer_1_w14[4:0];
wire layer_1_w15[4:0];
wire layer_1_w16[5:0];
wire layer_1_w17[4:0];
wire layer_1_w18[5:0];
wire layer_1_w19[4:0];
wire layer_1_w20[3:0];
wire layer_1_w21[3:0];
wire layer_1_w22[2:0];
wire layer_1_w23[2:0];
wire layer_1_w24[3:0];
wire layer_1_w25[2:0];
wire layer_1_w26[1:0];
wire layer_1_w27[1:0];
wire layer_1_w28[2:0];
wire layer_1_w29[1:0];
wire layer_1_w30;
wire layer_1_w31;
assign layer_1_w0[0]=layer_0_w0[0];
assign layer_1_w0[1]=layer_0_w0[1];
assign layer_1_w1=layer_0_w1;
assign layer_1_w2[0]=layer_0_w2[0];
assign layer_1_w2[1]=layer_0_w2[1];
assign layer_1_w2[2]=layer_0_w2[2];
assign layer_1_w3[0]=layer_0_w3[0];
assign layer_1_w3[1]=layer_0_w3[1];
full_adder layer_1_full_adder_0(
layer_0_w4[0],
layer_0_w4[1],
layer_0_w4[2],
layer_1_w4[0],
layer_1_w5[0]
);
assign layer_1_w4[1]=layer_0_w4[3];
full_adder layer_1_full_adder_1(
layer_0_w5[0],
layer_0_w5[1],
layer_0_w5[2],
layer_1_w5[1],
layer_1_w6[0]
);
compressor42 layer_1_compressor42_0(
layer_0_w6[0],
layer_0_w6[1],
layer_0_w6[2],
layer_0_w6[3],
layer_0_w6[4],
layer_1_w6[1],
layer_1_w7[0],
layer_1_w7[1]
);
full_adder layer_1_full_adder_2(
layer_0_w7[0],
layer_0_w7[1],
layer_0_w7[2],
layer_1_w7[2],
layer_1_w8[0]
);
assign layer_1_w7[3]=layer_0_w7[3];
compressor42 layer_1_compressor42_1(
layer_0_w8[0],
layer_0_w8[1],
layer_0_w8[2],
layer_0_w8[3],
layer_0_w8[4],
layer_1_w8[1],
layer_1_w9[0],
layer_1_w9[1]
);
assign layer_1_w8[2]=layer_0_w8[5];
compressor42 layer_1_compressor42_2(
layer_0_w9[0],
layer_0_w9[1],
layer_0_w9[2],
layer_0_w9[3],
layer_0_w9[4],
layer_1_w9[2],
layer_1_w10[0],
layer_1_w10[1]
);
compressor42 layer_1_compressor42_3(
layer_0_w10[0],
layer_0_w10[1],
layer_0_w10[2],
layer_0_w10[3],
layer_0_w10[4],
layer_1_w10[2],
layer_1_w11[0],
layer_1_w11[1]
);
assign layer_1_w10[3]=layer_0_w10[5];
assign layer_1_w10[4]=layer_0_w10[6];
compressor42 layer_1_compressor42_4(
layer_0_w11[0],
layer_0_w11[1],
layer_0_w11[2],
layer_0_w11[3],
layer_0_w11[4],
layer_1_w11[2],
layer_1_w12[0],
layer_1_w12[1]
);
assign layer_1_w11[3]=layer_0_w11[5];
compressor42 layer_1_compressor42_5(
layer_0_w12[0],
layer_0_w12[1],
layer_0_w12[2],
layer_0_w12[3],
layer_0_w12[4],
layer_1_w12[2],
layer_1_w13[0],
layer_1_w13[1]
);
full_adder layer_1_full_adder_3(
layer_0_w12[5],
layer_0_w12[6],
layer_0_w12[7],
layer_1_w12[3],
layer_1_w13[2]
);
compressor42 layer_1_compressor42_6(
layer_0_w13[0],
layer_0_w13[1],
layer_0_w13[2],
layer_0_w13[3],
layer_0_w13[4],
layer_1_w13[3],
layer_1_w14[0],
layer_1_w14[1]
);
assign layer_1_w13[4]=layer_0_w13[5];
assign layer_1_w13[5]=layer_0_w13[6];
compressor42 layer_1_compressor42_7(
layer_0_w14[0],
layer_0_w14[1],
layer_0_w14[2],
layer_0_w14[3],
layer_0_w14[4],
layer_1_w14[2],
layer_1_w15[0],
layer_1_w15[1]
);
full_adder layer_1_full_adder_4(
layer_0_w14[5],
layer_0_w14[6],
layer_0_w14[7],
layer_1_w14[3],
layer_1_w15[2]
);
assign layer_1_w14[4]=layer_0_w14[8];
compressor42 layer_1_compressor42_8(
layer_0_w15[0],
layer_0_w15[1],
layer_0_w15[2],
layer_0_w15[3],
layer_0_w15[4],
layer_1_w15[3],
layer_1_w16[0],
layer_1_w16[1]
);
full_adder layer_1_full_adder_5(
layer_0_w15[5],
layer_0_w15[6],
layer_0_w15[7],
layer_1_w15[4],
layer_1_w16[2]
);
compressor42 layer_1_compressor42_9(
layer_0_w16[0],
layer_0_w16[1],
layer_0_w16[2],
layer_0_w16[3],
layer_0_w16[4],
layer_1_w16[3],
layer_1_w17[0],
layer_1_w17[1]
);
full_adder layer_1_full_adder_6(
layer_0_w16[5],
layer_0_w16[6],
layer_0_w16[7],
layer_1_w16[4],
layer_1_w17[2]
);
assign layer_1_w16[5]=layer_0_w16[8];
compressor42 layer_1_compressor42_10(
layer_0_w17[0],
layer_0_w17[1],
layer_0_w17[2],
layer_0_w17[3],
layer_0_w17[4],
layer_1_w17[3],
layer_1_w18[0],
layer_1_w18[1]
);
full_adder layer_1_full_adder_7(
layer_0_w17[5],
layer_0_w17[6],
layer_0_w17[7],
layer_1_w17[4],
layer_1_w18[2]
);
compressor42 layer_1_compressor42_11(
layer_0_w18[0],
layer_0_w18[1],
layer_0_w18[2],
layer_0_w18[3],
layer_0_w18[4],
layer_1_w18[3],
layer_1_w19[0],
layer_1_w19[1]
);
assign layer_1_w18[4]=layer_0_w18[5];
assign layer_1_w18[5]=layer_0_w18[6];
compressor42 layer_1_compressor42_12(
layer_0_w19[0],
layer_0_w19[1],
layer_0_w19[2],
layer_0_w19[3],
layer_0_w19[4],
layer_1_w19[2],
layer_1_w20[0],
layer_1_w20[1]
);
assign layer_1_w19[3]=layer_0_w19[5];
assign layer_1_w19[4]=layer_0_w19[6];
compressor42 layer_1_compressor42_13(
layer_0_w20[0],
layer_0_w20[1],
layer_0_w20[2],
layer_0_w20[3],
layer_0_w20[4],
layer_1_w20[2],
layer_1_w21[0],
layer_1_w21[1]
);
assign layer_1_w20[3]=layer_0_w20[5];
compressor42 layer_1_compressor42_14(
layer_0_w21[0],
layer_0_w21[1],
layer_0_w21[2],
layer_0_w21[3],
layer_0_w21[4],
layer_1_w21[2],
layer_1_w22[0],
layer_1_w22[1]
);
assign layer_1_w21[3]=layer_0_w21[5];
compressor42 layer_1_compressor42_15(
layer_0_w22[0],
layer_0_w22[1],
layer_0_w22[2],
layer_0_w22[3],
layer_0_w22[4],
layer_1_w22[2],
layer_1_w23[0],
layer_1_w23[1]
);
compressor42 layer_1_compressor42_16(
layer_0_w23[0],
layer_0_w23[1],
layer_0_w23[2],
layer_0_w23[3],
layer_0_w23[4],
layer_1_w23[2],
layer_1_w24[0],
layer_1_w24[1]
);
full_adder layer_1_full_adder_8(
layer_0_w24[0],
layer_0_w24[1],
layer_0_w24[2],
layer_1_w24[2],
layer_1_w25[0]
);
assign layer_1_w24[3]=layer_0_w24[3];
full_adder layer_1_full_adder_9(
layer_0_w25[0],
layer_0_w25[1],
layer_0_w25[2],
layer_1_w25[1],
layer_1_w26[0]
);
assign layer_1_w25[2]=layer_0_w25[3];
full_adder layer_1_full_adder_10(
layer_0_w26[0],
layer_0_w26[1],
layer_0_w26[2],
layer_1_w26[1],
layer_1_w27[0]
);
full_adder layer_1_full_adder_11(
layer_0_w27[0],
layer_0_w27[1],
layer_0_w27[2],
layer_1_w27[1],
layer_1_w28[0]
);
assign layer_1_w28[1]=layer_0_w28[0];
assign layer_1_w28[2]=layer_0_w28[1];
assign layer_1_w29[0]=layer_0_w29[0];
assign layer_1_w29[1]=layer_0_w29[1];
assign layer_1_w30=layer_0_w30;
assign layer_1_w31=layer_0_w31;
 
//layer 2
wire [1:0]layer_2_w0;
wire layer_2_w1;
wire [2:0]layer_2_w2;
wire [1:0]layer_2_w3;
wire [1:0]layer_2_w4;
wire [1:0]layer_2_w5;
wire [1:0]layer_2_w6;
wire [1:0]layer_2_w7;
wire [1:0]layer_2_w8;
wire [1:0]layer_2_w9;
wire [1:0]layer_2_w10;
wire [3:0]layer_2_w11;
wire [2:0]layer_2_w12;
wire [2:0]layer_2_w13;
wire [2:0]layer_2_w14;
wire [2:0]layer_2_w15;
wire [3:0]layer_2_w16;
wire [2:0]layer_2_w17;
wire [3:0]layer_2_w18;
wire [2:0]layer_2_w19;
wire [3:0]layer_2_w20;
wire [2:0]layer_2_w21;
wire [1:0]layer_2_w22;
wire [1:0]layer_2_w23;
wire [2:0]layer_2_w24;
wire [1:0]layer_2_w25;
wire [2:0]layer_2_w26;
wire [1:0]layer_2_w27;
wire layer_2_w28;
wire [2:0]layer_2_w29;
wire layer_2_w30;
wire layer_2_w31;
assign layer_2_w0[0]=layer_1_w0[0];
assign layer_2_w0[1]=layer_1_w0[1];
assign layer_2_w1=layer_1_w1;
assign layer_2_w2[0]=layer_1_w2[0];
assign layer_2_w2[1]=layer_1_w2[1];
assign layer_2_w2[2]=layer_1_w2[2];
assign layer_2_w3[0]=layer_1_w3[0];
assign layer_2_w3[1]=layer_1_w3[1];
assign layer_2_w4[0]=layer_1_w4[0];
assign layer_2_w4[1]=layer_1_w4[1];
assign layer_2_w5[0]=layer_1_w5[0];
assign layer_2_w5[1]=layer_1_w5[1];
assign layer_2_w6[0]=layer_1_w6[0];
assign layer_2_w6[1]=layer_1_w6[1];
full_adder layer_2_full_adder_0(
layer_1_w7[0],
layer_1_w7[1],
layer_1_w7[2],
layer_2_w7[0],
layer_2_w8[0]
);
assign layer_2_w7[1]=layer_1_w7[3];
full_adder layer_2_full_adder_1(
layer_1_w8[0],
layer_1_w8[1],
layer_1_w8[2],
layer_2_w8[1],
layer_2_w9[0]
);
full_adder layer_2_full_adder_2(
layer_1_w9[0],
layer_1_w9[1],
layer_1_w9[2],
layer_2_w9[1],
layer_2_w10[0]
);
compressor42 layer_2_compressor42_0(
layer_1_w10[0],
layer_1_w10[1],
layer_1_w10[2],
layer_1_w10[3],
layer_1_w10[4],
layer_2_w10[1],
layer_2_w11[0],
layer_2_w11[1]
);
full_adder layer_2_full_adder_3(
layer_1_w11[0],
layer_1_w11[1],
layer_1_w11[2],
layer_2_w11[2],
layer_2_w12[0]
);
assign layer_2_w11[3]=layer_1_w11[3];
full_adder layer_2_full_adder_4(
layer_1_w12[0],
layer_1_w12[1],
layer_1_w12[2],
layer_2_w12[1],
layer_2_w13[0]
);
assign layer_2_w12[2]=layer_1_w12[3];
compressor42 layer_2_compressor42_1(
layer_1_w13[0],
layer_1_w13[1],
layer_1_w13[2],
layer_1_w13[3],
layer_1_w13[4],
layer_2_w13[1],
layer_2_w14[0],
layer_2_w14[1]
);
assign layer_2_w13[2]=layer_1_w13[5];
compressor42 layer_2_compressor42_2(
layer_1_w14[0],
layer_1_w14[1],
layer_1_w14[2],
layer_1_w14[3],
layer_1_w14[4],
layer_2_w14[2],
layer_2_w15[0],
layer_2_w15[1]
);
compressor42 layer_2_compressor42_3(
layer_1_w15[0],
layer_1_w15[1],
layer_1_w15[2],
layer_1_w15[3],
layer_1_w15[4],
layer_2_w15[2],
layer_2_w16[0],
layer_2_w16[1]
);
compressor42 layer_2_compressor42_4(
layer_1_w16[0],
layer_1_w16[1],
layer_1_w16[2],
layer_1_w16[3],
layer_1_w16[4],
layer_2_w16[2],
layer_2_w17[0],
layer_2_w17[1]
);
assign layer_2_w16[3]=layer_1_w16[5];
compressor42 layer_2_compressor42_5(
layer_1_w17[0],
layer_1_w17[1],
layer_1_w17[2],
layer_1_w17[3],
layer_1_w17[4],
layer_2_w17[2],
layer_2_w18[0],
layer_2_w18[1]
);
compressor42 layer_2_compressor42_6(
layer_1_w18[0],
layer_1_w18[1],
layer_1_w18[2],
layer_1_w18[3],
layer_1_w18[4],
layer_2_w18[2],
layer_2_w19[0],
layer_2_w19[1]
);
assign layer_2_w18[3]=layer_1_w18[5];
compressor42 layer_2_compressor42_7(
layer_1_w19[0],
layer_1_w19[1],
layer_1_w19[2],
layer_1_w19[3],
layer_1_w19[4],
layer_2_w19[2],
layer_2_w20[0],
layer_2_w20[1]
);
full_adder layer_2_full_adder_5(
layer_1_w20[0],
layer_1_w20[1],
layer_1_w20[2],
layer_2_w20[2],
layer_2_w21[0]
);
assign layer_2_w20[3]=layer_1_w20[3];
full_adder layer_2_full_adder_6(
layer_1_w21[0],
layer_1_w21[1],
layer_1_w21[2],
layer_2_w21[1],
layer_2_w22[0]
);
assign layer_2_w21[2]=layer_1_w21[3];
full_adder layer_2_full_adder_7(
layer_1_w22[0],
layer_1_w22[1],
layer_1_w22[2],
layer_2_w22[1],
layer_2_w23[0]
);
full_adder layer_2_full_adder_8(
layer_1_w23[0],
layer_1_w23[1],
layer_1_w23[2],
layer_2_w23[1],
layer_2_w24[0]
);
full_adder layer_2_full_adder_9(
layer_1_w24[0],
layer_1_w24[1],
layer_1_w24[2],
layer_2_w24[1],
layer_2_w25[0]
);
assign layer_2_w24[2]=layer_1_w24[3];
full_adder layer_2_full_adder_10(
layer_1_w25[0],
layer_1_w25[1],
layer_1_w25[2],
layer_2_w25[1],
layer_2_w26[0]
);
assign layer_2_w26[1]=layer_1_w26[0];
assign layer_2_w26[2]=layer_1_w26[1];
assign layer_2_w27[0]=layer_1_w27[0];
assign layer_2_w27[1]=layer_1_w27[1];
full_adder layer_2_full_adder_11(
layer_1_w28[0],
layer_1_w28[1],
layer_1_w28[2],
layer_2_w28,
layer_2_w29[0]
);
assign layer_2_w29[1]=layer_1_w29[0];
assign layer_2_w29[2]=layer_1_w29[1];
assign layer_2_w30=layer_1_w30;
assign layer_2_w31=layer_1_w31;
 
 
///////////////////////////////////////////////////////stage 1///////////////////////////////////////////////////////
reg [1:0]reg_layer_2_w0;
reg reg_layer_2_w1;
reg [2:0]reg_layer_2_w2;
reg [1:0]reg_layer_2_w3;
reg [1:0]reg_layer_2_w4;
reg [1:0]reg_layer_2_w5;
reg [1:0]reg_layer_2_w6;
reg [1:0]reg_layer_2_w7;
reg [1:0]reg_layer_2_w8;
reg [1:0]reg_layer_2_w9;
reg [1:0]reg_layer_2_w10;
reg [3:0]reg_layer_2_w11;
reg [2:0]reg_layer_2_w12;
reg [2:0]reg_layer_2_w13;
reg [2:0]reg_layer_2_w14;
reg [2:0]reg_layer_2_w15;
reg [3:0]reg_layer_2_w16;
reg [2:0]reg_layer_2_w17;
reg [3:0]reg_layer_2_w18;
reg [2:0]reg_layer_2_w19;
reg [3:0]reg_layer_2_w20;
reg [2:0]reg_layer_2_w21;
reg [1:0]reg_layer_2_w22;
reg [1:0]reg_layer_2_w23;
reg [2:0]reg_layer_2_w24;
reg [1:0]reg_layer_2_w25;
reg [2:0]reg_layer_2_w26;
reg [1:0]reg_layer_2_w27;
reg reg_layer_2_w28;
reg [2:0]reg_layer_2_w29;
reg reg_layer_2_w30;
reg reg_layer_2_w31;
reg stage_1_ready;
assign o_ready=stage_1_ready;
 
always @(posedge i_clk or negedge i_rst)begin
if(!i_rst)begin
stage_1_ready<=0;
reg_layer_2_w0<=0;
reg_layer_2_w1<=0;
reg_layer_2_w2<=0;
reg_layer_2_w3<=0;
reg_layer_2_w4<=0;
reg_layer_2_w5<=0;
reg_layer_2_w6<=0;
reg_layer_2_w7<=0;
reg_layer_2_w8<=0;
reg_layer_2_w9<=0;
reg_layer_2_w10<=0;
reg_layer_2_w11<=0;
reg_layer_2_w12<=0;
reg_layer_2_w13<=0;
reg_layer_2_w14<=0;
reg_layer_2_w15<=0;
reg_layer_2_w16<=0;
reg_layer_2_w17<=0;
reg_layer_2_w18<=0;
reg_layer_2_w19<=0;
reg_layer_2_w20<=0;
reg_layer_2_w21<=0;
reg_layer_2_w22<=0;
reg_layer_2_w23<=0;
reg_layer_2_w24<=0;
reg_layer_2_w25<=0;
reg_layer_2_w26<=0;
reg_layer_2_w27<=0;
reg_layer_2_w28<=0;
reg_layer_2_w29<=0;
reg_layer_2_w30<=0;
reg_layer_2_w31<=0;
end
else begin
if(stage_0_ready)begin
reg_layer_2_w0<=layer_2_w0;
reg_layer_2_w1<=layer_2_w1;
reg_layer_2_w2<=layer_2_w2;
reg_layer_2_w3<=layer_2_w3;
reg_layer_2_w4<=layer_2_w4;
reg_layer_2_w5<=layer_2_w5;
reg_layer_2_w6<=layer_2_w6;
reg_layer_2_w7<=layer_2_w7;
reg_layer_2_w8<=layer_2_w8;
reg_layer_2_w9<=layer_2_w9;
reg_layer_2_w10<=layer_2_w10;
reg_layer_2_w11<=layer_2_w11;
reg_layer_2_w12<=layer_2_w12;
reg_layer_2_w13<=layer_2_w13;
reg_layer_2_w14<=layer_2_w14;
reg_layer_2_w15<=layer_2_w15;
reg_layer_2_w16<=layer_2_w16;
reg_layer_2_w17<=layer_2_w17;
reg_layer_2_w18<=layer_2_w18;
reg_layer_2_w19<=layer_2_w19;
reg_layer_2_w20<=layer_2_w20;
reg_layer_2_w21<=layer_2_w21;
reg_layer_2_w22<=layer_2_w22;
reg_layer_2_w23<=layer_2_w23;
reg_layer_2_w24<=layer_2_w24;
reg_layer_2_w25<=layer_2_w25;
reg_layer_2_w26<=layer_2_w26;
reg_layer_2_w27<=layer_2_w27;
reg_layer_2_w28<=layer_2_w28;
reg_layer_2_w29<=layer_2_w29;
reg_layer_2_w30<=layer_2_w30;
reg_layer_2_w31<=layer_2_w31;
end
stage_1_ready<=stage_0_ready;
end
end
 
//layer 3
wire layer_3_w0[1:0];
wire layer_3_w1;
wire layer_3_w2[2:0];
wire layer_3_w3[1:0];
wire layer_3_w4[1:0];
wire layer_3_w5[1:0];
wire layer_3_w6[1:0];
wire layer_3_w7[1:0];
wire layer_3_w8[1:0];
wire layer_3_w9[1:0];
wire layer_3_w10[1:0];
wire layer_3_w11[1:0];
wire layer_3_w12[1:0];
wire layer_3_w13[1:0];
wire layer_3_w14[1:0];
wire layer_3_w15[1:0];
wire layer_3_w16[2:0];
wire layer_3_w17[1:0];
wire layer_3_w18[2:0];
wire layer_3_w19[1:0];
wire layer_3_w20[2:0];
wire layer_3_w21[1:0];
wire layer_3_w22[2:0];
wire layer_3_w23[1:0];
wire layer_3_w24;
wire layer_3_w25[2:0];
wire layer_3_w26;
wire layer_3_w27[2:0];
wire layer_3_w28;
wire layer_3_w29;
wire layer_3_w30[1:0];
wire layer_3_w31;
assign layer_3_w0[0]=reg_layer_2_w0[0];
assign layer_3_w0[1]=reg_layer_2_w0[1];
assign layer_3_w1=reg_layer_2_w1;
assign layer_3_w2[0]=reg_layer_2_w2[0];
assign layer_3_w2[1]=reg_layer_2_w2[1];
assign layer_3_w2[2]=reg_layer_2_w2[2];
assign layer_3_w3[0]=reg_layer_2_w3[0];
assign layer_3_w3[1]=reg_layer_2_w3[1];
assign layer_3_w4[0]=reg_layer_2_w4[0];
assign layer_3_w4[1]=reg_layer_2_w4[1];
assign layer_3_w5[0]=reg_layer_2_w5[0];
assign layer_3_w5[1]=reg_layer_2_w5[1];
assign layer_3_w6[0]=reg_layer_2_w6[0];
assign layer_3_w6[1]=reg_layer_2_w6[1];
assign layer_3_w7[0]=reg_layer_2_w7[0];
assign layer_3_w7[1]=reg_layer_2_w7[1];
assign layer_3_w8[0]=reg_layer_2_w8[0];
assign layer_3_w8[1]=reg_layer_2_w8[1];
assign layer_3_w9[0]=reg_layer_2_w9[0];
assign layer_3_w9[1]=reg_layer_2_w9[1];
assign layer_3_w10[0]=reg_layer_2_w10[0];
assign layer_3_w10[1]=reg_layer_2_w10[1];
full_adder layer_3_full_adder_0(
reg_layer_2_w11[0],
reg_layer_2_w11[1],
reg_layer_2_w11[2],
layer_3_w11[0],
layer_3_w12[0]
);
assign layer_3_w11[1]=reg_layer_2_w11[3];
full_adder layer_3_full_adder_1(
reg_layer_2_w12[0],
reg_layer_2_w12[1],
reg_layer_2_w12[2],
layer_3_w12[1],
layer_3_w13[0]
);
full_adder layer_3_full_adder_2(
reg_layer_2_w13[0],
reg_layer_2_w13[1],
reg_layer_2_w13[2],
layer_3_w13[1],
layer_3_w14[0]
);
full_adder layer_3_full_adder_3(
reg_layer_2_w14[0],
reg_layer_2_w14[1],
reg_layer_2_w14[2],
layer_3_w14[1],
layer_3_w15[0]
);
full_adder layer_3_full_adder_4(
reg_layer_2_w15[0],
reg_layer_2_w15[1],
reg_layer_2_w15[2],
layer_3_w15[1],
layer_3_w16[0]
);
full_adder layer_3_full_adder_5(
reg_layer_2_w16[0],
reg_layer_2_w16[1],
reg_layer_2_w16[2],
layer_3_w16[1],
layer_3_w17[0]
);
assign layer_3_w16[2]=reg_layer_2_w16[3];
full_adder layer_3_full_adder_6(
reg_layer_2_w17[0],
reg_layer_2_w17[1],
reg_layer_2_w17[2],
layer_3_w17[1],
layer_3_w18[0]
);
full_adder layer_3_full_adder_7(
reg_layer_2_w18[0],
reg_layer_2_w18[1],
reg_layer_2_w18[2],
layer_3_w18[1],
layer_3_w19[0]
);
assign layer_3_w18[2]=reg_layer_2_w18[3];
full_adder layer_3_full_adder_8(
reg_layer_2_w19[0],
reg_layer_2_w19[1],
reg_layer_2_w19[2],
layer_3_w19[1],
layer_3_w20[0]
);
full_adder layer_3_full_adder_9(
reg_layer_2_w20[0],
reg_layer_2_w20[1],
reg_layer_2_w20[2],
layer_3_w20[1],
layer_3_w21[0]
);
assign layer_3_w20[2]=reg_layer_2_w20[3];
full_adder layer_3_full_adder_10(
reg_layer_2_w21[0],
reg_layer_2_w21[1],
reg_layer_2_w21[2],
layer_3_w21[1],
layer_3_w22[0]
);
assign layer_3_w22[1]=reg_layer_2_w22[0];
assign layer_3_w22[2]=reg_layer_2_w22[1];
assign layer_3_w23[0]=reg_layer_2_w23[0];
assign layer_3_w23[1]=reg_layer_2_w23[1];
full_adder layer_3_full_adder_11(
reg_layer_2_w24[0],
reg_layer_2_w24[1],
reg_layer_2_w24[2],
layer_3_w24,
layer_3_w25[0]
);
assign layer_3_w25[1]=reg_layer_2_w25[0];
assign layer_3_w25[2]=reg_layer_2_w25[1];
full_adder layer_3_full_adder_12(
reg_layer_2_w26[0],
reg_layer_2_w26[1],
reg_layer_2_w26[2],
layer_3_w26,
layer_3_w27[0]
);
assign layer_3_w27[1]=reg_layer_2_w27[0];
assign layer_3_w27[2]=reg_layer_2_w27[1];
assign layer_3_w28=reg_layer_2_w28;
full_adder layer_3_full_adder_13(
reg_layer_2_w29[0],
reg_layer_2_w29[1],
reg_layer_2_w29[2],
layer_3_w29,
layer_3_w30[0]
);
assign layer_3_w30[1]=reg_layer_2_w30;
assign layer_3_w31=reg_layer_2_w31;
 
//layer 4
wire layer_4_w0[1:0];
wire layer_4_w1;
wire layer_4_w2;
wire layer_4_w3[1:0];
wire layer_4_w4[1:0];
wire layer_4_w5[1:0];
wire layer_4_w6[1:0];
wire layer_4_w7[1:0];
wire layer_4_w8[1:0];
wire layer_4_w9[1:0];
wire layer_4_w10[1:0];
wire layer_4_w11[1:0];
wire layer_4_w12[1:0];
wire layer_4_w13[1:0];
wire layer_4_w14[1:0];
wire layer_4_w15[1:0];
wire layer_4_w16[1:0];
wire layer_4_w17[1:0];
wire layer_4_w18[1:0];
wire layer_4_w19[1:0];
wire layer_4_w20[1:0];
wire layer_4_w21[1:0];
wire layer_4_w22[1:0];
wire layer_4_w23[1:0];
wire layer_4_w24[1:0];
wire layer_4_w25;
wire layer_4_w26[1:0];
wire layer_4_w27;
wire layer_4_w28[1:0];
wire layer_4_w29;
wire layer_4_w30[1:0];
wire layer_4_w31;
assign layer_4_w0[0]=layer_3_w0[0];
assign layer_4_w0[1]=layer_3_w0[1];
assign layer_4_w1=layer_3_w1;
full_adder layer_4_full_adder_0(
layer_3_w2[0],
layer_3_w2[1],
layer_3_w2[2],
layer_4_w2,
layer_4_w3[0]
);
half_adder layer_4_half_adder_0(
layer_3_w3[0],
layer_3_w3[1],
layer_4_w3[1],
layer_4_w4[0]
);
half_adder layer_4_half_adder_1(
layer_3_w4[0],
layer_3_w4[1],
layer_4_w4[1],
layer_4_w5[0]
);
half_adder layer_4_half_adder_2(
layer_3_w5[0],
layer_3_w5[1],
layer_4_w5[1],
layer_4_w6[0]
);
half_adder layer_4_half_adder_3(
layer_3_w6[0],
layer_3_w6[1],
layer_4_w6[1],
layer_4_w7[0]
);
half_adder layer_4_half_adder_4(
layer_3_w7[0],
layer_3_w7[1],
layer_4_w7[1],
layer_4_w8[0]
);
half_adder layer_4_half_adder_5(
layer_3_w8[0],
layer_3_w8[1],
layer_4_w8[1],
layer_4_w9[0]
);
half_adder layer_4_half_adder_6(
layer_3_w9[0],
layer_3_w9[1],
layer_4_w9[1],
layer_4_w10[0]
);
half_adder layer_4_half_adder_7(
layer_3_w10[0],
layer_3_w10[1],
layer_4_w10[1],
layer_4_w11[0]
);
half_adder layer_4_half_adder_8(
layer_3_w11[0],
layer_3_w11[1],
layer_4_w11[1],
layer_4_w12[0]
);
half_adder layer_4_half_adder_9(
layer_3_w12[0],
layer_3_w12[1],
layer_4_w12[1],
layer_4_w13[0]
);
half_adder layer_4_half_adder_10(
layer_3_w13[0],
layer_3_w13[1],
layer_4_w13[1],
layer_4_w14[0]
);
half_adder layer_4_half_adder_11(
layer_3_w14[0],
layer_3_w14[1],
layer_4_w14[1],
layer_4_w15[0]
);
half_adder layer_4_half_adder_12(
layer_3_w15[0],
layer_3_w15[1],
layer_4_w15[1],
layer_4_w16[0]
);
full_adder layer_4_full_adder_1(
layer_3_w16[0],
layer_3_w16[1],
layer_3_w16[2],
layer_4_w16[1],
layer_4_w17[0]
);
half_adder layer_4_half_adder_13(
layer_3_w17[0],
layer_3_w17[1],
layer_4_w17[1],
layer_4_w18[0]
);
full_adder layer_4_full_adder_2(
layer_3_w18[0],
layer_3_w18[1],
layer_3_w18[2],
layer_4_w18[1],
layer_4_w19[0]
);
half_adder layer_4_half_adder_14(
layer_3_w19[0],
layer_3_w19[1],
layer_4_w19[1],
layer_4_w20[0]
);
full_adder layer_4_full_adder_3(
layer_3_w20[0],
layer_3_w20[1],
layer_3_w20[2],
layer_4_w20[1],
layer_4_w21[0]
);
half_adder layer_4_half_adder_15(
layer_3_w21[0],
layer_3_w21[1],
layer_4_w21[1],
layer_4_w22[0]
);
full_adder layer_4_full_adder_4(
layer_3_w22[0],
layer_3_w22[1],
layer_3_w22[2],
layer_4_w22[1],
layer_4_w23[0]
);
half_adder layer_4_half_adder_16(
layer_3_w23[0],
layer_3_w23[1],
layer_4_w23[1],
layer_4_w24[0]
);
assign layer_4_w24[1]=layer_3_w24;
full_adder layer_4_full_adder_5(
layer_3_w25[0],
layer_3_w25[1],
layer_3_w25[2],
layer_4_w25,
layer_4_w26[0]
);
assign layer_4_w26[1]=layer_3_w26;
full_adder layer_4_full_adder_6(
layer_3_w27[0],
layer_3_w27[1],
layer_3_w27[2],
layer_4_w27,
layer_4_w28[0]
);
assign layer_4_w28[1]=layer_3_w28;
assign layer_4_w29=layer_3_w29;
assign layer_4_w30[0]=layer_3_w30[0];
assign layer_4_w30[1]=layer_3_w30[1];
assign layer_4_w31=layer_3_w31;
 
//group reduction results into 2 numbers
wire [31:0]A,B;
assign A[0]=layer_4_w0[0];
assign B[0]=layer_4_w0[1];
assign A[1]=layer_4_w1;
assign B[1]=0;
assign A[2]=layer_4_w2;
assign B[2]=0;
assign A[3]=layer_4_w3[0];
assign B[3]=layer_4_w3[1];
assign A[4]=layer_4_w4[0];
assign B[4]=layer_4_w4[1];
assign A[5]=layer_4_w5[0];
assign B[5]=layer_4_w5[1];
assign A[6]=layer_4_w6[0];
assign B[6]=layer_4_w6[1];
assign A[7]=layer_4_w7[0];
assign B[7]=layer_4_w7[1];
assign A[8]=layer_4_w8[0];
assign B[8]=layer_4_w8[1];
assign A[9]=layer_4_w9[0];
assign B[9]=layer_4_w9[1];
assign A[10]=layer_4_w10[0];
assign B[10]=layer_4_w10[1];
assign A[11]=layer_4_w11[0];
assign B[11]=layer_4_w11[1];
assign A[12]=layer_4_w12[0];
assign B[12]=layer_4_w12[1];
assign A[13]=layer_4_w13[0];
assign B[13]=layer_4_w13[1];
assign A[14]=layer_4_w14[0];
assign B[14]=layer_4_w14[1];
assign A[15]=layer_4_w15[0];
assign B[15]=layer_4_w15[1];
assign A[16]=layer_4_w16[0];
assign B[16]=layer_4_w16[1];
assign A[17]=layer_4_w17[0];
assign B[17]=layer_4_w17[1];
assign A[18]=layer_4_w18[0];
assign B[18]=layer_4_w18[1];
assign A[19]=layer_4_w19[0];
assign B[19]=layer_4_w19[1];
assign A[20]=layer_4_w20[0];
assign B[20]=layer_4_w20[1];
assign A[21]=layer_4_w21[0];
assign B[21]=layer_4_w21[1];
assign A[22]=layer_4_w22[0];
assign B[22]=layer_4_w22[1];
assign A[23]=layer_4_w23[0];
assign B[23]=layer_4_w23[1];
assign A[24]=layer_4_w24[0];
assign B[24]=layer_4_w24[1];
assign A[25]=layer_4_w25;
assign B[25]=0;
assign A[26]=layer_4_w26[0];
assign B[26]=layer_4_w26[1];
assign A[27]=layer_4_w27;
assign B[27]=0;
assign A[28]=layer_4_w28[0];
assign B[28]=layer_4_w28[1];
assign A[29]=layer_4_w29;
assign B[29]=0;
assign A[30]=layer_4_w30[0];
assign B[30]=layer_4_w30[1];
assign A[31]=layer_4_w31;
assign B[31]=0;
 
wire carry;
adder_32bit adder_32bit(
A,
B,
1'b0,
o_product,
carry
);
 
 
endmodule
/pid_controller/trunk/RTL/PID_defines.v
0,0 → 1,8
//`define wb_16bit
`define wb_32bit
//`define wb_64bit
 
 
//`define PID_test
 
//`define PID_direct_test
/pid_controller/trunk/doc/PID controller_UM.pdf Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
pid_controller/trunk/doc/PID controller_UM.pdf Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.