1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Báo cáo giữa kỳ Ic số đại học bách khoa hà nội

68 912 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 68
Dung lượng 3,75 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Báo cáo bài tập giữ kỳ môn ic số đại học bách khoa hà nội, có đầy đủ các bài chương 3,4 FPGA và bài tập giao trên lớp thầy cường................................................................................

Trang 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ - VIỂN THÔNG

BÁO CÁO BÀI TẬP LỚN

Thiết kế tổng hợp hệ thống số

Đề tài: Bài tập thiết kế Giảng viên : TS Võ Lê Cường

Đỗ Duy Khải 20142327Nguyễn Hoài Sơn 20143827

Trang 2

Hà nội 11/2018

MỤC LỤC

MỤC LỤC 2

PHÂN CHIA CÔNG VIỆC 4

Chương 1: Bài tập về sử dụng modelsim 5

1.1.Thiết kế mạch so sánh 2 bit 5

1.2 Thiết kế mạch half add 8

1.3.Thiết kế mạch full add 1bit 10

1.4.Thiết kế mạch full add 4bit 12

1.5.Thiết kế mạch mux 2-1 12

1.6.Thiết kế mạch mux 4-1 14

Chương 2: Các bài tập chương 3 17

2.1Thiết kế mạch so sánh 1 bit 1eq_always 17

2.2.Thiết kế mạch and_cont_assign 19

2.3.Thiết kế mạch prio_encoder_if 20

2.4.Thiết kế mạch decoder_2_4_if 22

2.5.Thiết kế mạch decoder_2_4_case 23

2.6.Thiết kế mạch prio_encoder_case: (tương tự như trên) 24

2.7.Thiết kế mạch prio_encoder_casez và casex 26

2.8.Thiết kế mạch adder_carry_hard_lit 28

2.9.Thiết kế mạch adder_carry_local_par 29

2.10.Thiết kế mạch adder_carry_para 31

2.11.Thiết kế mạch adder_insta 33

2.12.Thiết kế mạch adder_carry_95 34

2.13.Thiết kế mạch hex_to_sseg 36

2.14.Thiết kế mạch hex-to-sseg-test 38

2.15.Thiết kế mạch sign-mag-add 40

2.16.Thiết kế mạch barrel-shifter-case 42

2.17.Thiết kế mạch barrel-shifter-stage 44

2.18.Thiết kế mạch shifter-test 46

x2.19.Thiết kế mạch fp-adder 46

Trang 3

2.20.Thiết kế mạch fp-adder-test 49

Chương 3 Các bài tập chương 4 sách FPGA và HDL 53

3.1 Thiết kế mạch d-ff 53

3.2 Thiết kế mạch Free-run-shif-reg 55

3.3 Thiết kế mạch univ-shift-reg 57

3.4 Thiết kế mạch Free-run-bin-counter 59

3.4 Thiết kế mạch univ-bin-counter 61

3.5 Thiết kế mạch mod-m-counter 65

Trang 4

PHÂN CHIA CÔNG VIỆC

- Sơn Khải: cả hai cùng làm báo cáo phần công việc của mình

- Sơn: các bài tập chương 3(FPGA), mô phỏng các mạch đếm và mạch cộng 2

Trang 5

Chương 1: Bài tập về sử dụng modelsim

1.1.Thiết kế mạch so sánh 2 bit

1.1.1 So sánh mô hình cấu trúc:

- Yêu cầu : sử dụng mô hình cấu trúc để thiết kế mạch so sánh

- Mục tiêu : sử dụng các công logic đơn giản :

- Thiết kế ta vẽ bìa các nô cho 2 đầu vào

Trang 6

not not1(Ad[0], A[0]);

not not2(Ad[1], A[1]);

not not3(Bd[0], B[0]);

not not4(Bd[1], B[1]);

//AgtB

and and1(t1, A[0], Bd[0], Bd[1]);

and and2(t2, A[1], Bd[1]);

and and3(t3, A[1], A[0], Bd[0]);

or or1(gt, t1, t2, t3);

