Thông báo

Collapse
No announcement yet.

thiết kế CPU 16 bít bằng ngôn ngữ verilog

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • thiết kế CPU 16 bít bằng ngôn ngữ verilog

    Mình vừa hoàn thanh việc thiết kế CPU đơn giấn 16 bít bằng ngôn ngữ vẻilog
    nạp thử nghiệm trên kit DE2 của Altera
    ban đầu viết chương trinh ứng dụng nạp trực tiếp vào ROM bằng các mã máy để chạy thử nghiệm
    bây giờ mình muốn dùng ngôn ngữ C để chuyển các ngôn ngữ gợi nhớ (mình tự đặt ra giống asembly ) thành ngôn ngữ máy .
    nhưng không biết bắt đầu từ đâu
    ai biết xin cứu với
    nội dung:
    tạo một file text gồm các lệh gợi nhớ để thực hiện chương trình nạp vao cpu
    dùng C đọc các dòng lệnh gợi nhớ trên file text và chuyển thành mã máy
    lệnh CPU mình là 16 bit 4 bit opcode 4 bit dùng chọn thanh ghi ( có 4 thanh ghi R0,R1,R2,R3)

  • #2
    chào bạn, mình cũng đang tìm cách thiết kế một con cpu nhưng hiện giờ mình không có tài liệu tham khảo cách thiết kế. Bạn có tài liệu nào có thể chia sẻ cho mình với.
    Cảm ơn bạn nhiều.
    ohenri100@yahoo.com
    Ôi cuộc đời!!!

    Comment


    • #3
      Nguyên văn bởi ohenri Xem bài viết
      chào bạn, mình cũng đang tìm cách thiết kế một con cpu nhưng hiện giờ mình không có tài liệu tham khảo cách thiết kế. Bạn có tài liệu nào có thể chia sẻ cho mình với.
      Cảm ơn bạn nhiều.
      ohenri100@yahoo.com
      minh cũng gặp nhiều rắc rối trong khi thiết kế, minh gởi cho bạn đoạn code
      đẫ làm
      nhưng mình ko thể giúp bạn giải thích từng phần được mình chưa làm xong đồ án tốt nghiệp

      Comment


      • #4
        Nguyên văn bởi lytiendung Xem bài viết
        Mình vừa hoàn thanh việc thiết kế CPU đơn giấn 16 bít bằng ngôn ngữ vẻilog
        nạp thử nghiệm trên kit DE2 của Altera
        ban đầu viết chương trinh ứng dụng nạp trực tiếp vào ROM bằng các mã máy để chạy thử nghiệm
        bây giờ mình muốn dùng ngôn ngữ C để chuyển các ngôn ngữ gợi nhớ (mình tự đặt ra giống asembly ) thành ngôn ngữ máy .
        nhưng không biết bắt đầu từ đâu
        ai biết xin cứu với
        nội dung:
        tạo một file text gồm các lệh gợi nhớ để thực hiện chương trình nạp vao cpu
        dùng C đọc các dòng lệnh gợi nhớ trên file text và chuyển thành mã máy
        lệnh CPU mình là 16 bit 4 bit opcode 4 bit dùng chọn thanh ghi ( có 4 thanh ghi R0,R1,R2,R3)
        Tất cả các loại CPU đều chỉ chạy trên ngôn ngữ máy, tức chỉ hiểu các số 0,1 hay opcode. Khi xây dựng một CPU phải đảm bảo thực hiện được các lệnh cơ bản (đọc/ghi thanh ghi, đọc/ghi bộ nhớ, lệnh toán học(+,-),lệnh rẽ nhánh, xử lý ngắt). Tùy vào độ phức tạp của cấu trúc CPU mà mỗi loại có một tập lệnh Assembly khác nhau (lấy ví dụ PIC 8bit có 35 lệnh ASM).

        Bạn nói đã chạy thành công CPU 16bit, vậy chắc bạn cũng đã xây dựng xong được một tập lệnh assembly cơ bản cho CPU của bạn. Công việc mà như bạn nói và muốn làm chính là xây dựng một Trình biên dịch (Compiler) cho CPU của bạn để dịch từ mã lệnh ASM hoặc C sang ngôn ngữ máy (chính là opcode) và lưu nó thành một file (kiểu như file HEX) để nạp vào ROM của CPU.
        Công việc xây dựng một trình biên dịch nó khá phức tạp. Nếu CPU đơn giản, không có pipeline thì việc viết compiler khá đơn giản, chỉ việc ánh xạ lệnh từ C >> ASM >> Opcode.
        Khi CPU phức tạp hơn, có pipeline và các kỹ thuật xử lý song song khác thì bộ compiler còn phải đảm nhận nhiệm vụ tối ưu mã lệnh để tận dụng tối đa khả năng pipeline của CPU. Các kỹ thuật như:
        - Loop unrolling
        - Scheduling
        - Remove brand/if instruction
        - Software pipeling
        - Hardware Pipeline
        - Cache management
        - Memory access
        .... Nói chung khá phức tạp. Tuy nhiên nếu tìm hiểu và thực hiện từ những bước đơn giản đến phức tạp, tôi chắc bạn sẽ thành công.
        Tài liệu tham khảo trên mạng có rất nhiều, bạn cứ tìm với những từ khóa về Compiler, Pipeline technical, Computer Organization and Architecture

        Chúc thành công.
        Ethernet-RS232, PIC Webserver, RFID Reader
        CallerID, Cảnh báo BTS, ...
        0988006696
        linhnc308@gmail.com
        http://linhnc308.blogspot.com

        Comment


        • #5
          camon ban lytiendung rat nhieu, nhung có code minh cung khong the hieu duoc ý tưởng thiết kế đâu.
          Bạn làm ơn cho mình xem sơ đồ mạch thiét kế được không??? Mình chỉ cần tham khảo sơ đồ mạch thiết kế, có bài hướng dẫn hay giải thích gì đó càng tốt.
          Mong được sự giúp đỡ, chúc bạn làm đề tài tốt.
          À, có cần tài liệu gì cứ hỏi mình nếu có mình sẽ share cho.
          Cảm ơn nhiều.
          Ôi cuộc đời!!!

          Comment


          • #6
            lam on giúp mình với, mình đang làm đồ án học kỳ. UI khó quá không biét tham khảo đâu nữa.
            Ôi cuộc đời!!!

            Comment


            • #7
              Tài liệu để làm về thiết kế MCU và compiler thì có mấy quyển cơ bản sau:
              1. Computer Organization and Design
              2. Compiler Optimizations
              3. J.A.Fisher - Embedded Computing
              4. Computer Architecture- A Quantitative Approach - 4ed

              Tiện đây up cho các bạn cái Core 8051, xem kỹ file tài liệu đi kèm trong đó. Ngôn ngữ dùng VHDL
              Chúc thành công.
              Attached Files
              Ethernet-RS232, PIC Webserver, RFID Reader
              CallerID, Cảnh báo BTS, ...
              0988006696
              linhnc308@gmail.com
              http://linhnc308.blogspot.com

              Comment


              • #8
                Nguyên văn bởi linhnc308 Xem bài viết
                Tài liệu để làm về thiết kế MCU và compiler thì có mấy quyển cơ bản sau:
                1. Computer Organization and Design
                2. Compiler Optimizations
                3. J.A.Fisher - Embedded Computing
                4. Computer Architecture- A Quantitative Approach - 4ed

                Tiện đây up cho các bạn cái Core 8051, xem kỹ file tài liệu đi kèm trong đó. Ngôn ngữ dùng VHDL
                Chúc thành công.
                mình gặp một số vấn đề trong việc thiết kế trình biên dịch
                ko biết một trình biên dịch thực sự là như thế nào ở đây mình chỉ làm công việc giống mã hoá lại thôi
                * nội dung mình làm như thế này
                - nhập lệnh vào ví dụ: ADD R0,R1
                -mình đọc các kí tự ADD để phân tích opcode lệnh ví dụ ADD-> 1011 .khi đùng 3 ký tự trên thì minh gán là 1011
                -phân tích tiếp tục R0 ,R1 -> 00 01
                -mình dùng cấu trúc if else để thực hiện việc nhận dạng lệnh đánh vào

                mình làm vậy ko biết có đung là trình biên dịch ko? (thấy giống giãi mã hơn)
                nhưng làm vậy thì mình có thể giải quyết được việc nhập lệnh bằng mã gợi nhớ thay vì mã máy
                sau khi đánh lệnh xong các lệnh này sẽ lưu vào một file.hex
                và file này sẽ dùng để nạp vào RAM
                nhưng mình chưa biết cách sử dụng file.hex này. Nếu bạn có kinh nghiệm thì chỉ cho mình với
                thanks

                Comment


                • #9
                  Nguyên văn bởi ohenri Xem bài viết
                  camon ban lytiendung rat nhieu, nhung có code minh cung khong the hieu duoc ý tưởng thiết kế đâu.
                  Bạn làm ơn cho mình xem sơ đồ mạch thiét kế được không??? Mình chỉ cần tham khảo sơ đồ mạch thiết kế, có bài hướng dẫn hay giải thích gì đó càng tốt.
                  Mong được sự giúp đỡ, chúc bạn làm đề tài tốt.
                  À, có cần tài liệu gì cứ hỏi mình nếu có mình sẽ share cho.
                  Cảm ơn nhiều.
                  gởi bạn sơ đồ con CPU này

                  Comment


                  • #10
                    ban lytiendung oi, bạn gởi mình sơ đồ ở đâu sao mình chả thấy gì vậy bạn.
                    Làm ơn gởi lại đi bạn. Mình ko thấy sơ đồ đâu cả.
                    cảm ơn nha.
                    Ôi cuộc đời!!!

                    Comment


                    • #11
                      support

                      Nguyên văn bởi ohenri Xem bài viết
                      ban lytiendung oi, bạn gởi mình sơ đồ ở đâu sao mình chả thấy gì vậy bạn.
                      Làm ơn gởi lại đi bạn. Mình ko thấy sơ đồ đâu cả.
                      cảm ơn nha.
                      goi lai cho ban

                      Comment


                      • #12
                        Các bạn cho mình hỏi tí:
                        Mình viết chương trình thế này ko biết sai chỗ nào nhưng khi nạp một file dữ liệu vào ram đều không nạp được vào vùng nhớ cuối. Vùng nhớ cuối luôn la xxxxxxxx
                        Code:
                        module fsm(clock, reset, enter, halt, input1, output1);
                        input clock;
                        input reset;
                        input enter;
                        input [7:0]input1;
                        output halt;
                        reg halt;
                        output[7:0]output1;
                        reg [3:0]state;
                        reg[7:0]IR;
                        reg[4:0]PC;
                        reg[7:0]A;
                        reg[4:0]memory_address;
                        reg memwr;
                        `define s_start 0
                        `define s_fetch 1
                        `define s_decode 2
                        `define s_input 8
                        `define s_halt 11
                        assign output1 = A;
                        // Single Port ROM
                        parameter DATA_WIDTH = 8;
                        parameter ADDR_WIDTH = 5;
                        	reg [DATA_WIDTH-1:0]memory_data[2**ADDR_WIDTH-1:0];
                        	initial
                        	begin
                        		$readmemb("Text1.txt", memory_data);
                        	end
                        //*********************************************
                        always @(posedge clock or posedge reset)
                        begin
                        if (reset) begin
                        			PC=5'b0;
                        			IR=8'b0;
                        			A=8'b0;
                        			memwr=1'b0;
                        			halt=1'b0;
                        			state= `s_start;
                        			end
                        else 	begin
                        			case (state)
                        				`s_start: 
                        					begin
                        					memory_address = PC;
                        					state = `s_fetch;
                        					end
                        				`s_fetch:
                        					begin
                        					IR = memory_data[memory_address];
                        					PC = PC + 5'b1;
                        					state = `s_decode;
                        					end
                        				`s_decode:
                        					begin
                        					memory_address = IR[4:0];
                        					case (IR[7:5])
                        					3'b100: state = `s_input;
                        					3'b111: state = `s_halt;
                        					default: state = `s_start;
                        					endcase
                        					end
                        				`s_input:
                        					begin
                        					A = input1;
                        					if (enter == 0) state = `s_input;
                        					else state = `s_start;
                        					end
                        				`s_halt:
                        					begin
                        					halt = 1'b1;
                        					state = `s_halt;
                        					end
                        				default:
                        					state = `s_halt;
                        			endcase
                        		end
                        end
                        endmodule
                        Nội dung file text1.txt :
                        Code:
                        @000
                        10000000
                        @001
                        01111111
                        @002
                        10100100
                        @003
                        11000001
                        @004
                        11111111
                        @005
                        00000001
                        @006
                        00000000
                        @007
                        00000000
                        @008
                        00000000
                        @009
                        00000000
                        @00a
                        00000000
                        @00b
                        00000000
                        @00c
                        00000000
                        @00d
                        00000000
                        @00e
                        00000000
                        @00f
                        00000000
                        @010
                        00000000
                        @011
                        00000000
                        @012
                        00000000
                        @013
                        00000000
                        @014
                        00000000
                        @015
                        00000000
                        @016
                        00000000
                        @017
                        00000000
                        @018
                        00000000
                        @019
                        00000000
                        @01a
                        00000000
                        @01b
                        00000000
                        @01c
                        00000000
                        @01d
                        00000000
                        @01e
                        00000000
                        @01f
                        00000000
                        ở đây mình chỉ muón mô phỏng 1 phần nhỏ của máy trạng thái, một phần nhỏ của cpu. mình luôn nhận đwowcj cảnh báo sau:
                        Warning (10850): Verilog HDL warning at microprocessor.v(30): number of words (31) in memory file does not match the number of elements in the address range [31:0]
                        Warning: Memory Initialization File or Hexadecimal (Intel-Format) File C:/altera/70/quartus/baitap/fsm/db/ram0_fsm_1a5dd.hdl.mif contains don't care values -- overwriting them with 0s
                        rõ rang là file text1.txt của mình có 32 dwx liệu tương ứng với 32 vùng nhớ sao lại cứ bị warning đó và giá trị cuối khong nạp được là sao vạy các bạn
                        Cảm ơn.

                        ngohaibac:
                        bạn nhớ cho các lệnh vào trong thẻ code thì mới dễ đọc để debug
                        Last edited by ngohaibac; 27-05-2008, 10:24.
                        Ôi cuộc đời!!!

                        Comment


                        • #13
                          bạn lytiendung ơi, bạn đính kèm file hay sao mà mình không thấy file đính kềm của bạn, mình có thấy gì kèm theo đâu.
                          hay lam ơn gởi mình qua mail được không bạn
                          cảm ơn bạn nhiều
                          ohenri100@yahoo.com
                          Ôi cuộc đời!!!

                          Comment


                          • #14
                            ui, ko ai giúp mình cả.
                            Anh em nào cho ý kiến vơi.
                            Ôi cuộc đời!!!

                            Comment


                            • #15
                              Verilog

                              các bác giúp em quyển sách này với: COMPUTER SYSTEM ORGANIZATION AND ACHITECTURE . JOHN . D . CAPINELLI.
                              EM ĐANG CẦN GẤP. CÁC BÁC GIÚP ĐỠ EM VỚI NHÉ.

                              Comment

                              Về tác giả

                              Collapse

                              lytiendung Tìm hiểu thêm về lytiendung

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X