Kraklog

[Verilog_LAB2] Part4 본문

[Harman] 하만 반도체 설계/CPU설계

[Verilog_LAB2] Part4

Krakens 2023. 12. 19. 01:36
728x90

프로그램 : Quaturs Prime lite edition 18.1

사용문법 : Verilog 2001

보드 : DE1-SOC

 

 

 

설계목표 : PartII(2023.12.19 - [[Harman] 하만 반도체 설계/CPU설계] - [Verilog_LAB2] Part2) 에서 사용한 Full adder를 이용해서 segment에 덧셈을 표현. LED 가장 우측(LED9)에 error bit를 표현한다.

`define BUS_SIZE 2
`define SL_SIZE 10	//switch LED size
`define SEG7_WD	7

module part4(
 	input		[`SL_SIZE-1:0]		SW		,
  output  [`SL_SIZE-1:0]    LEDR  ,
  output  [`SEG7_WD-1:0]    HEX0  ,
  output  [`SEG7_WD-1:0]    HEX1  ,
  output  [`SEG7_WD-1:0]    HEX2  ,
  output  [`SEG7_WD-1:0]    HEX3  ,
  output  [`SEG7_WD-1:0]    HEX4  ,
  output  [`SEG7_WD-1:0]    HEX5      
);

  wire  [3:0] X;
  wire  [3:0] Y;
  wire        err_bit;
  assign X = SW[7:4];
  assign Y = SW[3:0];
  assign err_bit = (X[3] & X[2])|(X[3] & X[1])|
                   (Y[3] & Y[2])|(Y[3] & Y[1]);
  assign LEDR[9] = err_bit;
  //assign err_bit = (x>9) | (y>9);
  //3210 bit
  //1000 : 8
  //1001 : 9
  //1010 : 10 - err
  //1011 : 11 - err
  //1100 : 12 - err
  //1101 : 13 - err
  //1110 : 14 - err
  //1111 : 15 - err
  //3, 1 bit & / 3, 2 bit & ->  


 wire [3:0] a = X;
 wire [3:0] b = Y;
 wire      ci = SW[8];
 wire [3:0] s;
 wire      co;

 assign LEDR[4:0] = {co,s}; 

adder_4bit uFA(
  .a (a) ,
  .b (b) ,
  .ci(ci) ,
  .s (s) ,
  .co(co)
);

  wire [3:0]            V=s;
  wire [3:0]            A;
  wire [3:0]            B1;
  wire [3:0]            B0;
  wire                  Z;
  //wire [`SEG7_WD-1:0]		HEX0;
 // wire [`SEG7_WD-1:0]		HEX1;
  wire [`SEG7_WD-1:0]		H0;
  wire [`SEG7_WD-1:0]		H1;

//co3210
//01111 : 15
//10000 : 16
//10001 : 17
//10010 : 18
//10011 : 19

  comp uComp_0(
    .V(V),
    .Z(Z)
  );

  circuitA uCircuitA_0(
    .V(V),
    .A(A)
  );

    mux_4bit_2x1 uMux_4bit_2x1_0(
    .x(V),
    .y(A),
    .s(Z),
    .m(B0)
  );

  //B0 : ~15
  //0000 : 16 (occured carry, 16) -> 0000 = 6 (0110)
  //0001 : 7 (0111)
  //0010 : 8 (1000)
  //0011 : 9 (1001)
    wire [3:0]      B;
    wire [3:0]      m;
    assign B[3] =   B0[1]; //0000 -> "0"110 
    assign B[2] =  ~B0[1]; //0000 -> 0"1"10 
    assign B[1] =  ~B0[1]; //0000 -> 01"1"0    
    assign B[0] =   B0[0]; //0000 -> 011"0" 
    wire S1;

    assign S1 = co | Z; 

    mux_4bit_2x1 uMux_4bit_2x1_0(
    .x(B0),
    .y(B),
    .s(co),
    .m(m)
  );

//[s1]s0
  bcd7seg ubcd7seg_1(
    //.B({3'b000,Z}),
    .B({3'b000,S1}),
    .H(H1)
  );
//s1[s0]
    bcd7seg ubcd7seg_0(
    //.B(B0),
    .B(m),
    .H(H0)
  );

  //todo  : do sim
  //error : H1 initial value  
  assign HEX0 = H0;
  assign HEX1 = H1;

  //turn off HEX2,4
  bcd7seg uBcd7seg_4 (
  .B(4'b1010),
  .H(HEX4) 
);

  bcd7seg uBcd7seg_2 (
  .B(4'b1010),
  .H(HEX2)
);

  bcd7seg uBcd7seg_X (
  .B(X),
  .H(HEX5)
);

  bcd7seg uBcd7seg_Y (
  .B(Y),
  .H(HEX3)
);

  
endmodule
`define SL_SIZE 10	
`define SEG7_WD	7

module bcd7seg (
  input   [3:0]           B,
  output  [`SEG7_WD-1:0]  H
);

//    _0_
// 5|_6__| 1
// 4|_3__| 2
// 


reg [`SEG7_WD-1:0]  rH;

always @(*)
begin
  case (B)
/*
  //4'b**** : rH = ~7'b654_3210;
    4'b0000 : rH = ~7'b011_1111;
    4'b0001 : rH = ~7'b000_0110;
    4'b0010 : rH = ~7'b101_1011;
    4'b0011 : rH = ~7'b100_1111;
    4'b0100 : rH = ~7'b110_0110;
    4'b0101 : rH = ~7'b110_1101;
    4'b0110 : rH = ~7'b111_1101;
    4'b0111 : rH = ~7'b010_0111;
    4'b1000 : rH = ~7'b111_1111;
    4'b1001 : rH = ~7'b110_0111;
    default : rH = ~7'b000_0000;
  */
    4'b0000 : rH = ~7'b011_1111;
    4'b0001 : rH = ~7'b000_0110;
    4'b0010 : rH = ~7'b101_1011;
    4'b0011 : rH = ~7'b100_1111;
    4'b0100 : rH = ~7'b110_0110;
    4'b0101 : rH = ~7'b110_1101;
    4'b0110 : rH = ~7'b111_1101;
    4'b0111 : rH = ~7'b010_0111;
    4'b1000 : rH = ~7'b111_1111;
    4'b1001 : rH = ~7'b110_0111;	
		default : rH = ~7'b000_0000;	
  endcase


end

assign H = rH;

endmodule

*남은 모듈은 이전 발행글의 모듈을 사용

 

 

728x90

'[Harman] 하만 반도체 설계 > CPU설계' 카테고리의 다른 글

[Verilog_LAB2] Part6  (0) 2023.12.19
[Verilog_LAB2] Part5  (1) 2023.12.19
[Verilog_LAB2] Part3  (1) 2023.12.19
[Verilog_LAB2] Part2  (0) 2023.12.19
[Verilog_LAB2] Part1  (0) 2023.12.19