//AltB

and and4(u1, Ad[1], Ad[0], B[0]);

and and5(u2, Ad[1], B[1]);

and and6(u3, Ad[0], B[1], B[0]);

or or2(AltB, u1, u2, u3);

//AeqB

xnor xnor1(k1, A[0], B[0]);

xnor xnor2(k2, A[1], B[1]);

and and7(AeqB, k1, k2);

1.1.2 Dùng mô hình data flow

module Comp2bit

Trang 7

assign AltB = (A<B) ?1:0;

assign AeqB = (A==B) ?1:0;

wire gt, AltB, AeqB;

Comp2bit dut(gt, AltB, AeqB, A, B);

Trang 8

1.2 Thiết kế mạch half add

-Yêu cầu : Thiết kế mạch tổ hợp cộng 2 bit đầu vào và không có nhớ

+ Input: 2 đầu vào a,b

Trang 9

+ Output: Tổng S và giá trị nhớ C sinh ra từ phép tính a + b

xor SUM (S, X, Y);

and CARRY (C, X, Y);

Trang 10

1.3.Thiết kế mạch full add 1bit

-Yêu cầu : Thiết kế bộ cộng FA 1 bit

Trang 11

output sum, c_out;

Trang 12

1.4.Thiết kế mạch full add 4bit

-Yêu cầu ,mục tiêu

Trang 14

Mô phỏng

1.6.Thiết kế mạch mux 4-1

-Yêu cầu : Thiết kế bộ cộng 2 số 4 bit

-Thiết kế :Sử dụng 4 cổng add 1 bit

Trang 17

Chương 2: Các bài tập chương 3.

2.1Thiết kế mạch so sánh 1 bit 1eq_always

- Yêu cầu , mục tiêu thiết kế: Viết lại mạch so sánh 1 bit dùng mô hình always

- Thiết kế bằng tay: Đầu vào i0,i1, đầu ra eq

- Code mô phỏng và file tesbench

Trang 18

initial forever #10 i1= ~i1;

Trang 19

y = a;

y = y & b;

y = y & c;

end endmodule

end initial forever #5 a = ~a;

Trang 21

2.3.Thiết kế mạch prio_encoder_if.

- Yêu cầu và mục tiêu thiết kế: Dùng 2 ví dụ đơn giản để chứng minh

sử dụng của câu lệnh if Ví dụ đầu tiên là prio_encoder, có đầu vào là

4 bit riêng lẻ r input và r[4] là ưu tiên cao nhất Đầu ra là mã nhị phân

- Thiết kế bằng tay

- Code mô phỏng và file testbench

Code

module prio_encoder_if (

input wire [4:1] r, output reg [2:0] y );

always @*

prio_encoder_if dut( y(y), r(r));

initial begin a=0; b=0; c=0;

end initial forever #5 a = ~a;

initial forever #10 b = ~b;

Trang 24

- Yêu cầu thiết kế: Dùng tương tự như prio_encoder if để minh họa hoạt động của câu lệnh case Có code chạy như trong giáo trình

- Thiết kế bằng tay

Code

module decoder_2_4_case (

input wire [1:0] a,input wire en, output reg [3:0] y );

2.6.Thiết kế mạch prio_encoder_case: (tương tự như trên)

- Yêu cầu và mục tiêu thiết kế:

- Thiết kế bằng tay:

Trang 25

- DUT

Code module prio_encoder_case

Trang 26

2.7.Thiết kế mạch prio_encoder_casez và casex

- Yêu cầu và mục tiêu thiết kế:Tương tự như trường hợp của lệnh case nhưng có những điểm khác là giá trị của z và ? trong mỗi biểu thức được xử lí như là don’t care Trong casex thì giá trị của z và x , ?

Trang 27

được xử lí như don’t care vì giá trị của z và x có thể xuất hiện trong

Trang 28

input wire [3:0] a, b, output wire [4:0] sum_ext, output wire [3:0] sum, output wire cout

);

// wire [4:0] sum_ext;

