|
|
/*********************************************************/
// 모듈:cmp32
// 파일이름:cmp32.v
// 버젼 : 2.0
// 날짜 : 2025.03.10
// 저자 : 탁 형옥
// 코딩 언어 : verilog
// 문제 내용 (해결해야 할 목표):
파이프라인을 이용하여 비교회로를 만들었을때 성능개선을 확인한다.
0.3ns 의 동작 시간을 줄일 수 있었다.(클럭입력 100 MHz ,clko:400MHz 로 테스트함)
// 요구되는 언어 기술 (어려운 점):
처음에 의도되지 않은 타이밍이 400ns 이전에 발생하는 문제를 가짐
// 목표와 기술을 도달하기 위한 알아야 할 기술(문법), 어려운 점, 문제점 극복 과정:
로직이 locked 되었을때 의도된 출력신호가 나오도록 수정함.
구현 전략 옵션에 따라 동작 주파수가 상이하게 나옴.
// 결과 도출:
// 기본 목표 과제를 한층 더 깊이 있게 하기 위한 생각:
// 이용 가능한 분야:
// 기술과 트렌드:
// 설명 :
//
/*********************************************************/
module cmp_32b
#(parameter N=32,M=5)
( input clk,
input [N-1:0] a,
input [N-1:0] b,
inout [N-1:0] dq_a_b,
inout [N-1:0] dq_a_b_n,
output reg lt,gt,eq,
output locked
);
wire lt0,lt1,lt2,lt3,lt4,lt5,lt6;
wire gt0,gt1,gt2,gt3,gt4,gt5,gt6;
wire eq0,eq1,eq2,eq3,eq4,eq5,eq6;
wire gt_r,eq_r;
reg [N-1:0] a_r,b_r;
wire [N-1:0] a_o,b_o;
/*
IOBUFDS iobufds_inst
(
.O(O),
.I(I),
.IO(IO),
.IOB(IOB),
.T(T)
);
*/
wire clko;
clk_wiz_1 CLOCK
(
// Clock out ports
.clk_out1(clko),
// Status and control signals
.reset(reset),
.locked(locked),
// Clock in ports
.clk_in1(clk)
);
always @(posedge clko)
begin
a_r<=a;
b_r<=b;
end
cmp_5b #(.M(5)) U0 (.clk(clko),.a(a_r[4:0]),.b(b_r[4:0]),.lt(lt0),.gt(gt0),.eq(eq0));
cmp_5b #(.M(5)) U1 (.clk(clko),.a(a_r[9:5]),.b(b_r[9:5]),.lt(lt1),.gt(gt1),.eq(eq1));
cmp_5b #(.M(5)) U2 (.clk(clko),.a(a_r[14:10]),.b(b_r[14:10]),.lt(lt2),.gt(gt2),.eq(eq2));
cmp_5b #(.M(5)) U3 (.clk(clko),.a(a_r[19:15]),.b(b_r[19:15]),.lt(lt3),.gt(gt3),.eq(eq3));
cmp_5b #(.M(5)) U4 (.clk(clko),.a(a_r[24:20]),.b(b_r[24:20]),.lt(lt4),.gt(gt4),.eq(eq4));
cmp_5b #(.M(5)) U5 (.clk(clko),.a(a_r[29:25]),.b(b_r[29:25]),.lt(lt5),.gt(gt5),.eq(eq5));
cmp_5b #(.M(2)) U6 (.clk(clko),.a(a_r[31:30]),.b(b_r[31:30]),.lt(lt6),.gt(gt6),.eq(eq6));
/*
always @(posedge clk)
begin
if(gt6==1'b1)
gt<=1'b1;
else if(gt5==1'b1)
gt<=1'b1;
else if (gt4==1'b1)
gt<=1'b1;
else if (gt3==1'b1)
gt<=1'b1;
else if (gt2==1'b1)
gt<=1'b1;
else if (gt1==1'b1)
gt<=1'b1;
else if (gt0==1'b1)
gt<=1'b1;
else
gt<=1'b0;
end
always @(posedge clk)
begin
if(lt0==1'b1)
lt<=1'b1;
else if (lt1==1'b1)
lt<=1'b1;
else if (lt2==1'b1)
lt<=1'b1;
else if (lt3==1'b1)
lt<=1'b1;
else if (lt4==1'b1)
lt<=1'b1;
else if (lt5==1'b1)
lt<=1'b1;
else if (lt6==1'b1)
lt<=1'b1;
else
lt<=1'b0;
end
always @(posedge clk)
begin
if((eq5==1'b1) && (eq4==1'b1) && (eq3==1'b1) && (eq2==1'b1) && (eq1==1'b1) && (eq0==1'b1))
eq<=1'b1;
else
eq<=1'b0;
end
*/
comp UU0
(
.clk(clko),
.gt6(gt6),.gt5(gt5),.gt4(gt4),.gt3(gt3),.gt2(gt2),.gt1(gt1),.gt0(gt0),
.eq0(eq0),.eq1(eq1),.eq2(eq2),.eq3(eq3),.eq4(eq4),.eq5(eq5),.eq6(eq6),
.gt_r(gt_r),.eq_r(eq_r));
always @(posedge clko)
begin
/* MSB부터 비교
if(gt6)
gt_r <= 1'b1;
else if(gt5)
gt_r <= 1'b1;
else if(gt4)
gt_r <= 1'b1;
else if(gt3)
gt_r <= 1'b1;
else if(gt2)
gt_r <= 1'b1;
else if(gt1)
gt_r <= 1'b1;
else if(gt0)
gt_r <= 1'b1;
else
gt_r <= 1'b0;
*/
lt <= ~gt_r & ~eq_r&locked;
gt <= gt_r&locked;
eq <= eq_r&locked;
/*
if(eq1 & eq2 & eq3 & eq0 &eq4 &eq5 & eq6)
begin
eq_r <= 1'b1;
end
else
eq_r <= 1'b0;
*/
end
endmodule
module cmp_5b
#(parameter M=5)
( input clk,
input [M-1:0] a,
input [M-1:0] b,
output reg lt,gt,eq
);
always @(posedge clk)
begin
if(a[M-1:0]>b[M-1:0])
gt<=1'b1;
else
gt<=1'b0;
if(a[M-1:0]<b[M-1:0])
lt<=1'b1;
else
lt<=1'b0;
if(a[M-1:0]==b[M-1:0])
eq<=1'b1;
else
eq<=1'b0;
end
endmodule
module cmp_32b
#(parameter N=32,M=5)
( input clk,
input [N-1:0] a,
input [N-1:0] b,
inout [N-1:0] dq_a_b,
inout [N-1:0] dq_a_b_n,
output reg lt,gt,eq,
output locked
);
wire lt0,lt1,lt2,lt3,lt4,lt5,lt6;
wire gt0,gt1,gt2,gt3,gt4,gt5,gt6;
wire eq0,eq1,eq2,eq3,eq4,eq5,eq6;
wire gt_r,eq_r;
reg [N-1:0] a_r,b_r;
wire [N-1:0] a_o,b_o;
/*
IOBUFDS iobufds_inst
(
.O(O),
.I(I),
.IO(IO),
.IOB(IOB),
.T(T)
);
*/
wire clko;
clk_wiz_1 CLOCK
(
// Clock out ports
.clk_out1(clko),
// Status and control signals
.reset(reset),
.locked(locked),
// Clock in ports
.clk_in1(clk)
);
always @(posedge clko)
begin
a_r<=a;
b_r<=b;
end
cmp_5b #(.M(5)) U0 (.clk(clko),.a(a_r[4:0]),.b(b_r[4:0]),.lt(lt0),.gt(gt0),.eq(eq0));
cmp_5b #(.M(5)) U1 (.clk(clko),.a(a_r[9:5]),.b(b_r[9:5]),.lt(lt1),.gt(gt1),.eq(eq1));
cmp_5b #(.M(5)) U2 (.clk(clko),.a(a_r[14:10]),.b(b_r[14:10]),.lt(lt2),.gt(gt2),.eq(eq2));
cmp_5b #(.M(5)) U3 (.clk(clko),.a(a_r[19:15]),.b(b_r[19:15]),.lt(lt3),.gt(gt3),.eq(eq3));
cmp_5b #(.M(5)) U4 (.clk(clko),.a(a_r[24:20]),.b(b_r[24:20]),.lt(lt4),.gt(gt4),.eq(eq4));
cmp_5b #(.M(5)) U5 (.clk(clko),.a(a_r[29:25]),.b(b_r[29:25]),.lt(lt5),.gt(gt5),.eq(eq5));
cmp_5b #(.M(2)) U6 (.clk(clko),.a(a_r[31:30]),.b(b_r[31:30]),.lt(lt6),.gt(gt6),.eq(eq6));
/*
always @(posedge clk)
begin
if(gt6==1'b1)
gt<=1'b1;
else if(gt5==1'b1)
gt<=1'b1;
else if (gt4==1'b1)
gt<=1'b1;
else if (gt3==1'b1)
gt<=1'b1;
else if (gt2==1'b1)
gt<=1'b1;
else if (gt1==1'b1)
gt<=1'b1;
else if (gt0==1'b1)
gt<=1'b1;
else
gt<=1'b0;
end
always @(posedge clk)
begin
if(lt0==1'b1)
lt<=1'b1;
else if (lt1==1'b1)
lt<=1'b1;
else if (lt2==1'b1)
lt<=1'b1;
else if (lt3==1'b1)
lt<=1'b1;
else if (lt4==1'b1)
lt<=1'b1;
else if (lt5==1'b1)
lt<=1'b1;
else if (lt6==1'b1)
lt<=1'b1;
else
lt<=1'b0;
end
always @(posedge clk)
begin
if((eq5==1'b1) && (eq4==1'b1) && (eq3==1'b1) && (eq2==1'b1) && (eq1==1'b1) && (eq0==1'b1))
eq<=1'b1;
else
eq<=1'b0;
end
*/
comp UU0
(
.clk(clko),
.gt6(gt6),.gt5(gt5),.gt4(gt4),.gt3(gt3),.gt2(gt2),.gt1(gt1),.gt0(gt0),
.eq0(eq0),.eq1(eq1),.eq2(eq2),.eq3(eq3),.eq4(eq4),.eq5(eq5),.eq6(eq6),
.gt_r(gt_r),.eq_r(eq_r));
always @(posedge clko)
begin
/* MSB부터 비교
if(gt6)
gt_r <= 1'b1;
else if(gt5)
gt_r <= 1'b1;
else if(gt4)
gt_r <= 1'b1;
else if(gt3)
gt_r <= 1'b1;
else if(gt2)
gt_r <= 1'b1;
else if(gt1)
gt_r <= 1'b1;
else if(gt0)
gt_r <= 1'b1;
else
gt_r <= 1'b0;
*/
lt <= ~gt_r & ~eq_r&locked;
gt <= gt_r&locked;
eq <= eq_r&locked;
/*
if(eq1 & eq2 & eq3 & eq0 &eq4 &eq5 & eq6)
begin
eq_r <= 1'b1;
end
else
eq_r <= 1'b0;
*/
end
endmodule
module cmp_5b
#(parameter M=5)
( input clk,
input [M-1:0] a,
input [M-1:0] b,
output reg lt,gt,eq
);
always @(posedge clk)
begin
if(a[M-1:0]>b[M-1:0])
gt<=1'b1;
else
gt<=1'b0;
if(a[M-1:0]<b[M-1:0])
lt<=1'b1;
else
lt<=1'b0;
if(a[M-1:0]==b[M-1:0])
eq<=1'b1;
else
eq<=1'b0;
end
endmodule
|
|
