Giáo trình Vi mạch số lập trình - Nghề: Điện tử công nghiệp (Trình độ cao đẳng)
Tóm tắt Giáo trình Vi mạch số lập trình - Nghề: Điện tử công nghiệp (Trình độ cao đẳng): ...cấp cho người học những kiến thức về cách cài đặt và sử dụng chương trình ISE để sử dụng vào việc thiết kế và mô phỏng các kết quả thiết kế của mình. Cung cấp cho người học cách cài đặt và sử dụng phần mềm modelsim để mô phỏng các kết quả thiết kế của mình. Mục tiêu: Trình bày cách sử dụng công cụ...ử ngôn ngữ Verilog Năm 1981 công ty phần mềm CAE tuyên bố phần mềm tự động thiết của Gateway được khám phá bởi Prabhu Goel, một trong những nhân viên đầu tiên của Gateway là Phil Moorby, tác giả đầu tiên của ngôn ngữ mô tả phần cứng GenRad (GHDL) và trình mô phỏng HILO. Năm 1983 Gateway phát hành...nào phù hợp thì câu lệnh hay khối lệnh tương ứng sẽ được thực thi. Nếu không có alternative nào thích hợp thì lệnh default_statement được thực hiện, đó là tùy chọn không bắt buộc, không đặt nhiều lệnh mặc định này vào một câu lệnh case. Lệnh case có thể được lồng vào nhau. Ví dụ: reg [1:0] alu_con...
n3 = 12'h0; n4 = 12'h0; n5 = 12'h0; n6 = 12'h0; n7 = 12'h0; #20; n0 = 12'h123; n1 = 12'h123; n2 = 12'h123; n3 = 12'h123; n4 = 12'h123; n5 = 12'h123; n6 = 12'h123; n7 = 12'h123; #20; n0 = 12'h8f9; n1 = 12'h8f9; n2 = 12'h8f9; n3 = 12'h8f9; n4 = 12'h8f9; n5 = 12'h8f9; n6 = 12'h8f9; n7 = 12'h8f9; #200; end //--------------- tao xung clock có T = 20 ---------------- always #10 clk <= ~clk; endmodule Kết quả mô phỏng: Hình 7.12 – Kết quả mô phỏng bộ cộng 8 dữ liệu 12 bit Giao tiếp với led ma trận: Chương trình thực thi quét led ma trận gồm 8 bit để điều khiển quét hàng và 8 bit điều khiển quét cột led ma trận 8x8. Hình 7.13 – Sơ đồ khối chương trình giao tiếp led ma trận Chương trình chính: module quet_16_led (clk,quet); output [15:0] quet; input clk; reg [15:0] quet; reg clk1; reg [2:0] ctr; integer M; //----------------tao xung quet-------------------- always @ (posedge clk) begin if(M<250000) begin clk1=clk1; M=M+1; end else begin clk1=~clk1; M=0; end end //--------------chuong trinh quet led-------------- always @ (posedge clk1) begin case (ctr) 'd0: begin quet=16'h0001; ctr=1; end 'd1: begin quet =(quet <<1'b1); if(quet==16'h8000) ctr=2; else ctr=ctr; end 'd2: begin quet=quet >> 1'b1; if(quet==16'h0000) begin ctr=3; quet=16'h0001; end else ctr=ctr; end 'd3: begin quet = (quet<<1'b1) +1; if(quet==16'hffff) begin ctr=4; quet=16'h0180; end else ctr=ctr; end 'd4: begin quet[15:8]= (quet [15:8]<<1'b1); quet[7:0] = quet[7:0]>>1'b1; if(quet==16'h8001) ctr=5; else ctr=ctr; end 'd5: begin quet[15:8] = quet [15:8]>>1'b1; quet [7:0] = quet [7:0]<<1'b1; if(quet==16'h0180) ctr=6; else ctr=ctr; end 'd6: begin quet[15:8] = (quet [15:8]<<1'b1)+1; quet [7:0] = (quet [7:0]>>1'b1)+ 128; if(quet==16'hffff) ctr=7; else ctr=ctr; end 'd7: begin quet [15:8] = quet[15:8]>>1'b1; quet [7:0] = quet[7:0]<< 1'b1; if(quet==0) ctr=0; else ctr= ctr; end endcase end endmodule Điều chế độ rộng xung và chia tần: Chia tần số: Chương trình chính: Thực hiện chia một tần số ngõ vào, thành một tần số ngõ ra với số chia là bất kỳ có tầm giá trị từ 1 đến 1023. Sơ đồ khối của khối chia tần số như hình 7.14. Hình 7.14 – Sơ đồ khối khối chia tần số Trong đó: Số chia: là giá trị cần chia Clk: tần số ngõ vào Res: xung reset Clk_out: tần số ngõ ra Tên của module chính là chia_xung: Chương trình chính: module chia_xung (clk, res, clk_out, so_chia); //----------- cac ngo vao ---------- input clk; input res; input [9:0] so_chia; //---------- cac ngo ra ------------ output clk_out; reg clk_out; //------- bien trung gian ---------- reg [9:0] N; //-------- main program ------------ always @ (posedge clk or negedge clk ) begin if (!res) begin clk_out = 0; N = 0; end else if (so_chia == 0) begin clk_out = 0; N = 0; end else begin if(N == so_chia - 1) begin N = 0; clk_out = !clk_out; end else N = N + 1; end end endmodule Chương trình testbench module test_chia_xung; //--------- Inputs----------- reg clk; reg res; reg [9:0] so_chia; //------- Outputs---------- wire clk_out; //------- Instantiate the Unit Under Test (UUT)---------- chia_xung uut ( .clk(clk), .res(res), .clk_out(clk_out), .so_chia(so_chia)); initial begin // -------- Initialize Inputs --------- clk = 0; res = 0; so_chia = 0; // ------Wait 100 ns for global reset to finish------ #100; res =1; //------------cho reset len 1-------- #100; //--------- delay sau 100 ----------- so_chia = 2; //-------- nhap chia xung la 2------- #200; //--------- delay sau 200 ----------- so_chia = 5; //------ nhap chia xung la 5 -------- end //-------tao xung clock he thong ------- always #10 clk = !clk; endmodule Kết quả mô phỏng Hình 7.15 –Kết quả mô phỏng bộ chia tần số Nhìn vào kết quả mô phỏng ta thấy: khi nhập giá trị của số chia bằng 2 thì xung ngõ ra được chia 2, khi nhập giá trị của số chia là 5 thì xung ngõ ra được chia 5. Điều chế độ rộng xung: Chương trình chính Viết chương trình thực hiện bộ điều chế độ rộng xung PWM như hình 7.16. Hình 7.16 – Bộ điều chế độ rộng xung Trong đó: Duty: độ rộng xung ngõ ra có giá trị chọn từ 0 đến 100%, mỗi bước là 1% Clk: xung clock ngõ vào Res: xung reset hệ thống Clk_out1: xung clock ngõ ra thứ nhất đã được điều chế độ rộng xung, có tần số bằng 1/100 tần số ngõ vào clk. Clk_out2: xung clock ngõ ra thứ 2 đã được điều chế độ rộng xung, có tần số bằng 1/400 tần số ngõ vào clk. N, M: là các biến trung gian. Ta cho xuất ra ngoài để quan sát các thông số của bộ PWM. Tên của module là:PWM Chương trình chính: module PWM (res, clk, duty, clk_out1, clk_out2, N,M); //------ cac ngo vao --------------------------------------------- input res; //----- tin hieu reset ------------------------- input clk; //----- xung clock --------------------------- input [6:0] duty; //-------- do hong xung --------------------- //------ cac ngo ra ---------------------------------------------- output clk_out1; //----- xung ngo ra thu 1 ------------------- output clk_out2; //----- xung ngo ra thu 2 ------------------- //------- tin hieu dung de quan sat duty khi mo phong ------ output [6:0] N; //---- N dung de quan sat clk_out1 ------- output [8:0] M; //---- M dung de quan sat clk_out2 ------- reg clk_out1; reg clk_out2; //------ -------bien trung gian ------------------- reg [6:0] N; reg [8:0] M; //---------- main program ------------------------- always @ (posedge clk) begin //---------- xu ly reset ----------------------- if(!res) begin clk_out1 = 0; clk_out2 = 0; N = 1; M = 1; end //--------- chuong trinh xu ly chinh ----------- else begin //----------- xu ly ngo ra clk_out1 --------- if (N <= duty) begin N = N + 1; clk_out1 = 1; end else begin if(N == 100) begin N = 1; clk_out1 = 0; end else begin N = N + 1; clk_out1 = 0; end end //----------- xu ly ngo ra clk_out2 --------- if (M <= 4*duty) begin M = M + 1; clk_out2 = 1; end else begin if(M == 400) begin M = 1; clk_out2 = 0; end else begin M = M + 1; clk_out2 = 0; end end end end endmodule Chương trình testbench module test_PWM; // ---------Inputs------------ reg res; reg clk; reg [6:0] duty; //-------- Outputs---------- wire clk_out1; wire clk_out2; wire [6:0] N; wire [8:0] M; //--------- Instantiate the Unit Under Test (UUT)---------- PWM uut ( .res(res), .clk(clk), .duty(duty), .clk_out1(clk_out1), .clk_out2(clk_out2), .N(N), .M(M)); initial begin //--------- Initialize Inputs------------ res = 0; clk = 0; duty = 0; // ------Wait 100 ns for global reset to finish--------- #100; res=1; #100 duty=1; //- -- nhap duty = 1% ------ #20000; duty = 5; //--- nhap duty = 5%------- end //-----------tao xung clock vao ------------- always #5 clk =!clk; endmodule Kết quả mô phỏng: Hình 7.17 – Kết quả mô phỏng bộ điều chế độ rộng xung PWM khi duty = 1% Nhìn vào kết quả mô phỏng ta thấy, với duty = 1%, thì ở ngõ ra clk_out1 có thời gian ở mức logic “1” bằng 1 chu kỳ xung của clk, và thời gian ở mức logic “0” bằng 99 chu kỳ xung clk (bằng 100 – 1 chu kỳ xung ở mức 1), ngõ ra clk_out2 có thời gian ở mức logic “1” bằng 4 chu kỳ xung clk, và thời gian ở mức logic “0” bằng 396 chu kỳ xung clk (bằng 400 – 4 xung ở mức 1). Như vậy duty = 1/100 = 4/400 = 1%. Hình 7.17 – Kết quả mô phỏng bộ điều chế độ rộng xung PWM khi duty = 5% Nhìn vào kết quả mô phỏng ta thấy, với duty = 5%, thì ở ngõ ra clk_out1 có thời gian ở mức logic “1” bằng 5 chu kỳ xung của clk, và thời gian ở mức logic “0” bằng 95 chu kỳ xung clk (bằng 100 – 5 chu kỳ xung ở mức 1), ngõ ra clk_out2 có thời gian ở mức logic “1” bằng 20 chu kỳ xung clk, và thời gian ở mức logic “0” bằng 380 chu kỳ xung clk (bằng 400 – 20 xung ở mức 1). Như vậy duty = 5/100 = 20/400 = 5%. Truyền dữ liệu song song: Chương trình chính: Viết chương trình thực hiện bộ truyền dữ liệu song song có sơ đồ khối như hình 7.18. Hình 7.18 – Sơ đồ khối bộ truyền dữ liệu song song Trong đó: clk: xung clock bộ phát. res: tín hiệu reset. data_in: dữ liệu vào có độ rộng 8 bit. EN: tín hiệu cho phép truyền, tích cực mức 1. data_out: dữ liệu được truyền ra ngoài có độ rộng 8 bit. Dữ liệu vào được đưa vào chân data_in, dữ liệu này không được truyền ra ngoài, và dữ liệu data_out vẫn giữ nguyên giá trị trước đó khi EN = 0. Khi EN lên mức 1, thì dữ liệu vào data_in được truyền ra data_out để truyền đi. Khi tín hiệu res = 0, thì ngõ ra bộ phát được treo lên trạng thái tổng trở cao. Chương trình chính: module transmiter (res, clk, data_in, data_out, EN); //---------- cac ngo vao ------------------------------------------------ input res; input clk; //------ xung clock he thong ------------- input [7:0] data_in; //---- ------------du lieu vao -------------- input EN; //--------- tin hieu cho phep truyen ------ //-------------------- cac ngo ra ----------------------------------------- output [7:0] data_out; //--------------du lieu truyen di ----------- reg [7:0] data_out; //------------------ main program -------------------------------------- always @ (posedge clk) begin if(!res) data_out = 'dz; else if (!EN) data_out = data_out; else data_out = data_in; end endmodule Chương trình testbench: module test_transmiter; //--------- Inputs ------------- reg res; reg clk; reg [7:0] data_in; reg EN; //--------- Outputs ------------ wire [7:0] data_out; //------ Instantiate the Unit Under Test (UUT) ------- transmiter uut (.res(res), .clk(clk), .data_in(data_in), .data_out(data_out), .EN(EN) ); initial begin //------ Initialize Inputs ------------ res = 0; clk = 0; data_in = 0; EN = 0; #100; res = 1; //------cho reset len muc 1 ------ #100 data_in = 10; //--- cho du lieu vao bang 10 ----- #100 EN = 1; //--- cho phep truyen du lieu di --- #100 data_in = 20; //--- nhap du lieu thu 2 ------------ #100 EN = 0; //--- dung truyen ------------------- #100 data_in = 30; //--- nhap du lieu thu 3 ------------ #100 EN =1; //--- cho phep truyen --------------- end //---------------- tao xung clock he thong -------- always #10 clk = !clk; endmodule Kết quả mô phỏng: Hình 7.19 – Kết quả mô phỏng bộ truyền dữ liệu song song Nhìn vào kết quả mô phỏng bộ truyền dữ liệu ta thấy: Tại thời điểm khi res = 0 thì ngõ ra ở trạng thái tổng trở cao. Khi res = 1: Khi EN = 0: dữ liệu data_in = 10 đã được nhập vào trước đó nhưng vẫn không được truyền ra ngoài, và data_out vẫn giữ nguyên giá trị trước đó là data_out = z. Khi EN = 1: dữ liệu ngõ vào data_in được truyền ra ngoài data_out các giá trị lần lượt là 10 và 20. Dữ liệu data_in = 30 không được truyền ra ngoài khi EN = 0 và data_out vẫn giữ nguyên giá trị trước đó là data_out = 20, cho đến khi EN = 1 thì giá trị data_in = 30 mới được truyền ra ngoài data_out. Giao tiếp ADC và cảm biến nhiệt độ Chương trình chính: Viết chương trình giao tiếp ADC-8bit và hiển thị trên 3 led 7-đoạn bằng phương pháp quét có sơ đồ khối như hình 7.20. Hình 7.20 – Sơ đồ khối khối giao tiếp ADC và led 7 đoạn Cảm biến nhiệt độ xuất ra tín hiệu tương tự, tín hiệu tương tự được đưa vào ADC-8bit, ADC-8bit có nhiệm vụ chuyển tín hiệu tương tự nhận được từ cảm biến nhiệt độ thành tín hiệu số tương ứng dưới dạng số hex. FPGA có nhiệm vụ nhận dữ liệu số hex từ ADC, sau đó giải mã và cho hiển thị trên ba led-7 đoạn bằng phương pháp quét. Chương trình chính: module quet_3led (in, seven_doan, chonled, clk, res); //-------------- cac ngo vao ----------------------------- input clk; //---------- xung clock -------------- input [7:0] in; //------ du lieu 8 bit tu ADC -------- input res; //------ tin hieu reset ---------------- //-------------- cac ngo ra ------------------------------- output [2:0] chonled; //------ chon led hien thi -- output [7:0] seven_doan; //------ 7 doan + dau cham -- reg [2:0] chonled; reg [7:0] seven_doan; //-------- bien trung gian ----------------------------- reg [1:0] K; reg [3:0] M; reg [5:0] N; //---------dinh nghia ma 7 doan ----- parameter [6:0] so0 = 7'h40; //c0 parameter [6:0] so1 = 7'h79; //f9 parameter [6:0] so2 = 7'h24; //a4 parameter [6:0] so3 = 7'h30; //b0 parameter [6:0] so4 = 7'h19; //99 parameter [6:0] so5 = 7'h12; //92 parameter [6:0] so6 = 7'h02; //82 parameter [6:0] so7 = 7'h78; //f8 parameter [6:0] so8 = 7'h00; //80 parameter [6:0] so9 = 7'h10; //90 //--------main program------------- always @ (posedge clk) begin if(!res) begin K=0; N=0; M = 0; end else begin case (K) //---------------- hien thi led 7 doan thu nhat -------- (0): begin chonled=~1; if (N==63) begin //------ delay -------------- K=1; N=0; end else begin K=0; N=N+1; end M = (in%100)%10; end //---------------- hien thi led 7 doan thu hai -------- 1: begin chonled=~2; if (N==63) begin //------ delay ------------- K=2; N=0; end else begin K=1; N=N+1; end M = (in/10)%10; end //---------------- hien thi led 7 doan thu ba -------- 2: begin chonled=~4; if (N==63) begin //------ delay --------------------- K=0; N=0; end else begin K=2; N=N+1; end M = in/100; end endcase case(M) 0: begin seven_doan = {1'b1,so0}; end 1: begin seven_doan = {1'b1,so1}; end 2: begin seven_doan = {1'b1,so2}; end 3: begin seven_doan = {1'b1,so3}; end 4: begin seven_doan = {1'b1,so4}; end 5: begin seven_doan = {1'b1,so5}; end 6: begin seven_doan = {1'b1,so6}; end 7: begin seven_doan = {1'b1,so7}; end 8: begin seven_doan = {1'b1,so8}; end 9: begin seven_doan = {1'b1,so9}; end endcase end end endmodule Chương trình testbench: module test_quet_led; //------ Inputs --------- reg [7:0] in; reg clk; reg res; //------- Outputs ------- wire [7:0] seven_doan; wire [2:0] chonled; //----- Instantiate the Unit Under Test (UUT)------- quet_3led uut (.in(in), .seven_doan(seven_doan), .chonled(chonled), .clk(clk), .res(res) ); initial begin //----- Initialize Inputs ------------- in = 0; clk = 0; res = 0; #100; res =1; //------- cho reset len 1 --------- #100 in=201; //------- nhap du lieu thu 1 ------ #6000 in = 123; //------- nhap du lieu thu 2 ------ #6000 in = 255; //------- nhap du lieu thu 3 ------ end //----------- tao xung clock he thong ------------------ always #10 clk = !clk; endmodule Kết quả mô phỏng: Hình 7.21 – Kết quả mô phỏng bộ giao tiếp ADC và led 7 đoạn khi giả lập dữ liệu từ ADC bằng 201. Nhìn vào kết quả mô phỏng với dữ liệu vào là in = 201 ta thấy: Đầu tiên, tín hiệu chonled = 110, tức là led 7 đoạn thứ nhất được cho phép sáng, đồng thời mã 7 đoạn của số 1 là “f9” cũng được xuất ra led thứ nhất để hiển thị. Tiếp theo, tín hiệu chonled = 101, tức là led 7 đoạn thứ hai được cho phép sáng, đồng thời mã 7 đoạn của số 0 là “c0” cũng được xuất ra led thứ hai để hiển thị. Cuối cùng, tín hiệu chonled = 011, tức là led 7 đoạn thứ ba được cho phép sáng, đồng thời mã 7 đoạn của số 2 là “a4” cũng được xuất ra led thứ ba để hiển thị. Quá trình này được quét lặp đi lặp lại. Tương tự như vậy, hình 7.22 và 7.23 cho ta thấy kết quả mô phỏng trong trường hợp giả lập dữ liệu từ ADC lần lượt là 123 và 255. Hình 7.22 – Kết quả mô phỏng bộ giao tiếp ADC và led 7 đoạn khi giả lập dữ liệu từ ADC bằng 123. Hình 7.23 – Kết quả mô phỏng bộ giao tiếp ADC và led 7 đoạn khi giả lập dữ liệu từ ADC bằng 255. Tạo bộ đệm dữ liệu: Bộ đệm dữ liệu thường gọi là FIFO, có chức năng ghi và đọc dữ liệu có sơ đồ khối như hình 7.24. Hình 7.24 – Sơ đồ khối của khối FIFO Trong đó: DIN: dữ liệu ghi vào FIFO, có độ rộng 16 bit. DOUT: dữ liệu đọc ra từ FIFO, có độ rộng 16 bit RD_EN: chân cho phép đọc dữ liệu từ FIFO WR_EN: chân cho phép ghi dữ liệu vào FIFO CLK: xung clock đọc ghi dữ liệu EMPTY: chân báo dữ liệu của FIFO đã hết. FULL: chân báo ô nhớ của FIFO đã đầy RES: chân reset hệ thống. Trong nội dung giáo trình giới thiệu FIFO có khả năng lưu trữ 16 ô nhớ, mỗi ô nhớ có chứa dữ liệu 16 bit. Khi dữ liệu được ghi vào ô nhớ của FIFO đã đủ 16 mà chưa có dữ liệu nào được đọc ra thì FIFO sẽ báo đầy bộ nhớ bằng tín hiệu FULL và không cho phép ghi dữ liệu vào FIFO nữa. Ngược lại, khi dữ liệu trong FIFO đã được đọc hết ra ngoài thì FIFO sẽ báo đã hết dữ liệu bằng tín hiệu EMPTY và không cho phép đọc dữ liệu từ FIFO nữa. FIFO này vừa có thể đọc và ghi dữ liệu cùng một lúc. FIFO đã được ISE hỗ trợ sẵn IP core, do đó ta có thể tạo FIFO này từ IP core của Xilinx. Để tạo FIFO, ta vào Memories & Storage Elements trong Xilinx CORE Generator, chọn FIFOs. Sau đó chọn các thông số cho FIFO như sau: Write Width: chọn độ rộng dữ liệu của FIFO (độ rộng dữ liệu của DIN và DOUT). Write Depth: số ô nhớ của FIFO. Hình 7.25 – Thiết lập thông số của FIFO cần tạo Sau khi đã thiết lập thông số của FIFO cần tạo, thì ta tiến hành tạo FIFO theo các bước tạo IP core như ở phần 5.8. Sử dụng core có sẵn của ISE vào thiết kế: Sau khi đã tạo IP core, thì ta add IP core đã được tạo vào project và sử dụng như một chương trình mà ta đã viết. Ta xem xét IP core FIFO vừa được tạo ra ở phần 7.12, ta thấy IP core tạo ra source verilog có các khai báo vào ra giống như chương trình mà ta đã viết. Một đoạn source khai báo trong IP core FIFO vừa tạo ra như sau: module fifo_generator_v6_1(clk, rst, din, wr_en, rd_en, dout, full, empty); input clk; input rst; input [7 : 0] din; input wr_en; input rd_en; output [7 : 0] dout; output full; output empty; Bài tập bài 7: Bài tập 1: viết chương trình thiết kế mạch đếm lên từ 0 đến 99. Bài tập 2: viết chương trình thiết kế mạch đếm xuống từ 99 xuống 0. Bài tập 3: viết chương trình thiết kế mạch đếm lên từ 0 đến 99, sau đó đếm xuống từ 99 đến 0, sau đó lặp lại chu trình đếm. Bài tập 4: viết chương trình thiết kế mạch truyền/nhận dữ liệu theo chuẩn RS232. Bài tập 5: viết chương trình xuất dòng chữ “VMSLT” lên LCD 16x2. Bài tập 6: viết chương trình thiết kế đồng hồ số hiển thị trên 8 led 7 đoạn. Bài tập 7: viết chương trình thiết kế bộ đo tần số hiển thị trên 8 led 7 đoạn. Bài tập 8: viết chương trình thiết kế bộ điều chế độ rộng xung PWM. YÊU CẦU VỀ ĐÁNH GIÁ KẾT QUẢ HỌC TẬP BÀI 7: Nội dung: Về kiến thức: Trình bày được các kiến thức cụ thể về hệ thống số. Về kỹ năng: Sử dụng phần mềm ISE và modelsim để thiết kế, mô phỏng các ứng dụng cụ thể. Tạo các IP core có sẵn từ ISE. Kết nối phần cứng, đổ chương trình vào FPGA. Về thái độ: Đảm bảo an toàn về điện và vệ sinh công nghiệp. Phương pháp: Về kiến thức: Được đánh giá bằng hình thức kiểm tra viết, vấn đáp. Về kỹ năng: Đánh giá kỹ năng sử dụng ngôn ngữ Verilog HDL để thiết kế các ứng dụng cụ thể. Kỹ năng kết nối phần cứng theo đúng yêu cầu, đổ chương trình đã thiết kế vào FPGA. Về thái độ:Tỉ mỉ, cẩn thận, chính xác, an toàn về điện và ngăn nắp trong công việc. TÀI LIỆU THAM KHẢO Computer Architecture Handbook on Verilog HDL, Dr.Daniel - C.Hude, Computer Science Department Bucknell University Lewisburg, 1997. Verilog Hardware Description Laguage Reference Manual, Open Verilog International, 1992. The Complete Verilog Book, Vivek Sagdeo – Sun Micro Systems, 1998. Design Through Verilog HDL, IEEE Press, 2004. The Verilog Hardware Description Language – Fifth Edition, Donald E.Thomas – ECE Department Carnegie Mellon University Pittsburgh, Pholip R.Moorby – Co-design Automation, 2002. A Guide to Digital Design and Synthesis - Second Editon, Samir lapnitkar, 2003. Spartan – 3E FPGA Family Data Sheet, Xilinx, 2009. ModelSim User’s Manual A verilog HDL, second edition. Verilog coding for logic synthesis - A JOHN WILEY & SONS, INC., PUBLICATION A Guide to Digital Design and Synthesis, Second Edition - Prentice Hall PTR – 2003 Introduction to Verilog - Peter M. Nyasulu – 2001 www.google.com.
File đính kèm:
- giao_trinh_vi_mach_so_lap_trinh_nghe_dien_tu_cong_nghep_trin.doc