assign sum_ext = {1'b0, a} + {1'b0, b};

assign sum = sum_ext [3:0];

assign cout= sum_ext [4] ;

Trang 29

initial begin a=3'b0000;b=3'b0000;

end initial forever #5 a =a +1;//4 bit tu 0 den 2^3+2^2+2+0=15 initial forever #80 b =b +1;

Trang 30

//output wire [N:0] sum_ext,

output wire [3:0] sum,

output wire cout

assign sum = sum_ext[N1:0] ;

assign cout = sum_ext[N];

Trang 31

input wire [N-1:0] a, b, output wire [N:0] sum_ext, output wire [N-1:0] sum, output wire cout

);

localparam N1 = N-1;

//wire [N:O] sum_ext ;

assign sum_ext = {1'b0, a}+ {1'b0, b};

assign sum = sum_ext [N1:0] ;

Trang 32

assign cout= sum_ext [N] ; endmodule

dut( cout(cout), sum(sum), sum_ext(sum_ext), a(a), b(b) );

// cho sum_ext vao la loi

Trang 33

input wire [3:0] a4, b4, output wire [3:0] sum4, output wire c4,

input wire [7:0] a8, b8, output wire [7:0] sum8, output wire c8

);

adder_carry_para #( N(8)) unit1 (.a(a8), b(b8), sum(sum8), cout(c8)) ; adder_carry_para unit2

(.a(a4), b(b4), sum(sum4), cout(c4)) ;

Trang 34

wire [7:0] sum8;

wire c8 ;

adder_insta dut( c8(c8), sum8(sum8), c4(c4), sum4(sum4), a8(a8), b8(b8), a4(a4), b4(b4));

initial begin a4=4'b0000;

b4=4'b0000;

a8=4'b00000000;

b8=4'b00000000;

end initial forever #5 a4 = a4+1;

initial forever #80 b4 = b4+1;

initial forever #1280 a8 = b8+1;

initial forever #327680 b8 = b8+1;

endmodule

- Kết quả mô phỏng

2.12.Thiết kế mạch adder_carry_95

- Yêu cầu và mục tiêu thiết kế: thiết kế mạch adder xem xét phần hằng

số như là tham số với phiên bản code Verilog năm 1995

- Thiết kế bằng tay

Trang 35

output wire [N:0] sum_ext ;

output wire [N1:0] sum;

output wire cout ;

assign sum_ext = {1'b0, a} + {1'b0, b};

assign sum = sum_ext [N1:0] ;

assign cout= sum_ext [N] ;

Trang 37

input wire [3:0] hex,

Trang 38

input wire clk, input wire [7:0] sw, output wire [3:0] an, output wire [7:0] sseg );

wire [7:0] inc;

wire [7:0] led0 , led1 , led2, led3 ;

assign inc = sw + 1;

