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 1TRƯỜ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 2Hà 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 32.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 5Chươ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 6not 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 7assign AltB = (A<B) ?1:0;
assign AeqB = (A==B) ?1:0;
wire gt, AltB, AeqB;
Comp2bit dut(gt, AltB, AeqB, A, B);
Trang 81.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 101.3.Thiết kế mạch full add 1bit
-Yêu cầu : Thiết kế bộ cộng FA 1 bit
Trang 11output sum, c_out;
Trang 121.4.Thiết kế mạch full add 4bit
-Yêu cầu ,mục tiêu
Trang 14Mô 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 17Chươ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 18initial forever #10 i1= ~i1;
Trang 19y = a;
y = y & b;
y = y & c;
end endmodule
end initial forever #5 a = ~a;
Trang 212.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 262.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 28input 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 29initial 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 31input 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 32assign 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 33input 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 34wire [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 35output 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 37input wire [3:0] hex,
Trang 38input 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 39disp_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 41reg [N-2:0] mag_a, mag_b , mag_sum, max, min;
reg sign_a, sign_b, sign_sum;
Trang 42end // 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 44Testbench
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 45output wire [7:0] y );
Trang 46input 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 47initial 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 48if ({expl, frac1} > {exp2, frac2})
exp_diff = expb - exps;
fraca = fracs >> exp_diff ;
Trang 49sum_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 51disp_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 52always #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 54input 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 55clk=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 58reg [N-1:0] r_reg, r_next;
always @(posedge clk, posedge reset)
Trang 60input wire clk, reset,
output wire max_tick,
Trang 61TestBench
`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 63reg [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