hex_to_sseg sseg_unit_0 (.hex(sw[3:0]), dp(1'b0), sseg(led0));

hex_to_sseg sseg_unit_1 (.hex(sw[7:4]), dp(1'b0), sseg(led1));

hex_to_sseg sseg_unit_2 (.hex(inc[3:0]), dp(1'b1), sseg(led2));

hex_to_sseg sseg_unit_3 (.hex(inc[7:4]), dp(1'b1), sseg(led3));

Trang 39

disp_mux disp_unit

(.clk(clk), reset(1'b0), in0(led0), in1(led1),

in2(led2), in3(led3), an(an), sseg(sseg));

// code that executes only once

// insert code here > begin

Trang 40

// @(event1 or event2 or eventn) begin

// code executes for every event on sensitivity list // insert code here > begin

@eachvec;

// > end end endmodule

Trang 41

reg [N-2:0] mag_a, mag_b , mag_sum, max, min;

reg sign_a, sign_b, sign_sum;

Trang 42

end // add/sub magnitude

if (sign_a==sign_b) mag_sum = max + min;

else mag_sum = max - min;

sum = {sign_sum, mag_sum};

end endmodule

sign_mag_add dut ( sum(sum), a(a), b(b));

initial begin

a =4'b0000;

b =4'b0000;

end initial forever #5 a= a+1;// 4bit 16 initial forever #80 b= b+1;

endmodule

- Kết quả mô phỏng

2.16.Thiết kế mạch barrel-shifter-case

Trang 43

- Yêu cầu và mục tiêu thiết kế: Dùng lệnh case để phối hợp các lệnh điều khiển cho các lệnh ra tương ứng của mạch barrel-shifter.

3'o1: y = {a[0], a[7:1]};

3'o2: y = {a[1:0], a[7:2]};

3'o3: y = {a[2:0], a[7:3]};

3'o4: y = {a[3:0], a[7:4]};

3'o5: y = {a[4:0], a[7:5]};

3'o6: y = {a[5:0], a[7:6]};

default: y = {a[6:0], a[7]};

endcase

Trang 44

Testbench

module tb_barrel_shifter_case();

reg [7:0] a;

reg [2:0] amt;

wire [7:0] y ;

barrel_shifter_case dut( y(y), amt(amt), a(a));

initial begin

a =8'b00000000;

amt= 3'b000;

end initial forever #5 a =a+1;//8bit initial forever #1280 amt =amt+1;

input wire [7:0] a, input wire [2:0] amt,

Trang 45

output wire [7:0] y );

Trang 46

input wire [2:0] btn, input wire [7:0] sw, output wire [7:0] led ) ;

barrel_shifter_stage shift_unit (.a(sw), amt(btn), y(led));

initial begin btn=3'b000; sw= 8'b00000000;

end

Trang 47

initial forever #5 sw= sw+1;

initial forever #1280 btn= btn+1;

endmodule

input wire signl, sign2, input wire [3:0] expl, exp2, input wire [7:0] fracl, frac2, output reg sign_out ,

output reg [3:0] exp_out , output reg [7:0] frac_out );

reg signb, signs;

reg [3:0] expb, exps, expn, exp_diff ; reg [7:0] fracb, fracs, fraca, fracn, sum_norm ; reg [8:0] sum;

reg [2:0] lead0;

always @*

begin

Trang 48

if ({expl, frac1} > {exp2, frac2})

exp_diff = expb - exps;

fraca = fracs >> exp_diff ;

Trang 49

sum_norm = sum << lead0;

if (sum[8]) begin expn = expb + 1;

fracn = sum [8:1] ; end

else if (lead0 > expb) begin expn = 0;

fracn = 0;

end else begin expn = expb - lead0;

fracn = sum_norm;

end sign_out = signb;

Trang 50

- Yêu cầu và mục tiêu thiết kế : thực hiện mạch kiểm tra tính chính xác của mạch ở phần 1.18

output wire[3:0] an,

output wire [7:0] sseg

);

wire sign1 , sign2, sign_out ;

wire[3:0] exp1, exp2, exp_out;

wire [7:0] frac1 , frac2, frac_out ;

wire [7:0] led3, led2, led1 , led0 ;

Trang 51

disp_mux disp_unit

( clk(clk), reset (1'b0), in0(led0), in1(led1),

.in2(led2), in3(led3), an(an), sseg(sseg));

Endmodule

Testbench

`timescale 1 ps/ 1 ps

module fp_adder_test_vlg_tst();

// constants

// general purpose registers reg eachvec; // test vector input registers reg [1:0] btn; reg clk; reg [7:0] sw; // wires

wire [3:0] an; wire [7:0] sseg; // assign statements (if any)

fp_adder_test i1 ( // port map - connection between master ports and signals/registers an(an), btn(btn), clk(clk), sseg(sseg), sw(sw) ); initial begin clk=1; forever #5 clk=~clk; end initial

begin btn=2'b0; sw=8'b0;

// code that executes only once

// insert code here > begin

// > end

$display("Running testbench");

end

Trang 52

always #5 btn=btn+1;

always #10 sw=sw+1;

always

// optional sensitivity list

// @(event1 or event2 or eventn)

begin

// code executes for every event on sensitivity list // insert code here > begin

@eachvec;

// > end

end endmodule

- Kết quả mô phỏng

Trang 53

Chương 3 Các bài tập chương 4 sách FPGA và HDL

Trang 54

input wire clk,

input wire wr_en,

input wire [W-1:0] w_addr, r_addr,

input wire [B-1:0] w_data,

output wire [B-1:0] r_data

Trang 55

clk=0; wr_en=0;w_addr=2'd1;r_addr=2'd2;w_data=2'd5;

#10 wr_en=1;

$display("Running testbench");

end always #5 clk=~clk; always #5 w_addr=w_addr+1;

//always #5 wr_en=wr_en+1; always #5 r_addr=r_addr+1 ; always #5 w_data=w_data+1; always

// optional sensitivity list

// @(event1 or event2 or eventn)

begin

// code executes for every event on sensitivity list // insert code here > begin

@eachvec;

// > end

end

endmodule

Mô phỏng

Trang 56

( input wire clk, reset,

input wire s_in,

output wire s_out,

output wire [N-1:0] q,

output reg [N-1:0] r_reg,

output wire [N-1:0] r_next

Trang 57

// assign statements (if any)

free_run_shift_reg1 i1 ( // port map - connection between master ports and signals/registers clk(clk), q(q), reset(reset), s_in(s_in), s_out(s_out) ); initial begin clk=1; forever #5 clk=~clk; end initial

begin

#5 reset=1; #15 reset=0; s_in=1;

$display("Running testbench");

end

always

// optional sensitivity list

// @(event1 or event2 or eventn)

begin

// code executes for every event on sensitivity list // insert code here > begin

@eachvec;

// > end

end

endmodule

Mô phỏng

Trang 58

reg [N-1:0] r_reg, r_next;

always @(posedge clk, posedge reset)

Trang 60

input wire clk, reset,

output wire max_tick,

Trang 61

TestBench

`timescale 1 ps/ 1 ps module free_run_bin_counter_vlg_tst(); // constants

// general purpose registers reg eachvec; // test vector input registers reg clk; reg reset; // wires

wire max_tick; wire [7:0] q; // assign statements (if any)

free_run_bin_counter i1 ( // port map - connection between master ports and signals/registers clk(clk), max_tick(max_tick), q(q), reset(reset) ); initial

begin clk =0; forever #5 clk=~clk; end initial

begin

reset=1; #20 reset=0;

// code that executes only once

// insert code here > begin

// > end

$display("Running testbench");

end

always

// optional sensitivity list

// @(event1 or event2 or eventn)

begin

// code executes for every event on sensitivity list

Trang 62

// insert code here > begin

@eachvec;

// > end

end

endmodule Mô phỏng 3.4 Thiết kế mạch univ-bin-counter

Code

module univ_bin_counter

#(parameter N=8)

(

input wire clk, reset,

input wire syn_clr , load, en, up,

input wire [N-1:0] d,

output wire max_tick, min_tick,

output wire [N-1:0] q

);

Trang 63

reg [N-1:0] r_reg, r_next;

always @(posedge clk, posedge reset)

assign max_tick = (r_reg==2**N-1) ? 1'b1 : 1'b0;

assign min_tick = (r_reg==0) ? 1'b1 : 1'b0;

endmodule

+) TestBench

`timescale 1 ps/ 1 ps

Trang 65

);

initial

begin

clk=0;

forever #5 clk=~clk;

end

initial

begin

reset=1;d=8'b0;en=0;load=1;up=0;syn_clr=1; #20 reset=0; syn_clr=0;load=0;

// code that executes only once

// insert code here > begin

// > end

$display("Running testbench");

end

always #5 d=d+1; always #15 en=en+1; //always #10 load=load+1; always #20 up=up+1; always

// optional sensitivity list

// @(event1 or event2 or eventn)

begin

// code executes for every event on sensitivity list // insert code here > begin

Ngày đăng: 09/11/2018, 12:15

TỪ KHÓA LIÊN QUAN

w