├── ARM-tutorial ├── implementation │ ├── asmlab2 │ │ ├── Test │ │ ├── Init.s │ │ ├── Test.s │ │ ├── asmlab2.mcp │ │ └── asmlab2_Data │ │ │ ├── CWSettingsWindows.stg │ │ │ ├── DebugRel │ │ │ ├── asmlab2.axf │ │ │ ├── ObjectCode │ │ │ │ ├── Init.o │ │ │ │ └── Test.o │ │ │ └── TargetDataWindows.tdt │ │ │ ├── Debug │ │ │ └── TargetDataWindows.tdt │ │ │ └── Release │ │ │ └── TargetDataWindows.tdt │ ├── ext_interrupt │ │ ├── interrupt.c │ │ ├── head.s │ │ ├── head2.s │ │ ├── init.c │ │ ├── main.c │ │ ├── option.h │ │ ├── S3C2440 ARM.mcp │ │ ├── ext_interrupt.mcp │ │ ├── ext_interrupt_Data │ │ │ ├── Debug │ │ │ │ ├── 1.bin │ │ │ │ ├── 2.bin │ │ │ │ ├── ext_interrupt.axf │ │ │ │ ├── ext_interrupt.bin │ │ │ │ └── TargetDataWindows.tdt │ │ │ ├── Release │ │ │ │ ├── ext_int.bin │ │ │ │ ├── ObjectCode │ │ │ │ │ ├── head.o │ │ │ │ │ └── main.o │ │ │ │ ├── ext_interrupt.axf │ │ │ │ └── TargetDataWindows.tdt │ │ │ ├── CWSettingsWindows.stg │ │ │ └── DebugRel │ │ │ │ ├── ext_interrupt.axf │ │ │ │ ├── ext_interrupt.bin │ │ │ │ └── TargetDataWindows.tdt │ │ ├── DEF.h │ │ └── s3c2440.h │ ├── GPIO │ │ ├── Init.s │ │ ├── gpio.c │ │ ├── GPIO.mcp │ │ ├── S3C2440 ARM.mcp │ │ ├── GPIO_Data │ │ │ ├── DebugRel │ │ │ │ ├── GPIO.axf │ │ │ │ ├── GPIO.bin │ │ │ │ ├── ObjectCode │ │ │ │ │ ├── Init.o │ │ │ │ │ ├── gpio.o │ │ │ │ │ ├── Startup.o │ │ │ │ │ └── 2440addr.o │ │ │ │ └── TargetDataWindows.tdt │ │ │ ├── CWSettingsWindows.stg │ │ │ ├── Debug │ │ │ │ └── TargetDataWindows.tdt │ │ │ └── Release │ │ │ │ └── TargetDataWindows.tdt │ │ └── S3C2440_ARM_Data │ │ │ ├── CWSettingsWindows.stg │ │ │ ├── Debug │ │ │ └── TargetDataWindows.tdt │ │ │ ├── DebugRel │ │ │ └── TargetDataWindows.tdt │ │ │ └── Release │ │ │ └── TargetDataWindows.tdt │ ├── armasmc │ │ ├── Init.s │ │ ├── armasmc.c │ │ ├── delay.s │ │ ├── armasmc.mcp │ │ └── armasmc_Data │ │ │ ├── CWSettingsWindows.stg │ │ │ ├── Debug │ │ │ └── TargetDataWindows.tdt │ │ │ ├── DebugRel │ │ │ └── TargetDataWindows.tdt │ │ │ └── Release │ │ │ └── TargetDataWindows.tdt │ ├── asmlab1 │ │ ├── Init.s │ │ ├── comp.s │ │ ├── asmlab1.mcp │ │ └── asmlab1_Data │ │ │ ├── CWSettingsWindows.stg │ │ │ ├── DebugRel │ │ │ ├── asmlab1.axf │ │ │ ├── asmlab1.bin │ │ │ ├── ObjectCode │ │ │ │ ├── Init.o │ │ │ │ └── comp.o │ │ │ └── TargetDataWindows.tdt │ │ │ ├── Debug │ │ │ └── TargetDataWindows.tdt │ │ │ └── Release │ │ │ └── TargetDataWindows.tdt │ ├── test │ │ ├── test.bin │ │ ├── test.mcp │ │ ├── Init.s │ │ ├── test_Data │ │ │ ├── DebugRel │ │ │ │ ├── test.axf │ │ │ │ ├── ObjectCode │ │ │ │ │ ├── Init.o │ │ │ │ │ └── Main.o │ │ │ │ └── TargetDataWindows.tdt │ │ │ ├── CWSettingsWindows.stg │ │ │ ├── Debug │ │ │ │ └── TargetDataWindows.tdt │ │ │ └── Release │ │ │ │ └── TargetDataWindows.tdt │ │ └── Main.c │ ├── asmmodelab │ │ ├── Init.s │ │ ├── asmmodelab.mcp │ │ └── asmmodelab_Data │ │ │ ├── CWSettingsWindows.stg │ │ │ ├── DebugRel │ │ │ ├── asmmodelab.axf │ │ │ ├── ObjectCode │ │ │ │ └── Init.o │ │ │ └── TargetDataWindows.tdt │ │ │ ├── Debug │ │ │ └── TargetDataWindows.tdt │ │ │ └── Release │ │ │ └── TargetDataWindows.tdt │ └── uart_test │ │ ├── start.S │ │ ├── uart_test │ │ ├── uart_test.mcp │ │ ├── uart_Data │ │ │ ├── DebugRel │ │ │ │ ├── uart.axf │ │ │ │ ├── ObjectCode │ │ │ │ │ ├── lib.o │ │ │ │ │ ├── start.o │ │ │ │ │ ├── xmain.o │ │ │ │ │ └── uart_driver.o │ │ │ │ └── TargetDataWindows.tdt │ │ │ ├── CWSettingsWindows.stg │ │ │ ├── Debug │ │ │ │ └── TargetDataWindows.tdt │ │ │ └── Release │ │ │ │ └── TargetDataWindows.tdt │ │ └── uart_test_Data │ │ │ ├── CWSettingsWindows.stg │ │ │ ├── DebugRel │ │ │ ├── uart_test.axf │ │ │ ├── uart_test.bin │ │ │ ├── ObjectCode │ │ │ │ ├── lib.o │ │ │ │ ├── start.o │ │ │ │ ├── xmain.o │ │ │ │ └── uart_driver.o │ │ │ └── TargetDataWindows.tdt │ │ │ ├── Debug │ │ │ └── TargetDataWindows.tdt │ │ │ └── Release │ │ │ └── TargetDataWindows.tdt │ │ ├── uart_driver.h │ │ ├── lib.h │ │ ├── xmain.c │ │ ├── uart_driver.c │ │ └── lib.c ├── A11 - Exception management for ARM.md ├── A12 - ARM pipeline technology.md ├── A21 - Detailed explanation of ARM multi-register access instructions.md ├── A09 - Working status of ARM processor.md ├── A26 - Overview of ARM Embedded System Development Process.md ├── A24 - Detailed Explanation of ARM Abnormal Interrupt Instructions SWI, BKPT, CLZ.md ├── A14 - ARM IO access and chip selection.md ├── A16 - ARM immediate addressing and register addressing.md ├── A06 - Computer Architecture and Instruction Set.md ├── A05 - Application and Development of Embedded System.md ├── A02 - Overview of Embedded System Development.md ├── A17 - ARM indirect addressing, indexed addressing and multiple register addressing.md ├── A01 - Embedded system overview and characteristics.md ├── A13 - ARM memory organization, coprocessor and on-chip bus.md ├── A10 - ARM working mode and register organization.md ├── A31 - ARM assembler control pseudo-ops.md ├── A25 - Summary of ARM coprocessor instructions.md ├── A34 - What is ATPCS.md ├── A22 - SWP, MRS, MSR of exchange instruction.md ├── Experiment │ ├── AE02 - String Copy.md │ └── AE01 - Simple Data Movement.md ├── A29 - Detailed explanation of ARM symbol definition pseudo-operation.md ├── A15 - ARM instruction set classification and encoding.md ├── A23 - ARM transfer instruction (branch instruction).md ├── A27 - ARM common development and compilation software introduction.md └── A28 - Overview of ARM-related development tools.md ├── DSP-tutorial └── implementation │ ├── dsp_18_2.m │ ├── dsp_18_1.m │ ├── amp.m │ ├── prf.m │ ├── rxx.m │ ├── dsp_11.m │ ├── dsp_13.m │ ├── dsp_15.m │ ├── dsp_16.m │ ├── dsp_17.m │ ├── dsp_19.m │ ├── dsp_25.m │ ├── dsp_26.m │ ├── dsp_28.m │ ├── dsp_8_3.m │ ├── dsp_9_2.m │ ├── freqs_m.m │ ├── impseq.m │ ├── afd_chb1.m │ ├── afd_chb2.m │ ├── afd_elip.m │ ├── cheb1hpf.m │ ├── dir2ladr.m │ ├── dsp_12_1.m │ ├── dsp_12_2.m │ ├── dsp_12_3.m │ ├── dsp_13_4.m │ ├── dsp_14_1.m │ ├── dsp_14_2.m │ ├── dsp_19_2.m │ ├── dsp_22_1.m │ ├── dsp_22_2.m │ ├── dsp_22_3.m │ ├── dsp_23_1.m │ ├── ideal_lp.m │ ├── imp_invr.m │ ├── u_buttap.m │ ├── u_chb2ap.m │ ├── u_chblap.m │ ├── u_elipap.m │ ├── zmapping.m │ ├── ex61.m │ ├── rect_fuction.m │ ├── dir2fs.m │ ├── let me cry hook demo 1.mp3 │ ├── dtft.m │ ├── dft2.m │ ├── ex3058.m │ ├── freqz_m.m │ ├── ex3059.m │ ├── cplxcomp.m │ ├── dft1.m │ ├── dsp_8_2.m │ ├── dsp_8_1.m │ ├── dsp_13_3.m │ ├── dsp_9_1.m │ ├── dir2latc.m │ ├── Hr_Type3.m │ ├── Hr_Type2.m │ ├── ladrfilt.m │ ├── dir2cas.m │ ├── dsp_8_4.m │ ├── dsp_20_1.m │ ├── dsp_10.m │ ├── dsp_20_2.m │ ├── dir2par.m │ ├── afd_butt.m │ ├── dsp_21_1.m │ ├── dsp_21_2.m │ ├── exchebyshev1.m │ ├── exelliptic.m │ ├── exbutterworth.m │ ├── dsp_24.m │ ├── exchebylowpass.m │ ├── exellipticlowpass.m │ ├── exbutterlowpass.m │ ├── exbilibuterlowpass.m │ ├── exbillicheb2lowpass.m │ ├── exbilliellipticlowpass.m │ ├── dsp_27.m │ ├── ex3060.m │ └── sdir2cas.m ├── resources └── qrcode.jpg ├── reference ├── Getting Started with Verilog HDL.pdf ├── VERILOG HDL and FPGA Digital System Design.pdf ├── Verilog HDL Digital Design and Synthesis.pdf ├── Embedded ARM System Principle and Example Development.pdf ├── Embedded System Principles and Application Tutorial.pdf └── Verilog HDL and CPLDFPGA Project Development Tutorial.pdf ├── .gitattributes └── FPGA-tutorial ├── F23 - State Machine Concept and Design.md ├── F22 - Design and Simulation of M-sequence Code Generation Circuit.md ├── F15 - Hierarchical Approach to Circuit Design.md ├── F09 - Simulation and Verification of Logic Functions.md ├── F17 - Fundamentals of Sequential Circuit Modeling.md ├── F08 - Basic Structure of Verilog HDL Program.md ├── F06 - Design of Combinational Logic Circuits.md ├── F04 - Algebraic Simplification of Logical Functions.md ├── F10 - Common Commands for Verilog HDL Simulation.md └── F13 - Verilog HDL Data Flow Modeling and Operators.md /ARM-tutorial/implementation/asmlab2/Test: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_18_2.m: -------------------------------------------------------------------------------- 1 | h=[1,3,5,-3,-1]/9; 2 | [N,Hk,wk]=dir2fs(h); 3 | N,Hk,wk -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/interrupt.c: -------------------------------------------------------------------------------- 1 | //############# interrupt.c ############# 2 | -------------------------------------------------------------------------------- /resources/qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/resources/qrcode.jpg -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_18_1.m: -------------------------------------------------------------------------------- 1 | b=[1,3,5,3,1]; 2 | a=[1]; 3 | [b0,B,A]=dir2cas(b,a); 4 | b0,B,A 5 | 6 | -------------------------------------------------------------------------------- /DSP-tutorial/implementation/amp.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/amp.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/prf.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/prf.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/rxx.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/rxx.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_11.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_11.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_13.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_13.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_15.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_15.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_16.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_16.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_17.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_17.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_19.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_19.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_25.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_25.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_26.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_26.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_28.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_28.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_8_3.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_8_3.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_9_2.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_9_2.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/freqs_m.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/freqs_m.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/impseq.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/impseq.m -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/Init.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/Init.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/gpio.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/gpio.c -------------------------------------------------------------------------------- /DSP-tutorial/implementation/afd_chb1.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/afd_chb1.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/afd_chb2.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/afd_chb2.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/afd_elip.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/afd_elip.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/cheb1hpf.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/cheb1hpf.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dir2ladr.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dir2ladr.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_12_1.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_12_1.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_12_2.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_12_2.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_12_3.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_12_3.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_13_4.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_13_4.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_14_1.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_14_1.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_14_2.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_14_2.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_19_2.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_19_2.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_22_1.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_22_1.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_22_2.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_22_2.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_22_3.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_22_3.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_23_1.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/dsp_23_1.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/ideal_lp.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/ideal_lp.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/imp_invr.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/imp_invr.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/u_buttap.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/u_buttap.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/u_chb2ap.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/u_chb2ap.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/u_chblap.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/u_chblap.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/u_elipap.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/u_elipap.m -------------------------------------------------------------------------------- /DSP-tutorial/implementation/zmapping.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/zmapping.m -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO.mcp -------------------------------------------------------------------------------- /ARM-tutorial/implementation/armasmc/Init.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/armasmc/Init.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/Init.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/Init.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/comp.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/comp.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/Init.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/Init.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/Test.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/Test.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/test.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/test/test.bin -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/test.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/test/test.mcp -------------------------------------------------------------------------------- /DSP-tutorial/implementation/ex61.m: -------------------------------------------------------------------------------- 1 | wp=0.6*pi; 2 | ws=0.4586*pi; 3 | Rp=1; 4 | As=15; 5 | [b,a]=cheb1hpf(wp,ws,Rp,As); 6 | [C,B,A]=dir2cas(b,a); -------------------------------------------------------------------------------- /DSP-tutorial/implementation/rect_fuction.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/rect_fuction.m -------------------------------------------------------------------------------- /ARM-tutorial/implementation/armasmc/armasmc.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/armasmc/armasmc.c -------------------------------------------------------------------------------- /ARM-tutorial/implementation/armasmc/delay.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/armasmc/delay.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmmodelab/Init.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmmodelab/Init.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/start.S: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/start.S -------------------------------------------------------------------------------- /ARM-tutorial/implementation/armasmc/armasmc.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/armasmc/armasmc.mcp -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/asmlab1.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/asmlab1.mcp -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/asmlab2.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/asmlab2.mcp -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/Init.s: -------------------------------------------------------------------------------- 1 | IMPORT Main 2 | AREA Init,CODE,READONLY 3 | 4 | ENTRY 5 | LDR R0,=0x12345678 6 | BL Main 7 | B . 8 | END -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/S3C2440 ARM.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/S3C2440 ARM.mcp -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/head.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/head.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/head2.s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/head2.s -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/init.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/init.c -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/main.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/main.c -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/option.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/option.h -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dir2fs.m: -------------------------------------------------------------------------------- 1 | function[N,Hk,wk]=dir2fs(b) 2 | N=length(b); 3 | Hk=fft(b); 4 | k=0:N-1; 5 | wk=exp(2*pi*1i/N).^k; 6 | end 7 | 8 | -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmmodelab/asmmodelab.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmmodelab/asmmodelab.mcp -------------------------------------------------------------------------------- /DSP-tutorial/implementation/let me cry hook demo 1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/DSP-tutorial/implementation/let me cry hook demo 1.mp3 -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/S3C2440 ARM.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/S3C2440 ARM.mcp -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dtft.m: -------------------------------------------------------------------------------- 1 | function[m,a,w]=dtft(x) 2 | N=length(x); 3 | n=0:N-1; 4 | w=linspace(-2*pi,2*pi,500); 5 | y=x*exp(-j*n'*w); 6 | m=abs(y); 7 | a=angle(y); -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/GPIO.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/GPIO.axf -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/GPIO.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/GPIO.bin -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt.mcp -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/test_Data/DebugRel/test.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/test/test_Data/DebugRel/test.axf -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test.mcp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test.mcp -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/test_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/test/test_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /reference/Getting Started with Verilog HDL.pdf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8122ee4404b44e05424679ac23d45bce731d68be30d49d20d69724cf142a647c 3 | size 61711146 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | Embedded[[:space:]]ARM[[:space:]]System[[:space:]]Principle[[:space:]]and[[:space:]]Example[[:space:]]Development.pdf filter=lfs diff=lfs merge=lfs -text 2 | *.m linguist-language=c 3 | -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/ObjectCode/Init.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/ObjectCode/Init.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/ObjectCode/gpio.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/ObjectCode/gpio.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/armasmc/armasmc_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/armasmc/armasmc_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/asmlab1_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/asmlab1_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/asmlab1.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/asmlab1.axf -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/asmlab1.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/asmlab1.bin -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/asmlab2_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/asmlab2_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/asmlab2_Data/DebugRel/asmlab2.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/asmlab2_Data/DebugRel/asmlab2.axf -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/test_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/test/test_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/test_Data/DebugRel/ObjectCode/Init.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/test/test_Data/DebugRel/ObjectCode/Init.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/test_Data/DebugRel/ObjectCode/Main.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/test/test_Data/DebugRel/ObjectCode/Main.o -------------------------------------------------------------------------------- /reference/VERILOG HDL and FPGA Digital System Design.pdf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:71e3cbe53ec52d12a221a98b15ea87de906ffc82e1ef7adae6f520eac926cf1e 3 | size 85548325 4 | -------------------------------------------------------------------------------- /reference/Verilog HDL Digital Design and Synthesis.pdf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:40df5abb55dc30e11d3a476edfd9dd8b333d2d32dd6e3a53404dc74b313b87f9 3 | size 17740921 4 | -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/ObjectCode/Startup.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/ObjectCode/Startup.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/S3C2440_ARM_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/S3C2440_ARM_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/1.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/1.bin -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/2.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/2.bin -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/test_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/test/test_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/ObjectCode/2440addr.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/ObjectCode/2440addr.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/GPIO_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/ObjectCode/Init.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/ObjectCode/Init.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/ObjectCode/comp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/ObjectCode/comp.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/asmlab2_Data/DebugRel/ObjectCode/Init.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/asmlab2_Data/DebugRel/ObjectCode/Init.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/asmlab2_Data/DebugRel/ObjectCode/Test.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/asmlab2_Data/DebugRel/ObjectCode/Test.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/test_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/test/test_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_driver.h: -------------------------------------------------------------------------------- 1 | #ifndef UART_DRIVER_H 2 | #define UART_DRIVER_H 3 | 4 | void uart_init(void); 5 | void uart_putchar(char); 6 | char uart_getchar(void); 7 | 8 | #endif -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/uart.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/uart.axf -------------------------------------------------------------------------------- /reference/Embedded ARM System Principle and Example Development.pdf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:55ccdc1a298e9bd4e7bda81ee0396b9e6df0ff929474b28e7b862455421598a4 3 | size 120637643 4 | -------------------------------------------------------------------------------- /reference/Embedded System Principles and Application Tutorial.pdf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2991ca584afc8a00e383e5e2bd6bdefb64e9d6dc799d21923c501f40f5cb38dd 3 | size 89649337 4 | -------------------------------------------------------------------------------- /reference/Verilog HDL and CPLDFPGA Project Development Tutorial.pdf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4d977f27034bda975217a18d46d9a9f3bc607b0ab9f2197c3567dee24db87e8d 3 | size 47429465 4 | -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/S3C2440_ARM_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/S3C2440_ARM_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/armasmc/armasmc_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/armasmc/armasmc_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/asmlab1_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/asmlab1_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/asmlab2_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/asmlab2_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/S3C2440_ARM_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/S3C2440_ARM_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/GPIO/S3C2440_ARM_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/GPIO/S3C2440_ARM_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/armasmc/armasmc_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/armasmc/armasmc_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/armasmc/armasmc_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/armasmc/armasmc_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/asmlab1_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab1/asmlab1_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab1/asmlab1_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/asmlab2_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/asmlab2_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmlab2/asmlab2_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmlab2/asmlab2_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/DebugRel/asmmodelab.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/DebugRel/asmmodelab.axf -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/ext_int.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/ext_int.bin -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/DebugRel/ObjectCode/Init.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/DebugRel/ObjectCode/Init.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dft2.m: -------------------------------------------------------------------------------- 1 | %dft2.m 2 | function[a,p]=dft2(x) 3 | N=length(x); 4 | n=0:N-1; 5 | k=n; 6 | w=exp(-j*2*pi/N); 7 | nk=n'*k; 8 | wnk=w.^(nk); 9 | xk=x*wnk; 10 | a=abs(xk); 11 | p=angle(xk); -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/asmmodelab/asmmodelab_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/ext_interrupt.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/ext_interrupt.axf -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/ext_interrupt.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/ext_interrupt.bin -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/ObjectCode/lib.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/ObjectCode/lib.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/ObjectCode/start.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/ObjectCode/start.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/ObjectCode/xmain.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/ObjectCode/xmain.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/CWSettingsWindows.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/CWSettingsWindows.stg -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/uart_test.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/uart_test.axf -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/uart_test.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/uart_test.bin -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/DebugRel/ext_interrupt.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/DebugRel/ext_interrupt.axf -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/DebugRel/ext_interrupt.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/DebugRel/ext_interrupt.bin -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/ObjectCode/head.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/ObjectCode/head.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/ObjectCode/main.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/ObjectCode/main.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/ext_interrupt.axf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/ext_interrupt.axf -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/Debug/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/Debug/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/ObjectCode/lib.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/ObjectCode/lib.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/ObjectCode/start.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/ObjectCode/start.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/ObjectCode/xmain.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/ObjectCode/xmain.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/ext_interrupt/ext_interrupt_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/ObjectCode/uart_driver.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_Data/DebugRel/ObjectCode/uart_driver.o -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/Release/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/Release/TargetDataWindows.tdt -------------------------------------------------------------------------------- /DSP-tutorial/implementation/ex3058.m: -------------------------------------------------------------------------------- 1 | wp=0.2*pi;ws=0.3*pi;Rp=1;As=15; 2 | T=1; 3 | OmegaP=(2/T)*tan(wp/2); 4 | OmegaS=(2/T)*tan(ws/2); 5 | [N,wn]=buttord(OmegaP,OmegaS,Rp,As,'s') 6 | wn=wn/pi; 7 | [b,a]=butter(N,wn); 8 | [C,B,A]=dir2cas(b,a) -------------------------------------------------------------------------------- /DSP-tutorial/implementation/freqz_m.m: -------------------------------------------------------------------------------- 1 | function [db,mag,pha,grd,w]=freqz_m(b,a) 2 | [H,w]=freqz(b,a,1000,'whole'); 3 | H=(H(1:501))';w=(w(1:501))'; 4 | mag=abs(H); 5 | db=20*log10((mag+eps)/max(mag)); 6 | pha=angle(H); 7 | grd=grpdelay(b,a,w); -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/TargetDataWindows.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/TargetDataWindows.tdt -------------------------------------------------------------------------------- /DSP-tutorial/implementation/ex3059.m: -------------------------------------------------------------------------------- 1 | wp=0.2*pi;ws=0.3*pi;Rp=1;As=15; 2 | T=1; 3 | OmegaP=(2/T)*tan(wp/2); 4 | OmegaS=(2/T)*tan(ws/2); 5 | [N,wn]=cheb1ord(OmegaP,OmegaS,Rp,As,'s') 6 | wn=wn/pi; 7 | [b,a]=cheby1(N,Rp,wn); 8 | [C,B,A]=dir2cas(b,a) -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/ObjectCode/uart_driver.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timerring/hardware-tutorial/HEAD/ARM-tutorial/implementation/uart_test/uart_test/uart_test_Data/DebugRel/ObjectCode/uart_driver.o -------------------------------------------------------------------------------- /DSP-tutorial/implementation/cplxcomp.m: -------------------------------------------------------------------------------- 1 | function I=cplxcomp(p1,p2) 2 | I=[]; 3 | for j=1:length(p2) 4 | for i=1:length(p1) 5 | if(abs(p1(i)-p2(j))<0.0001) 6 | I=[I,i]; 7 | end 8 | end 9 | end 10 | I=I'; 11 | -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dft1.m: -------------------------------------------------------------------------------- 1 | %dft1.m 2 | function[Am,pha]=dft1(x) 3 | N=length(x); 4 | w=exp(-j*2*pi/N); 5 | for k=1:N 6 | sum=0; 7 | for n=1:N 8 | sum=sum+x(n)*w^((k-1)*(n-1)); 9 | end 10 | Am(k)=abs(sum); 11 | pha(k)=angle(sum); 12 | end 13 | -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_8_2.m: -------------------------------------------------------------------------------- 1 | N=16; 2 | n=0:N-1;k=n; 3 | x=sin(pi*n/8)+sin(pi*n/4); 4 | y=x*exp(-j*2*pi/N).^(n'*k); 5 | subplot(3,1,1);stem(n,x,'filled');ylabel('x'); 6 | subplot(3,1,2);stem(k,abs(y),'filled');ylabel('mag X(k)'); 7 | subplot(3,1,3);stem(k,angle(y),'filled');ylabel('ang X(k)'); -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_8_1.m: -------------------------------------------------------------------------------- 1 | f=32; 2 | dt=1/f; 3 | N=32; 4 | n=0:N-1;k=n; 5 | n=n*dt; 6 | x=0.15*sin(2*pi*n)+sin(2*pi*2*n)-0.1*sin(2*pi*3*n); 7 | y=x*exp(-j*2*pi/N).^(n'*k); 8 | subplot(3,1,1);stem(n,x,'filled');ylabel('x'); 9 | subplot(3,1,2);stem(k,abs(y),'filled');ylabel('mag X(k)'); 10 | subplot(3,1,3);stem(k,angle(y),'filled');ylabel('ang X(k)'); -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_13_3.m: -------------------------------------------------------------------------------- 1 | f=64; 2 | dt=1/f; 3 | N=[16,32,64]; 4 | for k=1:3 5 | n=0:N(k)-1; 6 | nt=n*dt; 7 | x=cos(8*pi*nt)+cos(16*pi*nt)+cos(20*pi*nt); 8 | y=fft(x); 9 | subplot(3,3,3*k-2),stem(n,x,'.'); 10 | title('x(n)'); 11 | subplot(3,3,3*k-1),stem(n,abs(y),'.'); 12 | title('abs(X(k))'); 13 | subplot(3,3,3*k),stem(n,angle(y),'.'); 14 | title('angle(X(k))'); 15 | end -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/lib.h: -------------------------------------------------------------------------------- 1 | #ifndef LIB_H 2 | #define LIB_H 3 | 4 | #include "uart_driver.h" 5 | 6 | void s3c2440_putchar(char c); 7 | char s3c2440_getchar(void); 8 | void s3c2440_puts(const char *str); 9 | void s3c2440_putint(int num); 10 | void s3c2440_putchar_hex(char c); 11 | void s3c2440_putint_hex(int num); 12 | int s3c2440_printf(const char *format,...); 13 | 14 | #endif -------------------------------------------------------------------------------- /ARM-tutorial/implementation/test/Main.c: -------------------------------------------------------------------------------- 1 | #define DATA (*(volatile unsigned*)0x03ff5008) 2 | 3 | void Delay(unsigned int); 4 | int Main() 5 | { 6 | unsigned long x; 7 | DATA=0X01; 8 | for(;;) 9 | { 10 | x=DATA; 11 | x=(x<<1); 12 | DATA=x; 13 | Delay(10); 14 | if(!(x&0X0F)) 15 | DATA=0X01; 16 | } 17 | return(0); 18 | } 19 | void Delay(unsigned int x) 20 | { 21 | unsigned int i; 22 | for(i=0;i<=x;i++); 23 | } -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_9_1.m: -------------------------------------------------------------------------------- 1 | for N=16:16:32 2 | n=0:15; 3 | x1=cos(5*n*pi/16); 4 | n=0:N-1;k=n; 5 | x=zeros(1,N); 6 | x(find(n<=15))=x1; 7 | y=x*exp(-j*2*pi/N).^(n'*k); 8 | w=linspace(-2*pi,2*pi,500); 9 | y1=x*exp(-j*n'*w); 10 | figure; 11 | subplot(3,1,1);stem(n,x,'.');ylabel('x(n)'); 12 | subplot(3,1,2);plot(w/pi,abs(y1));xlabel('X pi');ylabel('X(w)'); 13 | subplot(3,1,3);stem(k,abs(y),'.');ylabel('mag X(k)'); 14 | end -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dir2latc.m: -------------------------------------------------------------------------------- 1 | function [K]=dir2latc(b) 2 | % FIR direct form to All-Zero Lattic form Conversation 3 | % [K]=dir2latc(b) 4 | % K=Lattic filter coefficients (reflection coefficients) 5 | % b=FIR direct form coefficients(impulse response) 6 | M=length(b);K=zeros(1,M);b1=b(1); 7 | if b1==0 8 | error('b(1) is equal to zero') 9 | end 10 | K(1)=b1;A=b/b1; 11 | for m=M:-1:2 12 | K(m)=A(m);J=fliplr(A); 13 | A=(A-K(m)*J)/(1-K(m)*K(m));A=A(1:m-1); 14 | end -------------------------------------------------------------------------------- /DSP-tutorial/implementation/Hr_Type3.m: -------------------------------------------------------------------------------- 1 | function [Hr,w,c,L] = Hr_Type3(h); 2 | % Computes Amplitude response of Type-3 LP FIR filter 3 | % --------------------------------------------------- 4 | % [Hr,w,c,L] = Hr_Type3(h) 5 | % Hr = Amplitude Response 6 | % w = frequencies between [0 pi] over which Hr is computed 7 | % c = Type-3 LP filter coefficients 8 | % L = Order of Hr 9 | % h = Type-3 LP impulse response 10 | % 11 | M = length(h); 12 | L = (M-1)/2; 13 | c = [2*h(L+1:-1:1)]; 14 | n=[0:1:L]; 15 | w = [0:1:500]'*pi/500; 16 | Hr = sin(w*n)*c'; -------------------------------------------------------------------------------- /DSP-tutorial/implementation/Hr_Type2.m: -------------------------------------------------------------------------------- 1 | function [Hr,w,b,L] = Hr_Type2(h); 2 | % Computes Amplitude response of Type-2 LP FIR filter 3 | % --------------------------------------------------- 4 | % [Hr,w,b,L] = Hr_Type2(h) 5 | % Hr = Amplitude Response 6 | % w = frequencies between [0 pi] over which Hr is computed 7 | % b = Type-2 LP filter coefficients 8 | % L = Order of Hr 9 | % h = Type-2 LP impulse response 10 | % 11 | M = length(h); 12 | L = M/2; 13 | b = 2*[h(L:-1:1)]; 14 | n = [1:1:L]; n = n-0.5; 15 | w = [0:1:500]'*pi/500; 16 | Hr = cos(w*n)*b'; -------------------------------------------------------------------------------- /DSP-tutorial/implementation/ladrfilt.m: -------------------------------------------------------------------------------- 1 | function [y]=ladrfilt(K,C,x) 2 | % lattice/ladder form realization of IIR filters 3 | % [y]=ladrfilt(K,C,x) 4 | % y=output sequence 5 | % K=lattice(reflection) coefficient array 6 | % C=ladder coefficient array 7 | % x=input sequence 8 | Nx=length(x);y=zeros(1,Nx); 9 | N=length(C);f=zeros(N,Nx);g=zeros(N,Nx+1); 10 | f(N,:)=x; 11 | for n=2:1:Nx+1 12 | for m=N:-1:2 13 | f(m-1,n-1)=f(m,n-1)-K(m-1)*g(m-1,n-1); 14 | g(m,n)=K(m-1)*f(m-1,n-1)+g(m-1,n-1); 15 | end 16 | g(1,n)=f(1,n-1); 17 | end 18 | y=C*g(:,2:Nx+1); -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/DEF.h: -------------------------------------------------------------------------------- 1 | #ifndef __DEF_H__ 2 | #define __DEF_H__ 3 | 4 | #define U32 unsigned int 5 | #define BOOL int 6 | #define U16 unsigned short 7 | #define S32 int 8 | #define S16 short int 9 | #define U8 unsigned char 10 | #define S8 char 11 | #define u32 unsigned int 12 | #define u16 unsigned short 13 | #define s32 int 14 | #define s16 short int 15 | #define u8 unsigned char 16 | #define s8 char 17 | #define TRUE 1 18 | #define FALSE 0 19 | #define OK 1 20 | #define FAIL 0 21 | #define NULL 0 22 | 23 | #endif /*__DEF_H__*/ 24 | 25 | -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dir2cas.m: -------------------------------------------------------------------------------- 1 | function[b0,B,A]=dir2cas(b,a) 2 | b0=b(1);b=b/b0; 3 | a0=a(1);a=a/a0; 4 | b0=b0/a0; 5 | M=length(b);N=length(a); 6 | if N>M 7 | b=[b,zeros(1,N-M)]; 8 | elseif M>N 9 | a=[a,zeros(1,M-N)];N=M; 10 | end 11 | K=floor(N/2);B=zeros(K,3);A=zeros(K,3); 12 | if K*2==N 13 | b=[b 0]; 14 | a=[a 0]; 15 | end 16 | broots=cplxpair(roots(b)); 17 | aroots=cplxpair(roots(a)); 18 | for i=1:2:2*K 19 | Brow=broots(i:1:i+1,:); 20 | Brow=real(poly(Brow)); 21 | B(fix((i+1)/2),:)=Brow; 22 | Arow=aroots(i:1:i+1,:); 23 | Arow=real(poly(Arow)); 24 | A(fix((i+1)/2),:)=Arow; 25 | end -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_8_4.m: -------------------------------------------------------------------------------- 1 | for N=5:5:10 2 | n=0:N-1;k=n; 3 | x=[n>=0]; 4 | n1=0:6*N-1;k1=n1; 5 | x1=x(mod(n1,N)+1); 6 | y=x*exp(-j*2*pi/N).^(n'*k); 7 | y1=x1*exp(-j*2*pi/N).^(n1'*k1); 8 | w=linspace(-2*pi,2*pi,500); 9 | y2=x*exp(-j*n'*w); 10 | figure; 11 | subplot(4,2,1);stem(n,x,'.');ylabel('x'); 12 | subplot(4,2,2);stem(n1,x1,'.');ylabel('x~(n)'); 13 | subplot(4,2,3);stem(k,abs(y),'.');ylabel('mag X(k)'); 14 | subplot(4,2,4);stem(k,angle(y),'.');ylabel('ang X(k)'); 15 | subplot(4,2,5);stem(k1,abs(y1),'.');ylabel('mag X~(k)'); 16 | subplot(4,2,6);stem(k1,angle(y1),'.');ylabel('ang X~(k)'); 17 | subplot(4,1,4);plot(w/pi,abs(y2));xlabel('X pi');ylabel('X(w)'); 18 | end -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_20_1.m: -------------------------------------------------------------------------------- 1 | wp=0.3*pi;ws=0.5*pi;tr_width=ws-wp; 2 | M=ceil(6.6*pi/tr_width)+1; 3 | n=[0:1:M-1]; 4 | wc=(ws+wp)/2; 5 | hd=ideal_lp(wc,M); 6 | w_ham=(hamming(M))'; 7 | h=hd.*w_ham; 8 | [db,mag,pha,grd,w]=freqz_m(h,[1]); 9 | subplot(2,2,1);stem(n,hd);axis([0 M-1 -0.2 0.4]); 10 | title('Ideal Impulse Response');xlabel('n');ylabel('hd(n)'); 11 | subplot(2,2,2);stem(n,w_ham);axis([0 M-1 0 1.1]); 12 | title('Hamming Window');xlabel('n');ylabel('w(n)'); 13 | subplot(2,2,3);stem(n,h);axis([0 M-1 -0.2 0.4]); 14 | title('Actual Impulse Response');xlabel('n');ylabel('h(n)'); 15 | subplot(2,2,4);plot(w/pi,db);axis([0 1 -100 10]);grid; 16 | title('Magnitude Response in dB');xlabel('frequency in pi units');ylabel('Decibels'); -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_10.m: -------------------------------------------------------------------------------- 1 | n=0:10; 2 | x=10*0.8.^n; 3 | N=length(n); 4 | k=n; 5 | xr=x(mod(-n,N)+1); 6 | xe=0.5*(x+xr); 7 | xo=0.5*(x-xr); 8 | ye=xe*exp(-j*2*pi/N).^(n'*k); 9 | yo=xo*exp(-j*2*pi/N).^(n'*k); 10 | y=x*exp(-j*2*pi/N).^(n'*k); 11 | errore=max(abs(real(y)-ye)); 12 | erroro=max(abs(j*imag(y)-yo)); 13 | subplot(321),stem(n,x);title('x(n)'); 14 | subplot(322),stem(n,xr);title('x(-n)'); 15 | subplot(323),stem(n,xe);title('xe(n)'); 16 | subplot(324),stem(n,xo);title('xo(n)'); 17 | subplot(325),stem(k,real(y),'xr'); 18 | hold 19 | subplot(325),stem(k,ye,'.k');title('real(y)/Xe(k)'); 20 | subplot(326),stem(k,imag(y),'xr'); 21 | hold 22 | subplot(326),stem(k,abs(yo),'.k');title('imag(y)/Xo(k)'); 23 | figure; 24 | subplot(121),stem(errore); 25 | subplot(122),stem(erroro); -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_20_2.m: -------------------------------------------------------------------------------- 1 | figure;clc;clear all;close all; 2 | ws1=0.2*pi;wp1=0.4*pi;wp2=0.6*pi;ws2=0.8*pi;As=20; 3 | tr_width=min((wp1-ws1),(ws2-wp2)); 4 | M=ceil(7*pi/tr_width)+1; 5 | n=[0:1:M-1]; 6 | wc1=(ws1+wp1)/2; 7 | wc2=(wp2+ws2)/2; 8 | hd=ideal_lp(wc2,M)-ideal_lp(wc1,M); 9 | w_bla=(blackman(M))'; 10 | h=hd.*w_bla; 11 | [db,mag,pha,grd,w]=freqz_m(h,[1]); 12 | subplot(2,2,1);stem(n,hd);axis([0 M-1 -0.4 0.5]); 13 | title('Ideal Impulse Response');xlabel('n');ylabel('hd(n)'); 14 | subplot(2,2,2);stem(n,w_bla);axis([0 M-1 0 1.1]); 15 | title('Blackman Window');xlabel('n');ylabel('w(n)'); 16 | subplot(2,2,3);stem(n,h);axis([0 M-1 -0.4 0.5]); 17 | title('Actual Impulse Response');xlabel('n');ylabel('h(n)'); 18 | subplot(2,2,4);plot(w/pi,db);axis([0 1 -150 10]);grid; 19 | title('Magnitude Response in dB'); 20 | xlabel('frequency in pi units'); 21 | ylabel('Decibels') -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dir2par.m: -------------------------------------------------------------------------------- 1 | function [C,B,A]=dir2par(b,a) 2 | M=length(b);N=length(a); 3 | [r1,p1,C]=residuez(b,a); 4 | p=cplxpair(p1,10000000*eps); 5 | I=cplxcomp(p1,p); 6 | r=r1(I); 7 | K=floor(N/2);B=zeros(K,2);A=zeros(K,3); 8 | if K*2==N %computation when Nb is even 9 | for i=1:2:N-2 10 | Brow=r(i:1:i+1,:); 11 | Arow=p(i:1:i+1,:); 12 | [Brow,Arow]=residuez(Brow,Arow,[]); 13 | B(fix((i+1)/2),:)=real(Brow'); 14 | A(fix((i+1)/2),:)=real(Arow'); 15 | end 16 | [Brow,Arow]=residuez(r(N-1),p(N-1),[]); 17 | B(K,:)=[real(Brow') 0];A(K,:)=[real(Arow') 0]; 18 | else 19 | for i=1:2:N-1 20 | Brow=r(i:1:i+1,:); 21 | Arow=p(i:1:i+1,:); 22 | [Brow,Arow]=residuez(Brow,Arow,[]); 23 | B(fix((i+1)/2),:)=real(Brow'); 24 | A(fix((i+1)/2),:)=real(Arow'); 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /DSP-tutorial/implementation/afd_butt.m: -------------------------------------------------------------------------------- 1 | function [b,a]=afd_butt(Wp,Ws,Rp,As); 2 | %Analog Lowpass Filter Design :Butterworth 3 | %-------------------------------------------- 4 | %[b,a]=afd_butt(Wp,Ws,Rp,As); 5 | %b=Numberator coefficients of Ha(s) 6 | %a=Denominator coefficients of Ha(s) 7 | %Wp=Passband edge frequency in rad/sec;Wp>0 8 | %Ws=Stopband edge frequency in rad/sec;Ws>Wp>0 9 | %Rp=Passband ripple in +dB;(Rp>0) 10 | %As=Stopband attenuation in +dB;(As>0) 11 | if Wp<=0 12 | error('Passband edge must be larger than 0') 13 | end 14 | if Ws<=Wp 15 | error('Stopband edge must be larger than Passband edge') 16 | end 17 | if (Rp<=0)|(As<0) 18 | error('PB ripple and/or SB attenuation must be larger than 0') 19 | end 20 | N=ceil(log10((10^(Rp/10)-1)/(10^(As/10)))/(2*log10(Wp/Ws))); 21 | fprintf('\n***Butterworth Filter Order=%2.0f\n',N) 22 | OmegaC=Wp/((10^(Rp/10)-1)^(1/(2*N))); 23 | [b,a]=u_buttap(N,OmegaC); 24 | -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_21_1.m: -------------------------------------------------------------------------------- 1 | M=20;alpha=(M-1)/2;l=0:M-1;wl=(2*pi/M)*l; 2 | Hrs=[1,1,1,zeros(1,15),1,1]; 3 | Hdr=[1,1,0,0];wdl=[0,0.25,0.25,1]; 4 | k1=0:floor((M-1)/2);k2=floor((M-1)/2)+1:M-1; 5 | angH=[-alpha*(2*pi)/M*k1,alpha*(2*pi)/M*(M-k2)]; 6 | H=Hrs.*exp(j*angH);h=real(ifft(H,M)); 7 | [db,mag,pha,grd,w]=freqz_m(h,1); 8 | [Hr,ww,a,L]=Hr_Type2(h); 9 | subplot(221);plot(wl(1:11)/pi,Hrs(1:11),'o',wdl,Hdr); 10 | axis([0,1,-0.1,1.1]);title('Frequency Samples:M=20') 11 | xlabel('frequency in pi units');ylabel('Hr(k)') 12 | subplot(222);stem(l,h);axis([-1,M,-0.1,0.3]) 13 | title('impulse response');xlabel('n');ylabel('h(n)'); 14 | subplot(223);plot(ww/pi,Hr,wl(1:11)/pi,Hrs(1:11),'o'); 15 | axis([0,1,-0.2,1.2]);title('amplitude response') 16 | xlabel('frequency in pi units');ylabel('Hr(w)') 17 | subplot(224);plot(w/pi,db);axis([0,1,-60,10]);grid 18 | title('magnitude response');xlabel('frequency in pi units');ylabel('Decibels'); -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_21_2.m: -------------------------------------------------------------------------------- 1 | M=60;alpha=(M-1)/2;l=0:M-1;wl=(2*pi/M)*l; 2 | Hrs=[1,1,1,1,1,1,1,zeros(1,47),1,1,1,1,1,1]; 3 | Hdr=[1,1,0,0];wdl=[0,0.25,0.25,1]; 4 | k1=0:floor((M-1)/2);k2=floor((M-1)/2)+1:M-1; 5 | angH=[-alpha*(2*pi)/M*k1,alpha*(2*pi)/M*(M-k2)]; 6 | H=Hrs.*exp(j*angH);h=real(ifft(H,M)); 7 | [db,mag,pha,grd,w]=freqz_m(h,1); 8 | [Hr,ww,a,L]=Hr_Type2(h); 9 | subplot(221);plot(wl(1:31)/pi,Hrs(1:31),'o',wdl,Hdr); 10 | axis([0,1,-0.1,1.1]);title('Frequency Samples:M=20') 11 | xlabel('frequency in pi units');ylabel('Hr(k)') 12 | subplot(222);stem(l,h);axis([-1,M,-0.1,0.3]) 13 | title('impulse response');xlabel('n');ylabel('h(n)'); 14 | subplot(223);plot(ww/pi,Hr,wl(1:31)/pi,Hrs(1:31),'o'); 15 | axis([0,1,-0.2,1.2]);title('amplitude response') 16 | xlabel('frequency in pi units');ylabel('Hr(w)') 17 | subplot(224);plot(w/pi,db);axis([0,1,-60,10]);grid 18 | title('magnitude response');xlabel('frequency in pi units');ylabel('Decibels'); -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/xmain.c: -------------------------------------------------------------------------------- 1 | #include "lib.h" 2 | 3 | 4 | int __entry(void) 5 | { 6 | //char i; 7 | //char c; 8 | uart_init(); 9 | 10 | //s3c2440_printf("name: %s\tage: %d\tgender: %c\n","Lihua",48,'m'); 11 | 12 | //s3c2440_printf("hex test: 0x%x\n",0x12345); 13 | 14 | //#if 0 15 | //s3c2440_puts("Hello world!\n"); 16 | s3c2440_puts("Test begin,please input your char:\n"); 17 | //s3c2440_puts("Test Begin:\n"); 18 | 19 | //s3c2440_puts("abcdefg\n"); 20 | //s3c2440_putint(12345); 21 | //s3c2440_putchar('\n'); 22 | //s3c2440_putint(543210); 23 | //s3c2440_putchar('\n'); 24 | //s3c2440_putint(0); 25 | //s3c2440_putchar('\n'); 26 | //s3c2440_putchar_hex('A'); 27 | //s3c2440_putchar_hex(100); 28 | //s3c2440_putint_hex(0x12345); 29 | //#endif 30 | 31 | //#if 0 32 | while(1) 33 | s3c2440_putchar(s3c2440_getchar()); 34 | //#endif 35 | 36 | //#if 0 37 | //for(i='a';i<='z';i++) 38 | // uart_putchar(i); 39 | //#endif 40 | 41 | return 0; 42 | } -------------------------------------------------------------------------------- /DSP-tutorial/implementation/exchebyshev1.m: -------------------------------------------------------------------------------- 1 | Wp=0.2*pi;Ws=0.3*pi;Rp=1;As=16; 2 | Ripple=10^(-Rp/20);Attn=10^(-As/20); 3 | [b,a]=afd_chb1(Wp,Ws,Rp,As); 4 | [C,B,A]=sdir2cas(b,a) 5 | [db,mag,pha,w]=freqs_m(b,a,0.5*pi); 6 | [ha,x,t]=impulse(b,a); 7 | 8 | % plots 9 | figure(1) 10 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 11 | xlabel('Analog frequency in pi units');ylabel('|H|'); 12 | axis([0,0.5,0,1.1]) 13 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,0.5]); 14 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 15 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 16 | xlabel('Analog frequency in pi units');ylabel('decibels'); 17 | axis([0,0.5,-30,5]) 18 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,0.5]); 19 | set(gca,'YTickMode','manual','YTick',[-30,-As,-Rp,0]);grid 20 | %set(gca,'YTickLabelMode','manual','YTickLabels',['30';'16';'1';'0']) 21 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 22 | xlabel('Analog frequency in pi units');ylabel('radians'); 23 | axis([0,0.5,-1,1]) 24 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,0.5]); 25 | set(gca,'YTickMode','manual','YTick',[-1,-0.5,0,0.5,1]);grid 26 | subplot(2,2,4);plot(t,ha,[0,max(t)],[0,0]);title('Impulse Response') 27 | xlabel('time in seconds');ylabel('ha(t)'); 28 | axis([0,max(t),min(ha),max(ha)]) -------------------------------------------------------------------------------- /DSP-tutorial/implementation/exelliptic.m: -------------------------------------------------------------------------------- 1 | Wp=0.2*pi;Ws=0.3*pi;Rp=1;As=16; 2 | Ripple=10^(-Rp/20);Attn=10^(-As/20); 3 | [b,a]=afd_elip(Wp,Ws,Rp,As); 4 | [C,B,A]=sdir2cas(b,a) 5 | [db,mag,pha,w]=freqs_m(b,a,0.5*pi); 6 | [ha,x,t]=impulse(b,a); 7 | 8 | % plots 9 | figure(1) 10 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 11 | xlabel('Analog frequency in pi units');ylabel('|H|'); 12 | axis([0,0.5,0,1.1]) 13 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,0.5]); 14 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 15 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 16 | xlabel('Analog frequency in pi units');ylabel('decibels'); 17 | axis([0,0.5,-30,1]) 18 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,0.5]); 19 | set(gca,'YTickMode','manual','YTick',[-30,-As,-Rp,0]);grid 20 | %set(gca,'YTickLabelMode','manual','YTickLabels',['30';'16';'1';'0']) 21 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 22 | xlabel('Analog frequency in pi units');ylabel('radians'); 23 | axis([0,0.5,-1,1]) 24 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,0.5]); 25 | set(gca,'YTickMode','manual','YTick',[-1,-0.5,0,0.5,1]);grid 26 | subplot(2,2,4);plot(t,ha,[0,max(t)],[0,0]);title('Impulse Response') 27 | xlabel('time in seconds');ylabel('ha(t)'); 28 | axis([0,max(t),min(ha),max(ha)]) -------------------------------------------------------------------------------- /DSP-tutorial/implementation/exbutterworth.m: -------------------------------------------------------------------------------- 1 | % Butterworth Lowpass Analog filter design 2 | 3 | Wp=0.2*pi;Ws=0.3*pi;Rp=7;As=16; 4 | Ripple=10^(-Rp/20);Attn=10^(-As/20); 5 | [b,a]=afd_butt(Wp,Ws,Rp,As); 6 | [C,B,A]=sdir2cas(b,a) 7 | [db,mag,pha,w]=freqs_m(b,a,0.5*pi); 8 | [ha,x,t]=impulse(b,a); 9 | 10 | % plots 11 | figure(1) 12 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 13 | xlabel('Analog frequency in pi units');ylabel('|H|'); 14 | axis([0,0.5,0,1.1]) 15 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,0.5]); 16 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 17 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 18 | xlabel('Analog frequency in pi units');ylabel('decibels'); 19 | axis([0,0.5,-30,5]) 20 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,0.5]); 21 | set(gca,'YTickMode','manual','YTick',[-30,-As,-Rp,0]);grid 22 | %set(gca,'YTickLabelMode','manual','YTickLabels',['30';'16';'7';'0']);grid 23 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 24 | xlabel('Analog frequency in pi units');ylabel('radians'); 25 | axis([0,0.5,-1,1]) 26 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,0.5]); 27 | set(gca,'YTickMode','manual','YTick',[-1,-0.5,0,0.5,1]);grid 28 | subplot(2,2,4);plot(t,ha,[0,max(t)],[0,0]);title('Impulse Response') 29 | xlabel('time in seconds');ylabel('ha(t)'); 30 | axis([0,max(t),min(ha),max(ha)]) -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_24.m: -------------------------------------------------------------------------------- 1 | wp=0.2*pi;ws=0.3*pi;Rp=1;As=15; 2 | T=1; 3 | OmegaP=wp*T; 4 | OmegaS=ws*T; 5 | ep=sqrt(10^(Rp/10)-1); 6 | Ripple=sqrt(1/(1+ep*ep)); 7 | Attn=1/(10^(As/20)); 8 | [cs,ds]=afd_butt(OmegaP,OmegaS,Rp,As); 9 | [b,a]=imp_invr(cs,ds,T); 10 | [C,B,A] = dir2par(b,a) 11 | % plots 12 | figure(1); 13 | [db,mag,pha,grd,w]=freqz_m(b,a); 14 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 15 | xlabel('frequency in pi units');ylabel('|H|'); 16 | axis([0,1,0,1.1]) 17 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 18 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 19 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 20 | xlabel('frequency in pi units');ylabel('decibels'); 21 | axis([0,1,-40,5]) 22 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 23 | set(gca,'YTickMode','manual','YTick',[-50,-15,-1,0]);grid 24 | %set(gca,'YTickLabelMode','manual','YTickLabels',['50';'15';'1';'0']) 25 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 26 | xlabel('frequency in pi units');ylabel('pi units'); 27 | axis([0,1,-1,1]) 28 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 29 | set(gca,'YTickMode','manual','YTick',[-1,0,1]);grid 30 | subplot(2,2,4);plot(w/pi,grd);title('Group Delay') 31 | xlabel('frequency in pi units');ylabel('Sample'); 32 | axis([0,1,0,10]) 33 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 34 | set(gca,'YTickMode','manual','YTick',[0:2:10]);grid -------------------------------------------------------------------------------- /DSP-tutorial/implementation/exchebylowpass.m: -------------------------------------------------------------------------------- 1 | wp=0.2*pi;ws=0.3*pi;Rp=1;As=15; 2 | T=1; 3 | OmegaP=wp*T; 4 | OmegaS=ws*T; 5 | ep=sqrt(10^(Rp/10)-1); 6 | Ripple=sqrt(1/(1+ep*ep)); 7 | Attn=1/(10^(As/20)); 8 | [cs,ds]=afd_chb1(OmegaP,OmegaS,Rp,As); 9 | [b,a]=imp_invr(cs,ds,T); 10 | [C,B,A]=dir2par(b,a) 11 | 12 | % plots 13 | figure(1); 14 | [db,mag,pha,grd,w]=freqz_m(b,a); 15 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 16 | xlabel('frequency in pi units');ylabel('|H|'); 17 | axis([0,1,0,1.1]) 18 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 19 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 20 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 21 | xlabel('frequency in pi units');ylabel('decibels'); 22 | axis([0,1,-40,5]) 23 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 24 | set(gca,'YTickMode','manual','YTick',[-50,-15,-1,0]);grid 25 | %set(gca,'YTickLabelMode','manual','YTickLabels',['50';'15';'1';'0']) 26 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 27 | xlabel('frequency in pi units');ylabel('pi units'); 28 | axis([0,1,-1,1]) 29 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 30 | set(gca,'YTickMode','manual','YTick',[-1,0,1]);grid 31 | subplot(2,2,4);plot(w/pi,grd);title('Group Delay') 32 | xlabel('frequency in pi units');ylabel('Samples'); 33 | axis([0,1,0,15]) 34 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 35 | set(gca,'YTickMode','manual','YTick',[0:5:15]);grid -------------------------------------------------------------------------------- /DSP-tutorial/implementation/exellipticlowpass.m: -------------------------------------------------------------------------------- 1 | wp=0.2*pi;ws=0.3*pi;Rp=1;As=15; 2 | T=1; 3 | OmegaP=wp*T; 4 | OmegaS=ws*T; 5 | ep=sqrt(10^(Rp/10)-1); 6 | Ripple=sqrt(1/(1+ep*ep)); 7 | Attn=1/(10^(As/20)); 8 | [cs,ds]=afd_elip(OmegaP,OmegaS,Rp,As); 9 | [b,a]=imp_invr(cs,ds,T); 10 | [C,B,A]=dir2par(b,a) 11 | 12 | % plots 13 | figure(1); 14 | [db,mag,pha,grd,w]=freqz_m(b,a); 15 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 16 | xlabel('frequency in pi units');ylabel('|H|'); 17 | axis([0,1,0,1.1]) 18 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 19 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 20 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 21 | xlabel('frequency in pi units');ylabel('decibels'); 22 | axis([0,1,-40,5]) 23 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 24 | set(gca,'YTickMode','manual','YTick',[-50,-15,-1,0]);grid 25 | set(gca,'YTickLabelMode','manual','YTickLabels',['50';'15';'1';'0']) 26 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 27 | xlabel('frequency in pi units');ylabel('pi units'); 28 | axis([0,1,-1,1]) 29 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 30 | set(gca,'YTickMode','manual','YTick',[-1,0,1]);grid 31 | subplot(2,2,4);plot(w/pi,grd);title('Group Delay') 32 | xlabel('frequency in pi units');ylabel('Samples'); 33 | axis([0,1,0,15]) 34 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 35 | set(gca,'YTickMode','manual','YTick',[0:5:15]);grid -------------------------------------------------------------------------------- /DSP-tutorial/implementation/exbutterlowpass.m: -------------------------------------------------------------------------------- 1 | wp=0.2*pi;ws=0.3*pi;Rp=1;As=15; 2 | T=1; 3 | OmegaP=wp*T; 4 | OmegaS=ws*T; 5 | ep=sqrt(10^(Rp/10)-1); 6 | Ripple=sqrt(1/(1+ep*ep)); 7 | Attn=1/(10^(As/20)); 8 | [cs,ds]=afd_butt(OmegaP,OmegaS,Rp,As); 9 | [b,a]=imp_invr(cs,ds,T); 10 | [C,B,A]=dir2par(b,a) 11 | 12 | % plots 13 | figure(1); 14 | [db,mag,pha,grd,w]=freqz_m(b,a); 15 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 16 | xlabel('frequency in pi units');ylabel('|H|'); 17 | axis([0,1,0,1.1]) 18 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 19 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 20 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 21 | xlabel('frequency in pi units');ylabel('decibels'); 22 | axis([0,1,-40,5]) 23 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 24 | set(gca,'YTickMode','manual','YTick',[-50,-15,-1,0]);grid 25 | %set(gca,'YTickLabelMode','manual','YTickLabels',['50';'15';'1';'0']) 26 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 27 | xlabel('frequency in pi units');ylabel('pi units'); 28 | axis([0,1,-1,1]) 29 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 30 | set(gca,'YTickMode','manual','YTick',[-1,0,1]);grid 31 | subplot(2,2,4);plot(w/pi,grd);title('Group Delay') 32 | xlabel('frequency in pi units');ylabel('Sample'); 33 | axis([0,1,0,10]) 34 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 35 | set(gca,'YTickMode','manual','YTick',[0:2:10]);grid 36 | -------------------------------------------------------------------------------- /DSP-tutorial/implementation/exbilibuterlowpass.m: -------------------------------------------------------------------------------- 1 | wp=0.2*pi;ws=0.3*pi;Rp=1;As=15; 2 | T=1;Fs=1/T; 3 | OmegaP=(2/T)*tan(wp/2); 4 | OmegaS=(2/T)*tan(ws/2); 5 | ep=sqrt(10^(Rp/10)-1); 6 | Ripple=sqrt(1/(1+ep*ep)); 7 | Attn=1/(10^(As/20)); 8 | [cs,ds]=afd_butt(OmegaP,OmegaS,Rp,As); 9 | [b,a]=bilinear(cs,ds,T); 10 | [C,B,A]=dir2cas(b,a) 11 | 12 | % plots 13 | figure(1); 14 | [db,mag,pha,grd,w]=freqz_m(b,a); 15 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 16 | xlabel('frequency in pi units');ylabel('|H|'); 17 | axis([0,1,0,1.1]) 18 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 19 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 20 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 21 | xlabel('frequency in pi units');ylabel('decibels'); 22 | axis([0,1,-40,5]) 23 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 24 | set(gca,'YTickMode','manual','YTick',[-50,-15,-1,0]);grid 25 | %set(gca,'YTickLabelMode','manual','YTickLabels',['50';'15';'1';'0']) 26 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 27 | xlabel('frequency in pi units');ylabel('pi units'); 28 | axis([0,1,-1,1]) 29 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 30 | set(gca,'YTickMode','manual','YTick',[-1,0,1]);grid 31 | subplot(2,2,4);plot(w/pi,grd);title('Group Delay') 32 | xlabel('frequency in pi units');ylabel('Samples'); 33 | axis([0,1,0,10]) 34 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 35 | set(gca,'YTickMode','manual','YTick',[0:2:10]);grid -------------------------------------------------------------------------------- /DSP-tutorial/implementation/exbillicheb2lowpass.m: -------------------------------------------------------------------------------- 1 | wp=0.2*pi;ws=0.3*pi;Rp=1;As=15; 2 | T=1;Fs=1/T; 3 | OmegaP=(2/T)*tan(wp/2); 4 | OmegaS=(2/T)*tan(ws/2); 5 | ep=sqrt(10^(Rp/10)-1); 6 | Ripple=sqrt(1/(1+ep*ep)); 7 | Attn=1/(10^(As/20)); 8 | [cs,ds]=afd_chb2(OmegaP,OmegaS,Rp,As); 9 | [b,a]=bilinear(cs,ds,T); 10 | [C,B,A]=dir2cas(b,a); 11 | 12 | % plots 13 | figure(1); 14 | [db,mag,pha,grd,w]=freqz_m(b,a); 15 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 16 | xlabel('frequency in pi units');ylabel('|H|'); 17 | axis([0,1,0,1.1]) 18 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 19 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 20 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 21 | xlabel('frequency in pi units');ylabel('decibels'); 22 | axis([0,1,-40,5]) 23 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 24 | set(gca,'YTickMode','manual','YTick',[-50,-15,-1,0]);grid 25 | %set(gca,'YTickLabelMode','manual','YTickLabels',['50';'15';'1';'0']) 26 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 27 | xlabel('frequency in pi units');ylabel('pi units'); 28 | axis([0,1,-1,1]) 29 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 30 | set(gca,'YTickMode','manual','YTick',[-1,0,1]);grid 31 | subplot(2,2,4);plot(w/pi,grd);title('Group Delay') 32 | xlabel('frequency in pi units');ylabel('Samples'); 33 | axis([0,1,0,15]) 34 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 35 | set(gca,'YTickMode','manual','YTick',[0:5:15]);grid -------------------------------------------------------------------------------- /DSP-tutorial/implementation/exbilliellipticlowpass.m: -------------------------------------------------------------------------------- 1 | wp=0.2*pi;ws=0.3*pi;Rp=1;As=15; 2 | T=1;Fs=1/T; 3 | OmegaP=(2/T)*tan(wp/2); 4 | OmegaS=(2/T)*tan(ws/2); 5 | ep=sqrt(10^(Rp/10)-1); 6 | Ripple=sqrt(1/(1+ep*ep)); 7 | Attn=1/(10^(As/20)); 8 | [cs,ds]=afd_elip(OmegaP,OmegaS,Rp,As); 9 | [b,a]=bilinear(cs,ds,T); 10 | [C,B,A]=dir2cas(b,a) 11 | 12 | % plots 13 | figure(1); 14 | [db,mag,pha,grd,w]=freqz_m(b,a); 15 | subplot(2,2,1);plot(w/pi,mag);title('Magnitude Response') 16 | xlabel('frequency in pi units');ylabel('|H|'); 17 | axis([0,1,0,1.1]) 18 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 19 | set(gca,'YTickMode','manual','YTick',[0,Attn,Ripple,1]);grid 20 | subplot(2,2,2);plot(w/pi,db);title('Magnitude in dB') 21 | xlabel('frequency in pi units');ylabel('decibels'); 22 | axis([0,1,-40,5]) 23 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 24 | set(gca,'YTickMode','manual','YTick',[-50,-15,-1,0]);grid 25 | %set(gca,'YTickLabelMode','manual','YTickLabels',['50';'15';'1';'0']) 26 | subplot(2,2,3);plot(w/pi,pha/pi);title('Phase Response') 27 | xlabel('frequency in pi units');ylabel('pi units'); 28 | axis([0,1,-1,1]) 29 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 30 | set(gca,'YTickMode','manual','YTick',[-1,0,1]);grid 31 | subplot(2,2,4);plot(w/pi,grd);title('Group Delay') 32 | xlabel('frequency in pi units');ylabel('Samples'); 33 | axis([0,1,0,15]) 34 | set(gca,'XTickMode','manual','XTick',[0,0.2,0.3,1]); 35 | set(gca,'YTickMode','manual','YTick',[0:5:15]);grid -------------------------------------------------------------------------------- /ARM-tutorial/A11 - Exception management for ARM.md: -------------------------------------------------------------------------------- 1 | - [ARM的异常管理](#arm的异常管理) 2 | - [ARM的异常中断响应过程](#arm的异常中断响应过程) 3 | - [从异常中断处理程序中返回](#从异常中断处理程序中返回) 4 | - [异常中断向量表](#异常中断向量表) 5 | - [异常中断的优先级](#异常中断的优先级) 6 | 7 | 8 | # ARM的异常管理 9 | 10 | 在ARM体系结构中,异常中断用来处理软件中断、未定义指令陷阱及系统复位功能和外部事件,这些“不正常”事件都被划归“异常”,因为在处理器的控制机制中,它们都使用同样的流程进行异常处理。 11 | 12 | ## ARM的异常中断响应过程 13 | 14 | ARM处理器对异常中断的响应过程如下 15 | 16 | 将CPSR的内容保存到将要执行的异常中断对应的SPSR中 设置当前状态寄存器CPSR中的相应位 17 | 18 | 将引起异常指令的下一条指令的地址保存到新的异常工作模式的R14 19 | 给程序计数器(PC)强制赋值 20 | 21 | 每个异常模式对应有两个寄存器R13\_、R14\_分别保存相应模式下的堆栈指针、返回地址;堆栈指针可用来定义一个存储区域保存其它用户寄存器,这样异常处理程序就可以使用这些寄存器。 22 | FIQ模式还有额外的专用寄存器R8_fiq~R12_fiq,使用这些寄存器可以加快快速中断的处理速度。 23 | 24 | ## 从异常中断处理程序中返回 25 | 26 | 从异常中断处理程序中返回时,需要执行以下四个基本操作。 27 | 28 | 所有修改过的用户寄存器必须从处理程序的保护堆栈中恢复(即出栈)。 29 | 30 | 将SPSR_mode寄存器内容复制到CPSR中,使得CPSR从相应的SPSR中恢复,即恢复被中断的程序工作状态; 31 | 32 | 根据异常类型将PC变回到用户指令流中相应指令处 33 | 最后清除CPSR中的中断禁止标志位I/F。 34 | 35 | ## 异常中断向量表 36 | 37 | 中断向量表中指定了各异常中断与其处理程序的对应关系。 38 | 39 | 每个异常中断对应的中断向量表的4个字节的空间中存放一个跳转指令或者一个向PC寄存器中赋值的数据访问指令。 40 | 41 | 存储器的前8个字中除了地址0x00000014之外,全部被用作异常矢量地址。 42 | 43 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221211200616352.png) 44 | 45 | ## 异常中断的优先级 46 | 47 | 当几个异常中断同时发生时,在ARM中通过给各异常中断赋予一定的优先级来实现处理次序。 48 | 49 | + 复位(最高优先级); 50 | + 数据异常中止; 51 | 52 | + FIQ; 53 | + IRQ; 54 | + 预取指异常中止; 55 | + SWI,未定义指令(包括缺协处理器)。 56 | 57 | 58 | 59 | 参考文献: 60 | 61 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 62 | 63 | 64 | 65 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/uart_driver.c: -------------------------------------------------------------------------------- 1 | #define rGPHCON (volatile unsigned int *)0x56000070 2 | 3 | #define rULCON0 (volatile unsigned int *)0x50000000 //Uart Line Control Register 4 | #define rUCON0 (volatile unsigned int *)0x50000004 //Uart Control Register 5 | #define rUFCON0 (volatile unsigned int *)0x50000008 //FIFO Control Register 6 | #define rUMCON0 (volatile unsigned int *)0x5000000C //AFC COntronl Register 7 | #define rUTRSTAT0 (volatile unsigned int *)0x50000010 //State Register 8 | #define rUERSTAT0 (volatile unsigned int *)0x50000014 //ERROR Detect Register 9 | #define rUFSTAT0 (volatile unsigned int *)0x50000018 //FIFO State Register 10 | #define rUMSTAT0 (volatile unsigned int *)0x5000001C //AFC State Register 11 | #define rUTXH0 (volatile unsigned char *)0x50000020 //Transmiter Buffer Register 12 | #define rURXH0 (volatile unsigned char *)0x50000024 //Receiver Buffer Register 13 | #define rUBRDIV0 (volatile unsigned int *)0x50000028 //BaudRate Generate Register 14 | 15 | #define rCLKCON (volatile unsigned int *)0x4C00000C 16 | 17 | void uart_init(void) 18 | { 19 | *rGPHCON &= ~(0xF<<4); //function selection 20 | *rGPHCON |= 0xA<<4; 21 | 22 | *rULCON0 = 3; //8N1 23 | *rUCON0 = 5; //polling mode,interrupt disable,PCLK 24 | *rUFCON0 = 0; //fifo disable 25 | *rUMCON0 = 0; //AFC disable 26 | *rUBRDIV0 = 26; //PCLK,115200 27 | 28 | *rCLKCON |= 1<<10; //clock enable 29 | } 30 | 31 | void uart_putchar(char c) 32 | { 33 | while(!(*rUTRSTAT0>>1 & 0x1)) 34 | ; 35 | *rUTXH0 = c; 36 | } 37 | 38 | char uart_getchar(void) 39 | { 40 | while(!(*rUTRSTAT0 & 0x1)) 41 | ; 42 | return *rURXH0; 43 | } -------------------------------------------------------------------------------- /DSP-tutorial/implementation/dsp_27.m: -------------------------------------------------------------------------------- 1 | wp=0.2; 2 | ws=0.3; 3 | rp=1; 4 | as=15; 5 | [n1,wc1]=buttord(wp,ws,rp,as); 6 | [b1,a1]=butter(n1,wc1); 7 | [h1,w1]=freqz(b1,a1); 8 | db1=20*log10(abs(h1)/max(abs(h1))); 9 | subplot(311),plot(w1/pi,abs(h1)); 10 | xlabel('pi');ylabel('H'); 11 | axis([0,1,0,1.1]); 12 | subplot(312),plot(w1/pi,angle(h1)); 13 | xlabel('pi'); 14 | subplot(313),plot(w1/pi,db1); 15 | xlabel('pi');ylabel('db'); 16 | wp=0.6; 17 | ws=0.4; 18 | rp=1; 19 | as=15; 20 | [n1,wc1]=buttord(wp,ws,rp,as); 21 | [b1,a1]=butter(n1,wc1,'high'); 22 | figure; 23 | [h1,w1]=freqz(b1,a1); 24 | db1=20*log10(abs(h1)/max(abs(h1))); 25 | subplot(311),plot(w1/pi,abs(h1)); 26 | xlabel('pi');ylabel('H');axis([0,1,0,1.1]); 27 | subplot(312),plot(w1/pi,angle(h1)); 28 | xlabel('pi'); 29 | subplot(313),plot(w1/pi,db1); 30 | xlabel('pi');ylabel('db'); 31 | wp=[0.3,0.4]; 32 | ws=[0.2,0.5]; 33 | rp=3; 34 | as=18; 35 | ts=1; 36 | [n1,wc1]=buttord(wp,ws,rp,as); 37 | [b1,a1]=butter(n1,wc1); 38 | figure; 39 | [h1,w1]=freqz(b1,a1); 40 | db1=20*log10(abs(h1)/max(abs(h1))); 41 | subplot(311),plot(w1/pi,abs(h1)); 42 | xlabel('pi');ylabel('H');axis([0,1,0,1.1]); 43 | subplot(312),plot(w1/pi,angle(h1)); 44 | xlabel('pi'); 45 | subplot(313),plot(w1/pi,db1); 46 | xlabel('pi');ylabel('db'); 47 | wp=[0.2,0.8]; 48 | ws=[0.4,0.7]; 49 | rp=1; 50 | as=30; 51 | ts=1; 52 | [n1,wc1]=buttord(wp,ws,rp,as); 53 | [b1,a1]=butter(n1,wc1,'stop'); 54 | figure; 55 | [h1,w1]=freqz(b1,a1); 56 | db1=20*log10(abs(h1)/max(abs(h1))); 57 | subplot(311),plot(w1/pi,abs(h1)); 58 | xlabel('pi');ylabel('H');axis([0,1,0,1.1]); 59 | subplot(312),plot(w1/pi,angle(h1)); 60 | xlabel('pi'); 61 | subplot(313),plot(w1/pi,db1); 62 | xlabel('pi');ylabel('db'); -------------------------------------------------------------------------------- /DSP-tutorial/implementation/ex3060.m: -------------------------------------------------------------------------------- 1 | wplp=0.2*pi;wslp=0.3*pi;Rp=1;As=15; 2 | T=1;Fs=1/T; 3 | OmegaP=(2/T)*tan(wplp/2); 4 | OmegaS=(2/T)*tan(wslp/2); 5 | ep=sqrt(10^(Rp/10)-1); 6 | Ripple=sqrt(1/(1+ep*ep)); 7 | Attn=1/(10^(As/20)); 8 | [cs,ds]=afd_chb1(OmegaP,OmegaS,Rp,As); 9 | [blp,alp]=bilinear(cs,ds,T); 10 | wphp=0.6*pi; 11 | alpha=-(cos((wplp+wphp)/2))/(cos((wplp-wphp)/2)) 12 | Nz=-[alpha,1];Dz=[1,alpha]; 13 | [bhp,ahp]=zmapping(blp,alp,Nz,Dz); 14 | [C,B,A]=dir2cas(bhp,ahp) 15 | 16 | % 17 | %plot 18 | figure(1); 19 | [dbl,magl,phal,grdl,w]=freqz_m(blp,alp); 20 | subplot(2,2,1);plot(w/pi,magl);title('Lowpass Filter Magnitude Response') 21 | xlabel('frequency in pi units');ylabel('|H|'); 22 | axis([0,1,0,1]) 23 | set(gca,'XTickMode','manual','XTick',[0,0.2,1]); 24 | set(gca,'YTickMode','manual','YTick',[0,Ripple,1]);grid 25 | subplot(2,2,2);plot(w/pi,dbl);title('Lowpass Filter Magnitude in dB') 26 | xlabel('frequency in pi units');ylabel('decibels'); 27 | axis([0,1,-30,0]) 28 | set(gca,'XTickMode','manual','XTick',[0,0.2,1]); 29 | set(gca,'YTickMode','manual','YTick',[-30,-Rp,0]);grid 30 | %set(gca,'YTickLabelMode','manual','YTickLabels',['30';'1';'0']); 31 | [dbh,magh,phah,grdh,w]=freqz_m(bhp,ahp); 32 | subplot(2,2,3);plot(w/pi,magh);title('Highpass Filter Magnitude Response') 33 | xlabel('frequency in pi units');ylabel('|H|'); 34 | axis([0,1,0,1]) 35 | set(gca,'XTickMode','manual','XTick',[0,0.6,1]); 36 | set(gca,'YTickMode','manual','YTick',[0,Ripple,1]);grid 37 | subplot(2,2,4);plot(w/pi,dbh);title('Highpass Filter Magnitude in dB') 38 | xlabel('frequency in pi units');ylabel('decibels'); 39 | axis([0,1,-30,0]) 40 | set(gca,'XTickMode','manual','XTick',[0,0.6,1]); 41 | set(gca,'YTickMode','manual','YTick',[-30,-Rp,0]);grid -------------------------------------------------------------------------------- /DSP-tutorial/implementation/sdir2cas.m: -------------------------------------------------------------------------------- 1 | function [C,B,A]=sdir2cas(b,a) 2 | %DIRECT-form to CASCADE-form conversion in s-plane 3 | %----------------------------------------------------- 4 | %[C,B,A]=sdir2cas(b,a) 5 | %C=gain coefficient 6 | %B=K by 3 matrix of real coefficients containing bk's 7 | %A=K by 3 matrix of real coefficients containing ak's 8 | %b=numberator polynomial coefficients of DIRECT-form 9 | %a=denominator polynomial coefficients of DIRECT-form 10 | % 11 | Na=length(a)-1;Nb=length(b)-1; 12 | 13 | %compute gain coefficient C 14 | b0=b(1);b=b/b0; 15 | a0=a(1);a=a/a0; 16 | C=b0/a0; 17 | % 18 | %denominator second-order sections: 19 | p=cplxpair(roots(a));K=floor(Na/2); 20 | if K*2==Na %computation when Na is even 21 | A=zeros(K,3) 22 | for n=1:2:Na 23 | Arow=p(n:1:n+1,:); 24 | Arow=poly(Arow); 25 | A(fix(n+1)/2,:)=real(Arow); 26 | end 27 | 28 | elseif Na==1 %computation when Na=1 29 | A=[0 real(poly(p))]; 30 | else %computation when Na is odd and >1 31 | A=zeros(K+1,3); 32 | for n=1:2:2*K 33 | Arow=p(n:1:n+1,:); 34 | Arow=poly(Arow); 35 | A(fix(n+1)/2,:)=real(Arow); 36 | end 37 | A(K+1,:)=[0 real(poly(p(Na)))]; 38 | end 39 | 40 | %Numberator second-order sections: 41 | z=cplxpair(roots(b));K=floor(Nb/2); 42 | if Nb==0 43 | B=[0 0 poly(z)]; 44 | elseif K*2==Nb %computation when Nb is even 45 | B=zeros(K,3) 46 | for n=1:2:Nb 47 | Brow=z(n:1:n+1,:); 48 | Brow=poly(Brow); 49 | B(fix(n+1)/2,:)=real(Brow); 50 | end 51 | elseif Nb==1 %computation when Nb=1 52 | B=[0 real(poly(z))]; 53 | else 54 | B=zeros(K+1,3); 55 | for n=1:2:2*K 56 | Brow=z(n:1:n+1,:); 57 | Brow=poly(Brow); 58 | B(fix(n+1)/2,:)=real(Brow); 59 | end 60 | B(K+1,:)=[0 real(poly(z(Nb)))]; 61 | end 62 | 63 | -------------------------------------------------------------------------------- /ARM-tutorial/A12 - ARM pipeline technology.md: -------------------------------------------------------------------------------- 1 | - [ARM流水线技术](#arm流水线技术) 2 | - [三级流水线ARM的组织](#三级流水线arm的组织) 3 | - [ARM的3级流水线介绍](#arm的3级流水线介绍) 4 | - [ARM3级流水线下PC的行为](#arm3级流水线下pc的行为) 5 | - [程序执行时间计算公式](#程序执行时间计算公式) 6 | - [五级流水线ARM的组织](#五级流水线arm的组织) 7 | - [进一步减少CPI](#进一步减少cpi) 8 | 9 | 10 | # ARM流水线技术 11 | 12 | ## 三级流水线ARM的组织 13 | 14 | ### ARM的3级流水线介绍 15 | 16 | 到ARM7为止的ARM处理器使用的简单3级流水线分别为 17 | 18 | + 取指级 :读取指令。 19 | + 译码级 :对指令进行译码。占有“译码逻辑”,不占有“数据路径”。 20 | + 执行级 :指令占有“数据路径”,寄存器堆栈被读取,操作数在桶式移位器中被移位,ALU产生相应的运算结果,并写回目的寄存器中。并根据需求更改状态寄存器的条件位。 21 | 22 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221212161522646.png) 23 | 24 | ### ARM3级流水线下PC的行为 25 | 26 | 在3级流水线的执行过程中,当通过R15寄存器直接访问PC时,必须考虑到此时流水线的执行过程的真实情况 27 | 28 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221212161541566.png) 29 | 30 | ### 程序执行时间计算公式 31 | 32 | $T_{\text {prog }}=\frac{N_{\text {inst }} \times C P I}{f_{c l k}}$ 33 | 34 | - $\mathrm{N}_{\text {inst }}$ :指令数 (固定)。 35 | - CPI : 每条指令的平均时钟周期数。 36 | - $\mathrm{f}_{\text {cll }}$ : 时钟频率。 37 | 38 | 减少Tprog的方法: 39 | 40 | - 1) 减少CPI: 将程序和数据分开 41 | - 2) 提高 $\mathrm{f}_{\mathrm{clk}}$ : 增加流水数,简化每一级的逻辑。 42 | 43 | 44 | 45 | ## 五级流水线ARM的组织 46 | 47 | 使用5级流水线的ARM处理器包含下面5个流水线级: 48 | 49 | + 取指:取指令。 50 | + 译码 :读取寄存器操作数,寄存器堆中有3个操作数读端口,大多数ARM指令能在一个周期内读取其操作数。 51 | + 执行 :把一个操作数移位,并产生ALU结果,如果是Load/Store指令,在ALU中计算存储器地址。 52 | + 缓冲\数据 :如果需要,则访问数据存储器,否则ALU的结果只是简单地缓冲一个时钟周期,以便使得所有指令都有相同的流水线流程。 53 | + 回写 :将指令产生的结果写回到寄存器堆,包括任何从存储器读取的数据。 54 | 55 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221212161712934.png) 56 | 57 | ### 进一步减少CPI 58 | 59 | 要改进CPI,必须增加指令存储器的带宽,ARM10TDMI采用64位存储器结构来解决存储器的瓶颈问题。 60 | 61 | 1. **采用转移预测逻辑**。可以把时钟频率提高,达到每一时钟周期取2条指令。转移预测单元在流水线的发射阶段之前(在流水线的取指阶段),能识别转移指令,并把它从指令流中移去,从而,尽可能地把转移所引起的周期损失降至零。 62 | 2. **采用非阻塞(Non-blocking)存取执行**。一般的存储器存储加载指令,不能在单一存储器周期中完成。采用非阻塞存取措施,就不会在流水线的执行阶段产生停顿。 63 | 3. **采用64位数据存储器**。这样,允许在每个时钟周期传送2个寄存器的指令存取。ARM10TDMI的寄存器组具有4个读端口和3个写端口。 64 | 65 | 66 | 67 | 参考文献: 68 | 69 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 70 | 71 | 72 | 73 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /FPGA-tutorial/F23 - State Machine Concept and Design.md: -------------------------------------------------------------------------------- 1 | - [状态机的概念与设计](#状态机的概念与设计) 2 | - [状态机的基本结构及类型](#状态机的基本结构及类型) 3 | - [状态机的状态图表示法](#状态机的状态图表示法) 4 | - [Mealy型](#mealy型) 5 | - [Moore型](#moore型) 6 | - [状态机的设计步骤](#状态机的设计步骤) 7 | 8 | 9 | # 状态机的概念与设计 10 | 11 | ## 状态机的基本结构及类型 12 | 13 | 有限状态机的标准模型如图所示,它主要由三部分组成: 14 | 15 | 1. 下一状态的逻辑电路(组合电路); 16 | 2. 存储状态机当前状态的时序逻辑电路(时序电路); 17 | 3. 输出组合逻辑电路(组合电路)。 18 | 19 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230209093806848.png) 20 | 21 | 一般情况下,状态触发器的数量是有限的,其状态数也是有限的,故称为有限状态机(Finite State Machine,简称为FSM)。状态机中所有触发器的时钟输入端被连接到一个公共时钟脉冲源上,其状态的转换是在同一时钟源的同一脉冲边沿同步进行的,所以它也被称作时钟同步状态机。 22 | 23 | 一般来说,状态机的基本操作主要有以下两种: 24 | 25 | 1. 状态机的内部状态转换。 26 | 2. 产生输出信号序列。 27 | 28 | 根据电路的输出信号是否与电路的输入有关,可以将状态机分为两种类型:一类是米利型(Mealy)状态机,电路的输出信号不仅与电路当前的状态有关,还与电路的输入有关;另一类是穆尔型(Moore)状态机,电路输出仅仅取决于各触发器的状态,而不受电路当时的输入信号影响或没有输入变量。 29 | 30 | ## 状态机的状态图表示法 31 | 32 | ### Mealy型 33 | 34 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230209093906151.png) 35 | 36 | 上图是米利型状态图的一个例子。在状态图中,每个状态用一个圆圈表示,圆圈内有指示状态的符号。用带箭头的方向线指示状态转换的方向,当方向线的起点和终点都在同一个圆圈上时,则表示状态不变。 37 | 38 | 一般来说,状态机中的状态转移有两种方式:无条件转移和有条件转移。在图中,从状态A转移到状态B为无条件转移,其它状态之间的转移都是有条件要求的。 39 | 40 | ### Moore型 41 | 42 | 需要强调指出,米利型状态图中,输出值的表示方法容易引起读者的误解。当状态机处于所在的状态,并且在所示的输入的作用下,就会产生输出值,并非在状态机转移到下一状态时才出现输出。由于穆尔型电路的输出只依赖于状态机的当前状态,其状态图的表示方法略有不同,通常将输出变量写在表示状态的圆圈内部,图是穆尔型状态图表示的例子。 43 | 44 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230209094129828.png) 45 | 46 | ## 状态机的设计步骤 47 | 48 | 一般来说,状态机的设计步骤如下所示: 49 | 50 | 1. 依据具体的设计原则,确定采用状态机类型:穆尔型状态机还是米利型状态机。 51 | 2. 分析设计要求,列出状态机的所有状态,并对每一个状态进行状态编码。 52 | 3. 根据状态转移关系和输出函数,画出状态图(状态表)。 53 | 4. 根据所画的状态图,采用硬件描述语言对状态机进行描述。 54 | 55 | 第3步是最困难也是最有创造性的一步。状态图直观地反映了状态机各个状态之间的转换关系以及转换条件,但要求设计的状态个数不能太多。状态个数较多,采用状态表的方法列出状态机的转移条件。输出信号较多,可采用输出逻辑真值表进行表示。 56 | 57 | 参考文献: 58 | 59 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 60 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 61 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 62 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 63 | 64 | 65 | 66 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A21 - Detailed explanation of ARM multi-register access instructions.md: -------------------------------------------------------------------------------- 1 | - [ARM多寄存器存取指令详解](#arm多寄存器存取指令详解) 2 | - [多寄存器存取指令的二进制编码](#多寄存器存取指令的二进制编码) 3 | - [指令汇编格式](#指令汇编格式) 4 | - [举例](#举例) 5 | - [注意事项](#注意事项) 6 | 7 | 8 | # ARM多寄存器存取指令详解 9 | 10 | 多寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。如:可将寄存器列表保存到堆栈,也可将寄存器列表从堆栈中恢复。 11 | 这种指令有两个特殊用法: 12 | (1)允许操作系统加载或存储用户模式寄存器来保护或恢复用户处理状态。 13 | (2)作为异常处理返回的一部分,完成从SPSR中恢复CPSR。 14 | 这种指令与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。 15 | 16 | ## 多寄存器存取指令的二进制编码 17 | 18 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221222103443219.png) 19 | 20 | 二进制编码的低16位对应R15~R0的寄存器列表。 21 | 22 | 存储器地址可以通过基址寄存器Rn和寻址模式的定义来实现,在传送一个字前或后基址将增加或减少。如果W=1,则支持自动变址,则当指令完成时,基址寄存器将增加或减少所传送的字节数。 23 | 24 | S位是该指令的特殊用法。如果PC在读取多寄存器的寄存器列表中,且S位置位,则当前模式的SPSR将被拷贝到CPSR。但这种指令不能用在用户模式下,因为用户模式下没有SPSR。如果PC不在寄存器列表中且S位置位,在非用户模式下,执行读取和存入多寄存器指令将传送用户模式下寄存器(虽然使用的是当前模式的基址寄存器),这使得操作系统可以保存和恢复用户处理状态。 25 | 26 | ## 指令汇编格式 27 | 28 | ```assembly 29 | LDM/STM{} Rn{!}, 30 | ``` 31 | 32 | 这里``指定一种寻址模式,表明地址的变化是操作前还是执行后,是在基址基础上增加还是减少。 33 | “!”表示是自动变址(W=1)。 34 | 35 | ``是寄存器列表,用大括号将寄存器组括起来。列表中的寄存器的次序是不重要的,它不影响存取的次序和指令执行后寄存器的值,因为这里有个约定:编号低的寄存器在存储数据或者加载数据时,对应于存储器的低地址。也就是说,编号最低的寄存器保存到最低地址,或从最低地址取数。其他依次递增。 36 | 37 | ## 举例 38 | 39 | ```assembly 40 | LDMIA R1,{R0,R2,R5};R0←mem32[R1] 41 | ;R2←mem32[R1+4] 42 | ;R5←mem32[R1+8] 43 | STMDB R1!,{R3-R6,R11,R12} ;R12→mem32[R1-4] 44 | ;R11→mem32[R1-8] 45 | ;R6→mem32[R1-12] 46 | ;R5→mem32[R1-16] 47 | ;R4→mem32[R1-20] 48 | ;R3→mem32[R1-24] 49 | ;R1 ← R1-24 50 | STMED SP!,{R0-R7,LR} ;现场保存,将R0~R7、LR入栈 51 | ;R14→mem32[R13] 52 | ;R7→mem32[R13-4] 53 | ;…… 54 | ;R0→mem32[R13-32] 55 | ;R13 ← R13-36 56 | ``` 57 | 58 | 59 | 60 | ## 注意事项 61 | 62 | + 如果在保存多寄存器指令的寄存器列表中指定了PC ,则保存的值与体系结构实现方式有关,因此,一般应避免在STM指令中指定PC。 63 | + 如果在读取或存入多寄存器指令的传送列表中包含基址寄存器,则在该指令中不能使用回写模式,因为这样做的结果是不可预测的。 64 | + 如果基址寄存器包含的地址不是字对齐的,则忽略最低2位。一些ARM系统则可能产生异常。 65 | 66 | 67 | 68 | 参考文献: 69 | 70 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 71 | 72 | 73 | 74 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A09 - Working status of ARM processor.md: -------------------------------------------------------------------------------- 1 | - [ARM处理器的工作状态](#arm处理器的工作状态) 2 | - [Thumb技术介绍](#thumb技术介绍) 3 | - [Thumb的技术概述](#thumb的技术概述) 4 | - [Thumb的技术实现](#thumb的技术实现) 5 | - [Thumb技术的特点](#thumb技术的特点) 6 | - [ARM处理器工作状态](#arm处理器工作状态) 7 | - [Thumb2技术介绍](#thumb2技术介绍) 8 | - [评价](#评价) 9 | 10 | 11 | # ARM处理器的工作状态 12 | 13 | ## Thumb技术介绍 14 | 15 | ARM的RISC体系结构的发展中已经提供了低功耗、小体积、高性能的方案。而为了解决代码长度的问题,ARM体系结构又增加了T变种,开发了一种新的指令体系,这就是Thumb指令集,它是ARM技术的一大特色。 16 | 17 | ### Thumb的技术概述 18 | 19 | Thumb是ARM体系结构的扩展。它从标准32位ARM指令集抽出来的36条指令格式,重新编成16位的操作码。这能带来很高的代码密度 20 | ARM7TDMI是第一个支持Thumb的核,支持Thumb的核仅仅是ARM体系结构的一种发展的扩展,所以编译器既可以编译Thumb代码,又可以编译ARM代码,支持Thumb的ARM体系结构的处理器状态可以方便的切换、运行到Thumb状态,在该状态下指令集是16位Thumb指令集 21 | 22 | ### Thumb的技术实现 23 | 24 | 在性能和代码大小之间取得平衡,在需要较低的存储代码时采用Thumb指令系统,但又比纯粹的16位系统有较高的实现性能,因为实际执行的是32位指令,用Thumb指令编写最小代码量的程序,却取得以ARM代码执行的最好性能 25 | 26 | ### Thumb技术的特点 27 | 28 | 与ARM指令集相比.Thumb指令集具有以下局限 29 | 完成相同的操作,Thumb指令通常需要更多的指令,因此在对系统运行时间要求苛刻的应用场合ARM指令集更为适合;Thumb指令集没有包含进行异常处理时需要的一些指令,因此在异常中断时,还是需要使用ARM指令,这种限制决定了Thumb指令需要和ARM指令配合使用。 30 | 31 | ## ARM处理器工作状态 32 | 33 | ARM处理器核可以工作在以下2种状态 34 | 35 | + ARM状态 36 | 32位,ARM状态下执行字对准的32位ARM指令; 37 | + Thumb状态 38 | 16位,Thumb状态下执行半字对准的16位Thumb指令。在Thumb状态下,程序计数器PC使用位1选择另一个半字。 39 | 40 | 在程序执行的过程中,处理器可以在两种状态下切换 ARM处理器在开始执行代码时,只能处于ARM状态。ARM指令集和Thumb指令集都有相应的状态切换命令。 41 | 42 | ARM处理器在两种工作状态之间切换方法 43 | 44 | + 进入Thumb状态 45 | 46 | 当操作数寄存器Rm的状态位bit[0]为1时,执行BX Rm指令进入Thumb状态(指令详细介绍见第三章)。如果处理器在Thumb状态进入异常,则当异常处理(IRQ,FIQ,Undef,Abort和SWI)返回时,自动切换到Thumb状态。 47 | 48 | + 进入ARM状态 49 | 50 | 当操作数寄存器Rm的状态位bit[0]为0时,执行BX Rm指令进入ARM状态。如果处理器进行异常处理(IRQ,FIQ,Undef,Abort和SWI),在此情况下,把PC放入异常模式链接寄存器LR中,从异常向量地址开始执行也可以进入ARM状态。ARM和Thumb之间状态的切换不影响处理器的模式或寄存器的内容。 51 | 52 | ### Thumb2技术介绍 53 | 54 | Thumb-2内核技术是ARM体系结构的新指令集,将为多种嵌入式应用产品提供更高的性能、更有效的功耗和更简短的代码长度,从而为其合作伙伴们在注重成本的嵌入式应用系统开发中提供了强大的发展潜能。 55 | 56 | Thumb-2内核技术以Thumb技术为基础,延续了超高的代码压缩性能并可与现有的ARM技术方案完全兼容,同时提高了压缩代码的性能和功耗利用率。它是一种新的混合型指令集,兼有16位及32位指令,能更好地平衡代码密度和性能。 57 | 58 | Thumb-2指令集在现有的Thumb指令的基础上做了扩充。 59 | 60 | ![image-20221209110030566](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221209110030566.png) 61 | 62 | #### 评价 63 | 64 | Thumb-2指令集增加32位指令就解决了之前Thumb指令集不能访问协处理器、特权指令和特殊功能指令(例如SIMD)的局限。Thumb-2指令集现在可以实现所有的功能,就不需要在ARM/Thumb状态之间反复切换了,代码密度和性能得到的显著的提高。 65 | 66 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221209110056975.png) 67 | 68 | 69 | 70 | 参考文献: 71 | 72 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 73 | 74 | 75 | 76 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A26 - Overview of ARM Embedded System Development Process.md: -------------------------------------------------------------------------------- 1 | - [ARM嵌入式系统开发流程概述](#arm嵌入式系统开发流程概述) 2 | - [嵌入式开发的具体过程](#嵌入式开发的具体过程) 3 | - [开发流程图](#开发流程图) 4 | - [嵌入式软件开发环境](#嵌入式软件开发环境) 5 | - [交叉开发环境](#交叉开发环境) 6 | - [远程调试结构图](#远程调试结构图) 7 | - [嵌入式应用软件开发的基本流程](#嵌入式应用软件开发的基本流程) 8 | - [软件模拟环境](#软件模拟环境) 9 | - [目标板与评估板](#目标板与评估板) 10 | - [嵌入式软件开发的可移植性和可重用性](#嵌入式软件开发的可移植性和可重用性) 11 | 12 | 13 | 14 | # ARM嵌入式系统开发流程概述 15 | 16 | ## 嵌入式开发的具体过程 17 | 18 | + 系统定义与需求分析阶段 19 | + 方案设计阶段 20 | + 详细设计阶段 21 | + 软硬件集成测试阶段 22 | + 系统功能性能测试及可靠性测试阶段 23 | 24 | ### 开发流程图 25 | 26 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221227102743978.png) 27 | 28 | ## 嵌入式软件开发环境 29 | 30 | 嵌入式开发环境组成 31 | 32 | + 交叉开发环境 33 | + 软件模拟环境 34 | + 目标板与评估板 35 | 36 | ### 交叉开发环境 37 | 38 | 嵌入式系统应用软件的开发属于跨平台开发,因此需要一个交叉开发环境。 39 | 40 | 交叉开发是指在一台通用计算机上进行软件的编辑编译,然后下载到嵌入式设备中运行调试的开发方式,它通常采用宿主机/目标机模式。用来开发的通用计算机可以选用比较常见的PC机等,运行通用的Windows等操作系统。 41 | 42 | 开发计算机一般称宿主机,嵌入式设备称为目标机,在宿主机上编译好的程序,下载到目标机上运行,交叉开发环境提供调试工具对目标机上运行的程序进行调试。 43 | 44 | 交叉开发环境一般由运行于宿主机上的交叉开发软件、宿主机到目标机的调试通道组成。 45 | 46 | 运行于宿主机上的交叉开发软件最少必须包含编译调试模块,其编译器为交叉编译器。作为宿主机的一般为基于x86体系的桌上型计算机,而编译出的代码必须在目标机处理器体系结构上运行,这就是所谓的交叉编译了。在宿主机上编译好目标代码后,通过宿主机到目标机的调试通道将代码下载到目标机,然后由运行于宿主机的调试软件控制代码在目标机上运行调试。 47 | 48 | #### 远程调试结构图 49 | 50 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221227102837801.png) 51 | 52 | #### 嵌入式应用软件开发的基本流程 53 | 54 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221227102904334.png) 55 | 56 | ### 软件模拟环境 57 | 58 | 软件模拟环境也称为指令集模拟器IIS(Instruction Set Simulator),在很多时候为保证项目进度,硬件和软件开发往往同时进行,这时作为目标机的硬件环境还没有建立起来,软件的开发就需要一个模拟环境来进行调试。 59 | 60 | 模拟开发环境建立在交叉开发环境基础之上,是对交叉开发环境的补充。这时,除了宿主机和目标机之外,还需要提供一个在宿主机上模拟目标机的环境,使得开发好的程序直接在这个环境里运行调试。 61 | 62 | ### 目标板与评估板 63 | 64 | 应用目标板是系统最终的电路板。 65 | 66 | 评估板(EVM板)一般用来作为开发者使用的学习板、实验板,可以作为应用目标板出来之前的软件测试、硬件调试的电路板。 67 | 68 | 开发评估电路板并不是嵌入式应用开发必须的,对于有经验的工程师完全可以自行独立设计自己的应用电路板和根据开发需要设计实验板。 69 | 70 | 好的评估电路板一般文档齐全,对处理器的常用功能模块和主流应用都有硬件实现,并提供电路原理图和相关开发例程与源代码供用户设计自己的应用目标板和应用程序作参考。 71 | 72 | ### 嵌入式软件开发的可移植性和可重用性 73 | 74 | 在嵌入式软件的开发过程中,在确保软件的正确性、实时性的前提下,必须关注软件的可移植性和可重用性。 75 | 76 | 可移植性和可重用性的程度应该根据实际的应用情况来考虑。因为嵌入式应用软件有自身的许多特点。追求过高的可移植性和可重用性可能会恶化应用软件的实时性能和增加软件的代码量,这对于资源有限的嵌入式应用环境是得不偿失的。 77 | 78 | 我们可以在资源有限、满足系统的需求的情况下尽可能把可移植性和可重用性作为第二目标,致力于开发正确性、实时性能、代码量、可移植性和可重用性相对均衡的嵌入式应用软件。 79 | 80 | 提高应用软件的可移植性和可重用性的方法: 81 | 82 | 1. 多用高级语言少用汇编语言 83 | 2. 将不可移植部分局域化 84 | 3. 提高代码的可重用性 85 | 86 | 87 | 88 | 参考文献: 89 | 90 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 91 | 92 | 93 | 94 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A24 - Detailed Explanation of ARM Abnormal Interrupt Instructions SWI, BKPT, CLZ.md: -------------------------------------------------------------------------------- 1 | - [ARM异常中断指令SWI、BKPT、CLZ详解](#arm异常中断指令swibkptclz详解) 2 | - [SWI](#swi) 3 | - [二进制编码](#二进制编码) 4 | - [汇编格式](#汇编格式) 5 | - [断点指令(BKPT—仅用于v5T体系)](#断点指令bkpt仅用于v5t体系) 6 | - [二进制编码](#二进制编码-1) 7 | - [汇编格式](#汇编格式-1) 8 | - [前导0计数](#前导0计数) 9 | - [二进制编码](#二进制编码-2) 10 | - [汇编格式](#汇编格式-2) 11 | 12 | 13 | # ARM异常中断指令SWI、BKPT、CLZ详解 14 | 15 | 异常中断指令可以分为一下两种: 16 | 17 | + 软件中断指令(SWI) 18 | + 断点指令(BKPT—仅用于v5T体系) 19 | 20 | 软件中断指令SWI用于产生SWI异常中断,用来实现在用户模式下对操作系统中特权模式的程序的调用;断点中断指令BKPT主要用于产生软件断点,供调试程序用。 21 | 22 | ## SWI 23 | 24 | SWI(SoftWare Interrupt)代表“软件中断”,用于用户调用操作系统的系统例程,常称为“监控调用”。它将处理器置于监控(SVC)模式,从地址0x08开始执行指令。 25 | 26 | ### 二进制编码 27 | 28 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221225085817256.png) 29 | 30 | SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递。 31 | 32 | 当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0的内容决定,同时,参数通过其他通用寄存器传递。 33 | 34 | 例如: 35 | 36 | ```assembly 37 | MOV R0, #’A’ ;将’A’调入到R0中… … 38 | SWI SWI_WriteC ;……打印它 39 | ``` 40 | 41 | ### 汇编格式 42 | 43 | ```assembly 44 | SWI {} <24位立即数> 45 | ``` 46 | 47 | 如果条件通过,则指令使用标准的ARM异常入口程序进入监控(SVC)程序(管理模式),这时处理器的行为是: 48 | 49 | + 将SWI后面指令的地址保存到R14_svc 。 50 | + 将CPSR保存到SPSR_svc 。 51 | + 进入监控模式,将CPSR[4:0]设置为0b10011和将CPSR[7]设置为1,以便禁止IRQ(但不是FIQ)。 52 | + 将PC设置为0x08,并且从这里开始执行指令。 53 | 54 | ## 断点指令(BKPT—仅用于v5T体系) 55 | 56 | 断点指令用于软件调试;它使处理器停止执行正常指令(使处理器中止预取指)而进入相应的调试程序。 57 | 58 | ### 二进制编码 59 | 60 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221225085958491.png) 61 | 62 | ### 汇编格式 63 | 64 | ```assembly 65 | BKPT { immed_16} 66 | ``` 67 | 68 | > 注:immed_16为表达式,其值为0~65536,该立即数被调试软件用来保存额外的端点信息。另外,该指令是无条件的。并且V5T体系结构的微处理器才支持BKPT。 69 | 70 | 举例: 71 | 72 | ```assembly 73 | BKPT ; 74 | BKPT 0xF02C ; 75 | ``` 76 | 77 | ## 前导0计数 78 | 79 | 前导0计数(CLZ—仅用于V5T体系)用来实现数字归一化。 80 | 81 | ### 二进制编码 82 | 83 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221225090030397.png) 84 | 85 | 说明:本指令将Rd设置为Rm中为1的最高有效位的位置数,即对Rm中的前导0的个数进行计数,并将计数结果放到Rd中。 86 | 87 | ### 汇编格式 88 | 89 | ```assembly 90 | CLZ { }Rd,Rm 91 | ``` 92 | 93 | > 注:Rd不允许是R15(PC)。 94 | 95 | 举例: 96 | 97 | ```assembly 98 | MOV R2,#0x17F00 99 | CLZ R3,R2 ; R3=15 100 | ``` 101 | 102 | 103 | 104 | 参考文献: 105 | 106 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 107 | 108 | 109 | 110 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A14 - ARM IO access and chip selection.md: -------------------------------------------------------------------------------- 1 | - [ARM的IO访问与芯片选择](#arm的io访问与芯片选择) 2 | - [ARM的IO访问](#arm的io访问) 3 | - [(1)存储器映射I/O](#1存储器映射io) 4 | - [(2)直接存储器访问DMA](#2直接存储器访问dma) 5 | - [基于ARM核的芯片选择](#基于arm核的芯片选择) 6 | - [(1)从应用的角度上ARM芯片选择的一般原则](#1从应用的角度上arm芯片选择的一般原则) 7 | - [(2)多内核ARM芯片](#2多内核arm芯片) 8 | 9 | 10 | # ARM的IO访问与芯片选择 11 | 12 | ## ARM的IO访问 13 | 14 | ARM架构中的处理器核一般都没有I/O部件和模块,ARM架构处理器的I/O可通过AMBA总线来扩充。 15 | 16 | ### (1)存储器映射I/O 17 | 18 | ARM采用了存储器映射I/O方式。即把I/O端口地址作为特殊的存储器地址。但I/O和真正的存储器有所不同:存储器的单元可以重复读多次,其值是一致的。而I/O设备的连续2次输入,其输入值可能有所不同。这些差异,会影响到存储器系统中的Cache和写缓冲作用,因此应该把存储器映射I/O单元标识为非Cache(Uncachable)和非缓冲的(Unbufferable)。在许多ARM架构系统里,I/O单元对于用户码是不可访问的,只可以通过系统管理调用(SWI)或通过C的库函数来使用这些调用。 19 | 20 | ### (2)直接存储器访问DMA 21 | 22 | 在I/O数据流量比较大且中断处理比较频繁的场合,会明显影响系统的性能。因此,许多系统采用了存储器直接访问DMA , 这样,I/O的数据块传送至存储器的缓冲区就不需要处理器介入。而中断也仅仅出现在出错时或缓冲器满时。 23 | 24 | 一般一些高档的ARM架构处理器中具有DMA功能。 25 | 26 | ## 基于ARM核的芯片选择 27 | 28 | ### (1)从应用的角度上ARM芯片选择的一般原则 29 | 30 | **处理器速度**:ARM7 工作频率在20-100MHz,速度为0.9MIPS/MHz;ARM9的芯片工作频率一般为200MHz,速度为1.1MIPS/MHz; ARM10的芯片工作频率可以达到700MHz。应选择满足应用要求的ARM芯片。 31 | 32 | **内置存储器容量**:如果系统不需要大容量存储器,且一些产品对PCB面积要求非常严格,要求所设计的PCB面积很小,就要考虑片内有存储器的芯片。如:OKI的ML67Q4001,内部有256K的Flash;ATMEL的AT91FR40162,内部有2M的Flash和256KSRAM。 33 | 34 | **MMU**:是否使用WinCE和Linux,如果使用则需要带MMU(如:ARM720T、ARM920T、ARM922T、ARM946T)。ARM7TDMI不带MMU,但uCLinux也能用。 35 | 36 | **USB接口**:有些ARM芯片内置USB控制器 37 | 38 | **GPIO数量**:有些是与地址线、数据线和串口线等复用。 39 | 40 | **中断控制器**:ARM内核只提供快速中断FIQ和标准中断IRQ两个中断向量,但各个半导体厂家在设计芯片时,加入了自己不同的中断控制器来支持串口中断、外部中断、定时中断等硬件中断。选择具有合适的中断控制器的芯片能在很大程度上减少任务调度的工作量。 如:PHILIPS的SAA7750,所有GPIO都可设置成FIQ或IRQ,并且可选择上升沿、下降沿、高电平、低电平四种方式。这对红外遥控接收和键盘等任务都很方便。 41 | 42 | **IIS(Integrate Interface of Sound)音频接口** 43 | **nWAIT信号** :这是外部总线速度控制信号。利用该信号与GAL就可以实现与WLAN卡和Bluetooth卡接口,而不需要专用控制芯片。当需要外部扩展DSP协处理器时该信号也是必须的。 44 | 45 | **RTC(Real Time Clock)**:如SAA7750和S3C2410等ARM芯片的RTC直接提供了年、月、日、时、分、秒格式。 46 | 47 | **LCD控制器**:一些ARM芯片内置LCD控制器。 48 | 49 | **PWM输出**:有些有PWM输出,这对电机控制非常有利。 50 | 51 | **ADC和DAC**:有些ARM芯片内置2-8通道的8-12位通用ADC,可用于电量检测、触摸屏和温度监测等。SAA7750内置了一个16位立体声音频ADC和DAC,并且带耳机驱动。 52 | 53 | **PS2**:用来带键盘鼠标。 54 | 55 | **CAN总线**:如现代公司的HMS30C7202就集成了2路CAN总线接口。 56 | 57 | **扩展总线**:大部分ARM芯片都有外部扩展接口,不同的芯片可以扩展的芯片数量不同。外部总线有8位、16位或32位。 58 | 59 | **UART和IrDA**:几乎所有ARM芯片都有1到2个UART接口。 60 | 61 | **时钟计数器和看门狗计数器**:一般ARM芯片都有1个或多个定时计数器和看门狗计数器。 62 | 63 | **电源管理功能**:一般ARM芯片都有低功耗模式、睡眠模式和关闭模式。 64 | 65 | **DMA控制器**:有些ARM芯片内部集成有DMA,可与硬盘等外部设备高速进行数据交换,并且减少对CPU资源的占用。 66 | 67 | **可选择的其他部件**:HDLC、SDLC、CD_ROM译码器、 Ethernet MAC、 VGA控制器,I2C、SPI、 PCI、PCMCIA 等接口。 68 | 69 | ### (2)多内核ARM芯片 70 | 71 | + ARM+DSP 72 | + ARM+FPGA 73 | + 多ARM核 74 | 75 | 76 | 77 | 参考文献: 78 | 79 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 80 | 81 | 82 | 83 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A16 - ARM immediate addressing and register addressing.md: -------------------------------------------------------------------------------- 1 | - [ARM立即寻址与寄存器寻址](#arm立即寻址与寄存器寻址) 2 | - [立即寻址](#立即寻址) 3 | - [立即数的表示](#立即数的表示) 4 | - [有效立即数问题](#有效立即数问题) 5 | - [寄存器寻址](#寄存器寻址) 6 | - [寄存器为第2操作数的移位操作](#寄存器为第2操作数的移位操作) 7 | - [第2操作数的移位方式](#第2操作数的移位方式) 8 | 9 | 10 | # ARM立即寻址与寄存器寻址 11 | 12 | ## 立即寻址 13 | 14 | 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令: 15 | `ADD R0,R0,#1 /*R0←R0+1*/` 16 | `ADD R0,R0,#0x3f /*R0←R0+0x3f*/` 17 | 18 | 立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”,对于以二进制表示的立即数,还要求在“#”后加上“0b” ,对于以十进制表示的立即数,还要求在“#”后加上“0d”或者缺省 。 19 | 20 | ### 立即数的表示 21 | 22 | (1)8位立即数的表示 23 | 24 | + 8位立即数用“#”+数字直接表示。 25 | 26 | (2)32位立即数的表示 27 | 由于32位立即数在指令中占用32个位,如果直接表示,则将导致ARM指令编码的长度超过32位,为了减小编码长度,32位立即数采用移位间接表示法。 28 | 29 | 所谓移位间接表示法就是当指令中操作数为32位立即数时,该立即数必须采用一个8位常数然后通过偶数次的循环右移 得到,这时候,假设这个立即数immediate, 8位常数位immed_8,循环移位位数为2\*rotate_imm,那么,这个立即数可以表示成: 30 | `immediate=immed_8 循环右移(2\*rotate_imm)` 31 | 32 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221216234744529.png) 33 | 34 | ### 有效立即数问题 35 | 36 | 采用移位间接表示时,在指令里面,这个32位的立即数 immediate就可以用一个12位的编码(4位rotate_imm , 8位immed_8 )来表示。如: 37 | 38 | ```assembly 39 | MOV R0,#0x0000F200 ; 编码为:E3A00CF2 40 | MOV R1,#0x00110000 ; 编码为:E3A01811 41 | MOV R4,#0x00012800 ; 编码为:E3A04B4A 42 | ``` 43 | 44 | #0x00012800 = ob0001 00 10 10 00 0000 0000 45 | 这种编码算法的缺点是,并不是每一个32位常数都是一个合法的立即数,只有通过上述构造方法能够得到的32位立即数才是合法的立即数。如:0x0000F200,0x00110000,0x00012800都是合法的立即数,而0x1010、0x00102或0FF1000等都不是合法的立即数。 46 | #0x0001010 = ob0001 0000 0001 0000 47 | #0x0000102 = ob0000 0001 0000 0010 48 | #0xFF1000 = ob1111 1111 0001 0000 0000 0000 49 | 50 | ## 寄存器寻址 51 | 52 | 寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令: 53 | `ADD R0,R1,R2 /*R0←R1+R2*/` 54 | 55 | 该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。 56 | 57 | ### 寄存器为第2操作数的移位操作 58 | 59 | 当ARM指令的数据处理指令中参与操作的第2操作数为寄存器型时,可选择是否对该操作数进行移位操作,即:“Rm,”,其中,Rm为第2操作数寄存器,为移位类型(LSL,LSR,ASL,ASR,ROR或RRX)和移位位数。 60 | 61 | 移位位数可以是5位立即数或寄存器(Rs)。在指令执行时,移位后的数作为第2操作数参与运算,如: 62 | 63 | ```assembly 64 | ADD R3,R2,R1,LSR #2 ;R3←R2+R1÷4 65 | 66 | ADD R3,R2,R1,LSR R4 ;R3←R2+R1÷2R4 67 | ``` 68 | 69 | 而第2操作数寄存器的内容并不发生变化。 70 | 71 | 另外,只有寄存器作为第2操作数时,才能进行这样的移位,否则,不允许进行这样的移位。 72 | 73 | ### 第2操作数的移位方式 74 | 75 | ARM可执行的移位操作有: 76 | 77 | + LSL:逻辑左移,空出的最低位填0 78 | + LSR:逻辑右移,空出的最高位填0 79 | + ASL:算术左移,空出的最低位填0 80 | + ASR:算术右移,如果被移位的数是有符号数,则空出的最高位填符号位。 81 | + ROR:循环右移,移出的最低位填入空出的最高位 82 | + RRX:带扩展的循环右移,右移一位,空出最高位填C,移出最低位进C。这种移位方式无需指定移位位数。 83 | 84 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221216234922394.png) 85 | 86 | 87 | 88 | 参考文献: 89 | 90 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 91 | 92 | 93 | 94 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/implementation/ext_interrupt/s3c2440.h: -------------------------------------------------------------------------------- 1 | //%%%%%%%%%%%%%% s3c2440.h %%%%%%%%%%%%%%%% 2 | 3 | /* WOTCH DOG register */ 4 | #define WTCON (*(volatile unsigned long *)0x53000000) 5 | /* SDRAM regisers */ 6 | #define MEM_CTL_BASE 0x48000000 7 | #define SDRAM_BASE 0x30000000 8 | /* NAND Flash registers */ 9 | #define NFCONF (*(volatile unsigned int *)0x4e000000) 10 | #define NFCMD (*(volatile unsigned char *)0x4e000004) 11 | #define NFADDR (*(volatile unsigned char *)0x4e000008) 12 | #define NFDATA (*(volatile unsigned char *)0x4e00000c) 13 | #define NFSTAT (*(volatile unsigned char *)0x4e000010) 14 | /*GPIO registers*/ 15 | #define GPBCON (*(volatile unsigned long *)0x56000010) 16 | #define GPBDAT (*(volatile unsigned long *)0x56000014) 17 | #define GPFCON (*(volatile unsigned long *)0x56000050) 18 | #define GPFDAT (*(volatile unsigned long *)0x56000054) 19 | #define GPFUP (*(volatile unsigned long *)0x56000058) 20 | #define GPGCON (*(volatile unsigned long *)0x56000060) 21 | #define GPGDAT (*(volatile unsigned long *)0x56000064) 22 | #define GPGUP (*(volatile unsigned long *)0x56000068) 23 | #define GPHCON (*(volatile unsigned long *)0x56000070) 24 | #define GPHDAT (*(volatile unsigned long *)0x56000074) 25 | #define GPHUP (*(volatile unsigned long *)0x56000078) 26 | 27 | /*UART registers*/ 28 | #define ULCON0 (*(volatile unsigned long *)0x50000000) 29 | #define UCON0 (*(volatile unsigned long *)0x50000004) 30 | #define UFCON0 (*(volatile unsigned long *)0x50000008) 31 | #define UMCON0 (*(volatile unsigned long *)0x5000000c) 32 | #define UTRSTAT0 (*(volatile unsigned long *)0x50000010) 33 | #define UTXH0 (*(volatile unsigned char *)0x50000020) 34 | #define URXH0 (*(volatile unsigned char *)0x50000024) 35 | #define UBRDIV0 (*(volatile unsigned long *)0x50000028) 36 | 37 | /*interrupt registes*/ 38 | #define SRCPND (*(volatile unsigned long *)0x4A000000) 39 | #define INTMOD (*(volatile unsigned long *)0x4A000004) 40 | #define INTMSK (*(volatile unsigned long *)0x4A000008) 41 | #define PRIORITY (*(volatile unsigned long *)0x4A00000c) 42 | #define INTPND (*(volatile unsigned long *)0x4A000010) 43 | #define INTOFFSET (*(volatile unsigned long *)0x4A000014) 44 | #define SUBSRCPND (*(volatile unsigned long *)0x4A000018) 45 | #define INTSUBMSK (*(volatile unsigned long *)0x4A00001c) 46 | /*external interrupt registers*/ 47 | #define EINTMASK (*(volatile unsigned long *)0x560000a4) 48 | #define EINTPEND (*(volatile unsigned long *)0x560000a8) -------------------------------------------------------------------------------- /ARM-tutorial/implementation/uart_test/lib.c: -------------------------------------------------------------------------------- 1 | #include "uart_driver.h" 2 | 3 | void s3c2440_putchar(char c) 4 | { 5 | switch(c) 6 | { 7 | case '\n': 8 | uart_putchar('\r'); 9 | break; 10 | case '\b': 11 | uart_putchar('\b'); 12 | uart_putchar(' '); 13 | break; 14 | default: 15 | break; 16 | } 17 | uart_putchar(c); 18 | } 19 | char s3c2440_getchar(void) 20 | { 21 | char c = uart_getchar(); 22 | return c=='\r'?'\n':c; 23 | } 24 | 25 | void s3c2440_puts(const char *str) 26 | { 27 | while(*str) 28 | s3c2440_putchar(*str++); 29 | } 30 | 31 | 32 | void s3c2440_putint_1(int num) 33 | { 34 | int n,m; 35 | if(num==0) 36 | return; 37 | n = num%10; 38 | m = num/10; 39 | s3c2440_putint_1(m); 40 | s3c2440_putchar(n+'0'); 41 | } 42 | 43 | void s3c2440_putint(int num) 44 | { 45 | if(num==0) 46 | s3c2440_putchar('0'); 47 | else 48 | s3c2440_putint_1(num); 49 | } 50 | 51 | 52 | 53 | int strlen(const char *str) 54 | { 55 | const char *s = str; 56 | while(*str++) 57 | ; 58 | return str - s - 1; 59 | } 60 | 61 | void inverse(char *str) 62 | { 63 | int len,i,temp; 64 | len = strlen(str); 65 | for(i=0;i>4 & 0xF)]); 94 | s3c2440_putchar(hex[(c>>0 & 0xF)]); 95 | } 96 | 97 | void s3c2440_putint_hex(int num) 98 | { 99 | s3c2440_putchar_hex(num>>24 & 0xFF); 100 | s3c2440_putchar_hex(num>>16 & 0xFF); 101 | s3c2440_putchar_hex(num>>8 & 0xFF); 102 | s3c2440_putchar_hex(num>>0 & 0xFF); 103 | } 104 | 105 | 106 | int s3c2440_printf(const char *format,...) 107 | { 108 | char c; 109 | int total = 0; 110 | int *addr = (int*)&format; 111 | while((c=*format)!=0) 112 | { 113 | if(c=='%') 114 | { 115 | format++; 116 | switch(*format) 117 | { 118 | case 's': 119 | total++; 120 | s3c2440_puts(*(char**)(++addr)); 121 | break; 122 | case 'd': 123 | total++; 124 | s3c2440_putint(*(int*)(++addr)); 125 | break; 126 | case 'c': 127 | total++; 128 | s3c2440_putchar(*(char*)(++addr)); 129 | break; 130 | case 'x': 131 | total++; 132 | s3c2440_putint_hex(*(int*)(++addr)); 133 | break; 134 | default: 135 | s3c2440_putchar('%'); 136 | s3c2440_putchar(*format); 137 | } 138 | } 139 | else 140 | { 141 | s3c2440_putchar(c); 142 | } 143 | format++; 144 | } 145 | return total; 146 | } -------------------------------------------------------------------------------- /ARM-tutorial/A06 - Computer Architecture and Instruction Set.md: -------------------------------------------------------------------------------- 1 | - [计算机体系结构及指令集](#计算机体系结构及指令集) 2 | - [计算机的两种体系结构](#计算机的两种体系结构) 3 | - [冯·诺依曼体系结构](#冯诺依曼体系结构) 4 | - [哈佛体系结构](#哈佛体系结构) 5 | - [两种指令集 -- CISC和RISC](#两种指令集----cisc和risc) 6 | - [(一) CISC指令集](#一-cisc指令集) 7 | - [CISC指令集的主要缺点](#cisc指令集的主要缺点) 8 | - [(二)RISC指令集](#二risc指令集) 9 | - [RISC指令集的特点:](#risc指令集的特点) 10 | - [RISC技术的历史贡献:](#risc技术的历史贡献) 11 | - [RISC的缺点:](#risc的缺点) 12 | 13 | 14 | # 计算机体系结构及指令集 15 | 16 | ## 计算机的两种体系结构 17 | 18 | 冯·诺依曼体系结构和哈佛体系结构 19 | 20 | ### 冯·诺依曼体系结构 21 | 22 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221201094410509.png) 23 | 24 | 冯·诺依曼体系的特点 25 | 26 | 1. 数据与指令都存储在存储器中,程序执行效率不高 27 | 2. 被大多数计算机所采用,简单 28 | 3. **ARM7——冯诺依曼体系** 29 | 30 | ### 哈佛体系结构 31 | 32 | ![image-20221201094434443](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221201094434443.png) 33 | 34 | 哈佛体系结构的特点 35 | 36 | 1. 程序存储器与数据存储器分开 37 | 2. 提供了较大的数存储器带宽 38 | 3. 适合于数字信号处理 39 | 4. 大多数DSP都是哈佛结构 40 | 5. **ARM9是哈佛结构** 41 | 42 | ## 两种指令集 -- CISC和RISC 43 | 44 | ARM是最成功也是第一个商业化的RISC。也是目前使用最广的基于RISC的处理器。 45 | 46 | ### (一) CISC指令集 47 | 48 | 1980年以前,计算机设计的主要趋势是增加指令集的复杂程度,如:40年代的计算机只有7条指令,1973年的IBM370达到208种指令,1978年的VAX-11达到303条指令。指令过于复杂,机器的设计周期会很长,资金耗费会更大,处理器的设计、验证和维护日益复杂,芯片的面积越来越大,这些表明CISC不适宜构成更高性能的计算机。计算机大量的时间在进行数据搬移,而不是计算。 49 | 50 | #### CISC指令集的主要缺点 51 | 52 | + **20%与80%的问题**:20%的简单指令如取数、运算和转移等占用了CPU执行时间80%以上,而80%的复杂指令仅占了CPU执行时间的20%左右。 53 | + **指令复杂度对处理器的VLSI实现性能的影响**:在计算机体系结构的VLSI实现时,为了达到更高的实现性能,要求VLSI实现的规整性,而CISC中,指令长短不一,控制逻辑的实现非常不规整,致使执行速度的进一步提高比较困难。 54 | + **软硬件协同设计问题**:在CISC中,通过增加指令系统的功能,简化了目标软件的设计,增加了硬件的复杂程度,同时增加了指令的执行时间,从而整个程序执行的时间增加。因此CISC降低了编程的复杂性,并不意味着缩短程序的执行时间。这里有个软硬件协同设计问题。 55 | 56 | ### (二)RISC指令集 57 | 58 | 1980年,Patterson和Ditzel提出了RISC的设计思想。 59 | 60 | **RISC的中心思想**是: **精简指令集的复杂度,简化指令实现的硬件设计,硬件只执行很有限的最常用的那部分指令,大部分复杂的操作则由简单指令合成。** 61 | 62 | RISC思想大幅度提高了计算机的性能价格比,包括ARM在内的商业化的RISC设计证明了这种思路的正确性。**一般来说,RISC处理器比同等的CISC处理器要快50%~75%**,同时,RISC处理器更容易设计和实现。 63 | 64 | #### RISC指令集的特点: 65 | 66 | + **指令效率高**:指令格式和长度固定,且指令类型少,指令功能简单,指令译码控制器采用硬布线逻辑,这样易于流水线的实现,进而获得高性能。大多数指令都是单周期指令。 67 | + **程序的优化编译效率高**:由于RISC指令系统强调了对称、均匀、简单,使得程序的优化编译效率高。 68 | + **分开的Load/Store结构的存取指令**:也只有这两条指令访问存储器,而数据处理指令只访问寄存器。而CISC一般允许将存储器中的数据作为数据处理指令的操作数。 69 | + **基于多个通用寄存器堆操作**:RISC寄存器较多,并且不同的寄存器用于不同的用途。 70 | 71 | RISC体系结构的这些特点简化了处理器的设计,在体系结构的VLSI实现时更加有利于性能的增强。 72 | 73 | #### RISC技术的历史贡献: 74 | 75 | + 流水线:流水线是处理器中实现指令并行操作的最简单的方式,而且可使速度大为提高。 76 | + 高时钟频率和单周期执行:由于RISC指令系统强调了对称、均匀、简单,使得程序的优化编译效率高。 77 | 78 | #### RISC的缺点: 79 | 80 | + 代码密度低:RISC比CISC代码密度低。 81 | + RISC不能执行x86代码。 82 | + 给优化编译程序带来了困难。 83 | 84 | RISC组织结构比CISC结构有着显著的优点,主要表现在体系结构及VLSI实现上: 85 | 86 | + **硬连线的指令译码逻辑**; 87 | RISC指令集的简单性使得指令译码可以采取规则的译码逻辑,CISC处理器使用大的微码ROM进行指令译码,硬布线控制逻辑可以加快指令执行速度,减少微程序码中的指令解释开销。 88 | + **便于流水线执行**; 89 | RISC指令集的简单性也使得流水线实现更加有效,CISC处理器即使有也只允许极少的连续指令间的重叠(尽管它们现在允许)。 90 | + **单周期执行**; 91 | CISC处理器执行一条指令一般需要多个时钟周期。 92 | 93 | 参考文献: 94 | 95 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 96 | 97 | 98 | 99 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A05 - Application and Development of Embedded System.md: -------------------------------------------------------------------------------- 1 | - [嵌入式系统的应用与发展](#嵌入式系统的应用与发展) 2 | - [消费电子领域](#消费电子领域) 3 | - [通信领域](#通信领域) 4 | - [工控、汽车电子、仿真、医疗仪器等](#工控汽车电子仿真医疗仪器等) 5 | - [国防、航空航天领域](#国防航空航天领域) 6 | - [嵌入式系统的发展趋势](#嵌入式系统的发展趋势) 7 | - [**形成行业的标准**](#形成行业的标准) 8 | - [嵌入式应用软件的开发需要强大的开发工具和操作系统的支持](#嵌入式应用软件的开发需要强大的开发工具和操作系统的支持) 9 | - [嵌入式开发工具](#嵌入式开发工具) 10 | - [嵌入式系统联网成为必然趋势](#嵌入式系统联网成为必然趋势) 11 | 12 | 13 | # 嵌入式系统的应用与发展 14 | 15 | 嵌入式系统广泛地应用于消费电子、通信、汽车、国防、航空航天、工业控制、仪表、办公自动化等领域。 16 | 17 | > 据欧盟的统计: 18 | > 19 | > + 2003年全球大概有80亿片嵌入式微处理器,到2012年,预计会达到160亿片,地球上的人平均拥有3个嵌入式微处理器; 20 | > + 在航空电子中,嵌入式软件的开发成本占整个飞机研制成本的50%;对于汽车工业,汽车电子在整车价值中的比例逐年提高,将从1997年的20%提升到2012年的33-40%; 21 | > + 消费电子数量越来越大,据预测,到2012年,仅数字家庭在美国的销售额就将达到2000亿欧元。 22 | 23 | ### 消费电子领域 24 | 25 | + 随着技术的发展,消费电子产品正向数字化和网络化方向发展。 26 | + 高清晰度数字电视将代替传统的模拟电视。 27 | + 数码相机将代替传统的胶片相机。 28 | + 固定电话今后会被IP电话所替代。 29 | + 各种家用电器(电视机、冰箱、微波炉、电话等)将通过家庭通信、控制中心与Internet连接,实现远程控制、信息交互、网上娱乐、远程医疗和远程教育等。转变为智能网络家电,还可以实现远程医疗,远程教育等。 30 | 31 | ### 通信领域 32 | 33 | + 通信领域大量应用嵌入式系统,主要包括程控**交换机、路由器、IP交换机、传输设备**等。 34 | + 据预测,由于互联的需要,特别是宽带网络的发展,将会出现各种**网络设备如:ADSL Modem/Router**等,其数量将远远高于传统的网络设备。 35 | + 它们基于32位的嵌入式系统、价格低廉,将为企业、家庭提供更为廉价的、方便的、多样的网络方案。就宽带上网的网络设备ADSL Router而言,国外现在每月需要600K的数量。 36 | 37 | ### 工控、汽车电子、仿真、医疗仪器等 38 | 39 | > + 随着工业、汽车、医疗卫生等各部门对智能控制需求的不断增长,需要对设备进行智能化、数字化改造,为嵌入式系统提供了很大的市场。 40 | > + 就汽车电子系统而言,目前的大多数高档轿车每辆拥有约50个嵌入式微处理器。如BMW 7系列轿车,则平均安装有63个嵌入式微处理器。 41 | > + 据预测,21世纪初美国接入Internet的汽车将有一亿辆。IC Insights报道2001年车载计算系统的市场规模是30亿美元,而2004年达到46亿美元,这些系统成为所有新型轿车的标准设备。 42 | 43 | ### 国防、航空航天领域 44 | 45 | + 雷达、电子对抗、坦克、战舰 46 | + 航天器(火箭、卫星、航天飞机等) 47 | + 飞机(民用和军用飞机) 48 | 49 | ## 嵌入式系统的发展趋势 50 | 51 | #### **形成行业的标准** 52 | 53 | 行业性嵌入式软硬件平台 54 | 55 | + 嵌入式系统是以应用为中心的系统,不会如PC一样只有一种平台。 56 | + 吸取PC的成功经验,形成不同行业的标准。 57 | + 统一的行业标准具有开放、设计技术共享、软硬件重用、构件兼容、维护方便和合作生产的特点,是增强行业性产品竞争能力的有效手段。 58 | + 如欧共体汽车产业联盟规定以OSEK标准作为开发汽车嵌入式系统的公用平台和应用编程接口 59 | 60 | #### 嵌入式应用软件的开发需要强大的开发工具和操作系统的支持 61 | 62 | + 采用实时多任务编程技术和交叉开发工具技术来控制功能复杂性,简化应用程序设计、保障软件质量和缩短开发周期。 63 | + 嵌入式操作系统将在现有的基础上,不断采用先进的操作系统技术,结合嵌入式系统的需求向: 64 | + 可适应不同的嵌入式硬件平台 65 | + 具有可移植、可伸缩、功能强大、可配置、良好的实时性、可靠性、高可用方向发展 66 | 67 | #### 嵌入式开发工具 68 | 69 | + 支持多种硬件平台 70 | + 覆盖嵌入式软件开发过程各个阶段 71 | + 高效 72 | + 高度集成的工具集方向发展 73 | 74 | 面向应用领域的、高度集成的、以**32位嵌入式微处理器为核心的SOC(System On Chip)将成为应用主流**。 75 | 76 | SoC给系统带来高性能之外更多更重要的好处 77 | 78 | + 稳定性、体积、散热、功耗· · · 79 | 80 | #### 嵌入式系统联网成为必然趋势 81 | 82 | + 针对外部联网要求,嵌入系统必需配有通信接口,需要TCP/IP协议簇软件支持。 83 | + 针对内部联网要求,新一代嵌入式系统还需具备IEEE1394、USB、CAN、Bluetooth或IrDA通信接口,同时也需要提供相应的通信组网协议软件和物理层驱动软件。 84 | + 为了支持网络交互的应用,还需内置XML浏览器和Web Server。 85 | + 增强了系统和设备的可管理性 86 | 87 | 嵌入式系统向新的嵌入式计算模型方向发展 88 | 89 | + **支持自然的人机交互和互动的**、图形化、多媒体的嵌入式人机界面。操作简便、直观、无须学习。如司机操纵高度自动化的汽车主要还是通过习惯的方向盘、脚踏板和操纵杆。 90 | + **可编程的嵌入式系统**。嵌入式系统可支持二次开发如采用嵌入式Java技术,可动态加载和升级软件,增强嵌入式系统功能。 91 | + **支持分布式计算**。与其他嵌入式系统和通用计算机系统互联构成分布式计算环境。 92 | 93 | 94 | 参考文献: 95 | 96 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 97 | 98 | 99 | 100 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A02 - Overview of Embedded System Development.md: -------------------------------------------------------------------------------- 1 | - [嵌入式系统的开发概述](#嵌入式系统的开发概述) 2 | - [嵌入式系统开发基本流程](#嵌入式系统开发基本流程) 3 | - [嵌入式软件开发](#嵌入式软件开发) 4 | - [嵌入式软件开发的特点和技术挑战](#嵌入式软件开发的特点和技术挑战) 5 | - [嵌入式软件开发环境](#嵌入式软件开发环境) 6 | - [交叉开发环境](#交叉开发环境) 7 | - [软件模拟环境](#软件模拟环境) 8 | - [目标板与评估板](#目标板与评估板) 9 | - [嵌入式软件开发的可移植性和可重用性](#嵌入式软件开发的可移植性和可重用性) 10 | 11 | 12 | # 嵌入式系统的开发概述 13 | 14 | ### 嵌入式系统开发基本流程 15 | 16 | 面向具体应用的嵌入式开发决定了嵌入式开发的方法、流程各有不同,这里仅给出一般的嵌入式开发的具体过程: 17 | 18 | + 系统定义与需求分析阶段 19 | + 方案设计阶段 20 | + 详细设计阶段 21 | + 软硬件集成测试阶段 22 | + 系统功能性能测试及可靠性测试阶段 23 | 24 | ### 嵌入式软件开发 25 | 26 | 1.嵌入式软件开发的特点和技术挑战 27 | 28 | 2.嵌入式软件开发环境 29 | 30 | 3.嵌入式应用软件开发的基本流程 31 | 32 | 4.嵌入式软件开发的可移植性和可重用性 33 | 34 | #### 嵌入式软件开发的特点和技术挑战 35 | 36 | + 开发的复杂度 37 | + 嵌入式软件开发需要软硬件开发环境和工具 38 | + 嵌入式软硬件必须协同设计 39 | + 需要新的任务设计方法 40 | + 需要转变观念,熟悉新的开发模式 41 | + 开发过程完成后,系统应用程序代码需要固化到系统中进行功能、性能和可靠性测试 42 | + 技术挑战:技术门槛提高,需要学习全新的RTOS技术;软件的要求更高,开发工作量和难度更大 43 | 44 | ### 嵌入式软件开发环境 45 | 46 | 嵌入式开发环境组成 47 | 48 | + 交叉开发环境 49 | + 软件模拟环境 50 | + 目标板与评估板 51 | 52 | #### 交叉开发环境 53 | 54 | 嵌入式系统应用软件的开发属于跨平台开发,因此需要一个交叉开发环境。 55 | 56 | 交叉开发是指在一台通用计算机上进行软件的编辑编译,然后下载到嵌入式设备中运行调试的开发方式,它通常采用宿主机/目标机模式。用来开发的通用计算机可以选用比较常见的PC机 57 | 等,运行通用的Windows等操作系统。 58 | 59 | **开发计算机一般称宿主机,嵌入式设备称为目标机**,在宿主机上编译好的程序,下载到目标机上运行,交叉开发环境提供调试工具对目标机上运行的程序进行调试。 60 | 61 | 交叉开发环境一般由运行于宿主机上的交叉开发软件、宿主机到目标机的调试通道组成。 62 | 63 | 运行于宿主机上的交叉开发软件**最少必须包含编译调试模块**,**其编译器为交叉编译器**。作为宿主机的一般为基于x86体系的桌上型计算机,而编译出的代码必须在目标机处理器体系结构上运行,这就是所谓的**交叉编译**了。在宿主机上编译好目标代码后,通过宿主机到目标机的调试通道将代码下载到目标机,然后由运行于宿主机的调试软件控制代码在目标机上运行调试。 64 | 65 | 远程调试结构图如下: 66 | 67 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221128161137375.png) 68 | 69 | 基于交叉开发环境的嵌入式应用软件开发主要分如下几个步骤: 70 | 71 | + 开发环境的建立; 72 | + 源代码编辑阶段; 73 | + 交叉编译和链接; 74 | + 联机调试; 75 | + 固化与测试。 76 | 77 | 嵌入式应用软件开发的基本流程 78 | 79 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221128161412016.png) 80 | 81 | #### 软件模拟环境 82 | 83 | 软件模拟环境也称为**指令集模拟器IIS(Instruction Set Simulator)**,在很多时候为保证项目进度,**硬件和软件开发往往同时进行**,这时作为目标机的硬件环境还没有建立起来,软件的开发就需要一个模拟环境来进行调试。 84 | 85 | 模拟开发环境建立在交叉开发环境基础之上,是对交叉开发环境的补充。这时,除了宿主机和目标机之外,还需要提供一个在宿主机上模拟目标机的环境,使得开发好的程序直接在这个环境里运行调试。 86 | 87 | #### 目标板与评估板 88 | 89 | + 应用目标板是系统最终的电路板。 90 | + 评估板一般用来作为开发者使用的学习板、实验板,可以作为应用目标板出来之前的软件测试、硬件调试的电路板。 91 | + 开发评估电路板并不是嵌入式应用开发必须的,对于有经验的工程师完全可以自行独立设计自己的应用电路板和根据开发需要设计实验板。 92 | + 好的评估电路板一般文档齐全,对处理器的常用功能模块和主流应用都有硬件实现,并提供电路原理图和相关开发例程与源代码供用户设计自己的应用目标板和应用程序作参考。 93 | 94 | #### 嵌入式软件开发的可移植性和可重用性 95 | 96 | + 在嵌入式软件的开发过程中,在确保软件的正确性、实时性的前提下,必须关注软件的可移植性和可重用性。 97 | + **可移植性和可重用性的程度应该根据实际的应用情况来考虑**。因为嵌入式应用软件有自身的许多特点。追求过高的可移植性和可重用性可能会恶化应用软件的实时性能和增加软件的代码量,这对于资源有限的嵌入式应用环境是得不偿失的。 98 | + 我们可以在资源有限、满足系统的需求的情况下尽可能把可移植性和可重用性作为第二目标,致力于开发正确性、实时性能、代码量、可移植性和可重用性相对均衡的嵌入式应用软件。 99 | 100 | 提高应用软件的可移植性和可重用性的方法: 101 | 102 | + **多用高级语言少用汇编语言** 103 | + **将不可移植部分局域化** 104 | + **提高代码的可重用性** 105 | 106 | 107 | 参考文献: 108 | 109 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 110 | 111 | 112 | 113 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /FPGA-tutorial/F22 - Design and Simulation of M-sequence Code Generation Circuit.md: -------------------------------------------------------------------------------- 1 | - [m序列码产生电路设计与仿真](#m序列码产生电路设计与仿真) 2 | 3 | 4 | # m序列码产生电路设计与仿真 5 | 6 | m 序列又叫做伪随机序列、伪噪声(pseudo noise,PN)码或伪随机码,是一种可以预先确定并可以重复地产生和复制、又具有随机统计特性的二进制码序列。 7 | 8 | 伪随机序列一般用二进制表示,每个码元(即构成m序列的元素)只有“0”或“1”两种取值,分别与数字电路中的低电平或高电平相对应。 9 | 10 | m 序列是对最长线性反馈移位寄存器序列的简称,它是一种由带线性反馈的移位寄存器所产生的序列,并且具有最长周期。 11 | 12 | 图所示是一种3位m序列产生器,它将1,3两级触发器的输出通过同或门反馈到第一级的输入端。 13 | 14 | 其工作原理是:在清零后,3个触发器的输出均为0,于是同或门的输出为1,在时钟触发下,每次移位后各级寄存器状态都会发生变化。 15 | 16 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202161913637.png) 17 | 18 | 分析该电路得到如图所示的仿真波形图,其中任何一级触发器(通常为末级)的输出都是一个周期序列(或者称为m序列),但各个输出端的m序列的初始相位不同。m序列的周期不仅与移位寄存器的级数有关,而且与线性反馈逻辑和初始状态有关。 19 | 20 | 此外,在相同级数的情况下,采用不同的线性反馈逻辑所得到的周期长度是不同的。 21 | 22 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202162041331.png) 23 | 24 | 该电路的状态转换图如图所示。 25 | 26 | 共有$2^3-1=7$个状态 27 | 28 | ![三位m序列状态转换图](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202162154243.png) 29 | 30 | 通常,将类似于图所示结构的m序列产生器称为简单型码序列发生器(Simple Shift Register Generator,SSRG),它的一般结构如下图所示。 31 | 32 | 图中,各个触发器ai(i=1,2,…r)构成移位寄存器,代表异或运算,C0、C1、C2、……、Cr是反馈系数,也是特征多项式的系数。系数取值为1表示反馈支路连通,0表示反馈支路断开。 33 | 34 | ![SSRG电路的结构](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202162306442.png) 35 | 36 | 对于SSRG结构的m序列发生器,其特征多项式的一般表达式为 37 | $$ 38 | f(x)=C_{0} x^{0}+C_{1} x^{1}+C_{2} x^{2}+\cdots+C_{r} x^{r} 39 | $$ 40 | 特征多项式系数决定了一个m序列的特征多项式,同时也就决定了一个m序列。 41 | 42 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202162400516.png) 43 | 44 | 下表给出了部分m序列的反馈系数,系数的值是用八进制数表示的。 45 | 46 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202162430114.png) 47 | 48 | 根据多项式的系数可以产生m序列。 49 | 50 | 例如,想要产生一个码长为31的m序列,寄存器的级数r = 5,从表中查到反馈系数有三个,分别为45、67、75,可以从中选择反馈系数45来构成m序列产生器,因为使用45时,反馈线最少,构成的电路最简单。 51 | 52 | 45为八进制数,写成二进制数为100101,这就是特征多项式的系数,即 C5 C4 C3 C2 C1 C0=100101 53 | 54 | 表明C5、C2、C0三条反馈支路是连通的,另外三条反馈支路C4、C3、C1是断开的,其电路如图所示。 55 | 56 | ![五位 m 序列产生器](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202162529793.png) 57 | 58 | Verilog HDL程序如下: 59 | 60 | ```verilog 61 | module m5(CLK, CLRN, OUT); 62 | input CLK, CLRN; //输入端口 63 | output OUT; //输出端口 64 | reg[4:0] Q; //中间节点 65 | wire C0; 66 | assign C0 = ~(Q[4] ^ Q[1]); //反馈 67 | assign OUT = Q[4]; //输出信号 68 | always@(posedge CLK or negedge CLRN) 69 | begin 70 | if(!CLRN ) 71 | Q[4:0] <= 5'b00000; //异步清零 72 | else 73 | Q[4:0] <= {Q[3:0],C0}; //移位 74 | end 75 | endmodule 76 | ``` 77 | 78 | 仿真波形(m序列长度为31): 79 | 80 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202162601823.png) 81 | 82 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202162605747.png) 83 | 84 | 参考文献: 85 | 86 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 87 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 88 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 89 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 90 | 91 | 92 | 93 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /FPGA-tutorial/F15 - Hierarchical Approach to Circuit Design.md: -------------------------------------------------------------------------------- 1 | - [分层次的电路设计方法](#分层次的电路设计方法) 2 | - [设计方法](#设计方法) 3 | - [全加器电路设计举例](#全加器电路设计举例) 4 | - [一位半加器的描述](#一位半加器的描述) 5 | - [一位全加器的描述](#一位全加器的描述) 6 | - [四位全加器的描述](#四位全加器的描述) 7 | - [模块实例引用语句](#模块实例引用语句) 8 | 9 | 10 | # 分层次的电路设计方法 11 | 12 | ## 设计方法 13 | 14 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230130103739077.png) 15 | 16 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230130103747281.png) 17 | 18 | 使用自下而上的方法(bottom-up) : 19 | 20 | + 实例引用基本门级元件xor、and定义底层的半加器模块halfadder; 21 | + 实例引用两个半加器模块halfadder和一个基本或门元件or组合成为1位全加器模块fulladder; 22 | + 实例引用4个1位的全加器模块fulladder构成4位全加器的顶层模块。 23 | 24 | ### 全加器电路设计举例 25 | 26 | #### 一位半加器的描述 27 | 28 | ``` 29 | //************ 一位半加器的描述 ************ 30 | module halfadder (S,C,A,B); //IEEE 1364—1995 Syntax 31 | input A,B; //输入端口声明 32 | output S,C; //输出端口声明 33 | xor (S,A,B); //实例引用逻辑门原语 34 | and (C,A,B); 35 | endmodule 36 | 37 | ``` 38 | 39 | #### 一位全加器的描述 40 | 41 | ``` 42 | //************ 一位全加器的描述 ************ 43 | module fulladder (Sum,Co,A,B,Ci); 44 | input A,B,Ci; output Sum,Co; 45 | wire S1,D1,D2; //内部节点信号声明 46 | halfadder HA1 (.B(B),.S(S1),.C(D1),.A(A)); //实例引用底层模块halfadder 47 | halfadder HA2 (.A(S1),.B(Ci), .S(Sum),.C(D2)); //端口信号按照名称对应关联 48 | or g1(Co,D2,D1); 49 | endmodule 50 | ``` 51 | 52 | #### 四位全加器的描述 53 | 54 | ``` 55 | //************四位全加器的描述************ 56 | module _4bit_adder (S,C3,A,B,C_1); 57 | input [3:0] A,B; 58 | input C_1; 59 | output [3:0] S; 60 | output C3; 61 | wire C0,C1,C2; //声明模块内部的连接线 62 | fulladder U0_FA (S[0],C0,A[0],B[0],C_1); //实例引用模块fulladder 63 | fulladder U1_FA (S[1],C1,A[1],B[1],C0); //端口信号按照位置顺序对应关联 64 | fulladder U2_FA (S[2],C2,A[2],B[2],C1); 65 | fulladder U3_FA (S[3],C3,A[3],B[3],C2); 66 | endmodule 67 | ``` 68 | 69 | ## 模块实例引用语句 70 | 71 | 模块实例引用语句的格式如下: 72 | 73 | ``` 74 | module_name instance_name(port_associations); 75 | ``` 76 | 77 | (port_associations)**父、子模块端口的关联方式**: 78 | 79 | + 位置关联法: 父模块与子模块的端口信号是按照位置(端口排列次序)对应关联的 80 | 81 | + 名称关联法: 82 | 83 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230130104336295.png) 84 | 85 | 关于模块引用的几点注意事项: 86 | 87 | 1. 模块只能以实例引用的方式嵌套在其他模块内,嵌套的层次是没有限制的。但不能在一个模块内部使用关键词module和endmodule去定义另一个模块,也不能以循环方式嵌套模块,即不能在always语句内部引用子模块。 88 | 89 | 2. 实例引用的子模块可以是一个设计好的Verilog HDL设计文件(即一个设计模块),也可以是FPGA元件库中一个元件或嵌入式元件功能块,或者是用别的HDL语言(如VHDL、AHDL等)设计的元件,还可以是IP(Intellectual Property,知识产权)核模块。 90 | 91 | 3. 在一条实例引用子模块的语句中,不能一部分端口用位置关联,另一部分端口用名称关联,即不能混合使用这两种方式建立端口之间的连接。 92 | 93 | 4. 关于端口连接时有关变量数据类型的一些规定。 94 | 95 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230130104425902.png) 96 | 97 | 98 | 99 | 100 | 101 | 参考文献: 102 | 103 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 104 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 105 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 106 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 107 | 108 | 109 | 110 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A17 - ARM indirect addressing, indexed addressing and multiple register addressing.md: -------------------------------------------------------------------------------- 1 | - [ARM间接寻址、变址寻址与多寄存器寻址](#arm间接寻址变址寻址与多寄存器寻址) 2 | - [寄存器间接寻址](#寄存器间接寻址) 3 | - [基址加偏址寻址(变址寻址)](#基址加偏址寻址变址寻址) 4 | - [偏移地址](#偏移地址) 5 | - [传送数据类型](#传送数据类型) 6 | - [块拷贝寻址(多寄存器寻址)](#块拷贝寻址多寄存器寻址) 7 | - [块拷贝寻址示例](#块拷贝寻址示例) 8 | 9 | 10 | # ARM间接寻址、变址寻址与多寄存器寻址 11 | 12 | ## 寄存器间接寻址 13 | 14 | 寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令: 15 | 16 | ```assembly 17 | LDR R0,[R1] /*R0←[R1]*/ 18 | STR R0,[R1] /*[R1]←R0*/ 19 | ``` 20 | 21 | 第一条指令将以R1的值为地址的存储器中的数据传送到R0中。第二条指令将R0的值传送到以R1的值为地址的存储器中。 22 | 23 | ARM的数据传送指令都是基于寄存器间接寻址,即通过Load/Store完成对数据的传送操作。 24 | 25 | ## 基址加偏址寻址(变址寻址) 26 | 27 | 基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量(用12位表示,不超过4KB)相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。 28 | 29 | 变址寻址方式可以分为:前变址(Pre-indexed)、自动变址(Auto-indexed)和后变址(Post-indexed)。 30 | 31 | 1. 前变址模式 32 | 33 | ```assembly 34 | LDR R0,[R1,#4] ;R0←[R1+4] 35 | ``` 36 | 37 | 2. 自动变址模式 38 | 39 | ```assembly 40 | LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4 41 | ``` 42 | 43 | 3. 后变址模式 44 | 45 | ```assembly 46 | LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4 47 | ``` 48 | 49 | ### 偏移地址 50 | 51 | 地址偏移除了可以是一个12位的立即数,还可以是另一个寄存器,并且在加到基址寄存器之前还可以先经过移位操作,如: 52 | 53 | ```assembly 54 | LDR R0,[R1,R2] ;R0←[R1+R2] 55 | LDR R0,[R1,R2,LSL #2] ;R0←[R1+R2*4] 56 | ``` 57 | 58 | ### 传送数据类型 59 | 60 | ARM处理器支持的传送数据类型可以是有符号和无符号的8位字节、16位半字、32位字,最高位表示符号位(正数为0,负数为1)。对于字节操作,在指令中增加了字母B,对于半字,在指令中增加了字母H进行标识。默认是字操作,不加数据类型标识。如: 61 | 62 | ```assembly 63 | LDRB R0,[R1] ;R0←mem8[R1], 加载8位字节数据到寄存器R0,零扩展到32位 64 | LDRH R1,[R0,#20] ;R0←mem16[R0+20] 加载16位半字到寄存器R1 ,零扩展到32位 65 | ``` 66 | 67 | 这时,传送的地址可与任意字节、半字对齐,而不限于4字节对齐。 68 | 69 | ## 块拷贝寻址(多寄存器寻址) 70 | 71 | 块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式。通过一条指令可以把一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。这种寻址方式中的寄存器可以是R0-R15这16个通用寄存器中的部分或全部。如: 72 | 73 | ```assembly 74 | LDMIA R0,{R1,R2,R3,R4} 75 | ;R1←[R0] 76 | ;R2←[R0+4] 77 | ;R3←[R0+8] 78 | ;R4←[R0+12] 79 | ``` 80 | 81 | 该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。 82 | 83 | LDM/STM指令依据其后缀名(如:IA,DB)的不同,其寻址的方式也有很大不同。这些后缀可以定义存储器地址的增长是向上还是向下,以及地址的增减与指令操作的先后顺序(即:操作先进行还是地址的增减先进行)。 84 | 85 | 这些后缀可以分成两大类:一类用于数据的存储与读取,这类后缀有:IA、IB、DA、DB;另一类用于堆栈的操作,即压栈和出栈,这类后缀有:FD、ED、FA、EA。 86 | 87 | 这些后缀的含义是: 88 | 89 | + IA(Increment After) 操作完成后地址递增 90 | + IB(Increment Before)地址先增后完成操作 91 | + DA(Decrement After)操作完成后地址递减 92 | + DB(Decrement Before)地址先减后完成操作 93 | + FD (Full Decrement)满递减堆栈 94 | + ED (Empty Decrement)空递减堆栈 95 | + FA(Full Aggrandizement)满递增堆栈 96 | + EA(Empty Aggrandizement)空递增堆栈 97 | 98 | ### 块拷贝寻址示例 99 | 100 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221218192738850.png) 101 | 102 | 例:分析下面两条指令的作用,并分析基址寄存器的变化有什么不同? 103 | 104 | ```assembly 105 | LDMIA R0!,{R2-R9} 106 | STMIA R1,{R2-R9} 107 | ``` 108 | 109 | 这两句的作用是将R0指向的连续8个存储单元的内容拷贝到R1指向的连续8个单元中去。 110 | 111 | 这两句执行完毕后,R0的内容增加了32个字节,这是由于使用了自动变址符号“!”,而R1的内容保持保持不变。 112 | 113 | 注意:在堆栈操作中总是要指定自动变址,否则,以前保存的内容会因为堆栈寄存器的基址不变将在下一次堆栈操作时遭到破坏! 114 | 115 | 116 | 117 | 参考文献: 118 | 119 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 120 | 121 | 122 | 123 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A01 - Embedded system overview and characteristics.md: -------------------------------------------------------------------------------- 1 | - [嵌入式系统概述及特点](#嵌入式系统概述及特点) 2 | - [什么是嵌入式系统?](#什么是嵌入式系统) 3 | - [嵌入式系统的历史与发展](#嵌入式系统的历史与发展) 4 | - [嵌入式系统的分类](#嵌入式系统的分类) 5 | - [嵌入式系统的特点](#嵌入式系统的特点) 6 | 7 | 8 | # 嵌入式系统概述及特点 9 | 10 | ## 什么是嵌入式系统? 11 | 12 | 嵌入式系统(Embedded Systems)是指:“**嵌入到对象体系中的、用于执行独立功能的专用计算机系统**”。定义为以应用为中心,以微电子技术、控制技术、计算机技术和通讯技术为基础,强调硬件软件的协同性与整合性,软件硬件可剪裁的,适应应用系统对功能、可靠性、成本、体积、功耗和应用环境有等严格要求的专用计算机系统。 13 | 14 | **嵌入式系统的嵌入式本质就是将一个计算机嵌入到一个对象体系中去。** 15 | 16 | 从广义上讲,**凡是带有微处理器的专用硬件系统都可以称为嵌入式系统**,如各类单片机和DSP系统。这些系统在完成较为单一的专业功能时具有简洁高效的特点。但他们的软件的能力有限。 17 | 18 | 复杂的嵌入式系统采用**嵌入式微处理器,具有自己的操作系统**,具有特定功能,用于特定的场合。 19 | 20 | ### 嵌入式系统的历史与发展 21 | 22 | 1.始于微型机时代的嵌入式系统 23 | 24 | (1)单片机开创了嵌入式系统独立发展之路 25 | 26 | (2)单片机的技术发展史 27 | 28 | 单片机诞生于20世纪70年代末,经历了SCM (Smart Controller Module )、MCU、SoC三大阶段。 29 | 30 | 2.现代计算机技术的两大分支 31 | 32 | + **通用计算机系统** 33 | + **嵌入式计算机系统** 34 | 35 | ### 嵌入式系统的分类 36 | 37 | 根据不同的标准,嵌入式系统有不同的分类方法。 38 | 39 | (1)嵌入式系统按形态可分为 40 | 41 | + 设备级(工控机) 42 | + 板级(单板、模块) 43 | + 芯片级(MCU — Micro Control Unit 、SoC — System onChip ) 44 | 45 | 因此,有些人把嵌入式处理器当作嵌入式系统,但由于嵌入式系统是一个嵌入式计算机系统,因此,**只有将嵌入式处理器构成一个计算机系统,并作为嵌入式应用时,这样的计算机系统才可称作嵌入式系统。** 46 | 47 | (2)按嵌入式微处理器的位数分类 48 | 49 | + 4位 50 | + 8位 51 | + 16位 52 | + 32位 53 | + 64位……. 54 | 55 | 其中,4位、8位、16位嵌入式系统已经获得了大量应用,**32位嵌入式系统**正成为主流发展趋势。而一些高度负责和要求高速处理的嵌入式系统已经开始使用64位嵌入式微处理器。 56 | 57 | (3)按软件实时性需求分类 58 | 59 | + 非实时系统(如PDA) 60 | + 软实时系统(如消费类产品) 61 | + 硬实时系统(如工业实时控制系统) 62 | 63 | **实时系统**是一个能够在**指定时间内**完成系统功能并对外部或内部事件做出响应的系统; 64 | 65 | 实时逻辑的正确性不仅依赖于计算结果的正确性还取决于输出结果的时间。 66 | 67 | **实时系统分类** 68 | 69 | + 强实时系统, 其系统响应时间在毫秒或微秒级。 70 | + 一般实时系统, 其系统响应时间在几秒的数量级上,其实时性的要求比强实时系统要差一些。 71 | + 弱实时系统, 其系统响应时间约为数十秒或更长。这种系统的响应时间可能随系统负载的轻重而变化。 72 | 73 | 根据**实时时间的确定性的强弱**,可将**嵌入式系统**分为**硬实时、软实时系统**: 74 | 75 | + 硬实时:系统对系统响应时间有严格的要求,如果系统响应时间不能满足,就要引起系统崩溃或致命的错误。(如工业现场控制) 76 | + 软实时:系统对系统响应时间有要求,但是如果系统响应时间不能满足,不会导致系统出现致命的错误或崩溃。(如多媒体应用系统) 77 | 78 | **实时系统的特性:** 79 | 80 | + **实时性**:系统产生的结果在时间上有严格的要求,只有符合时间要求产生的结果才是正确的; 81 | + **并行性**:如果系统有多个输入时,要求系统具有并行处理能力,能同时响应多个输入信号。 82 | + **可预测性**:结果产生时间和产生范围都是可预测的。 83 | + **可靠性**:即系统的正确性和健壮性。 84 | + **专用性**:不同应用的实时系统在结构设计上都是不同的。 85 | 86 | (3)按嵌入式系统的复杂程度分类 87 | 88 | + 小型嵌入式系统 89 | + 中型嵌入式系统 90 | + 复杂嵌入式系统 91 | 92 | ## 嵌入式系统的特点 93 | 94 | 嵌入式系统特别强调“**量身定做**”的原则,开发人员往往需要针对某一种特殊用途开发出一个截然不同的嵌入式系统来,所以我们很难不经过“大量”修改而直接将一个嵌入式系统全套用到其他的嵌入式产品上去。 95 | 96 | **“嵌入性”、“专用性”与“计算机系统”**是**嵌入式系统的三个基本要素**。对象系统则是指嵌入式系统所嵌入的宿主系统。嵌入式系统的特点是由三个基本要素衍生出来的。不同的嵌入式系统其特点会有所差异。 97 | 98 | + 与“嵌入性”的相关特点:由于是嵌入到对象系统中,必须满足对象系统的环境要求,如物理环境(小型)、电气/环境(可靠)、成本(价廉)等要求。 99 | 100 | + 与“专用性”的相关特点:软、硬件的裁剪性;满足对象要求的最小软、硬件配置等。 101 | + 与“计算机系统”的相关特点:具有计算机的一般特点,有CPU、存储器、IO接口、通信接口、人机接口等各种硬件组件。计算机的具体功能由软件来实现。可以具有操作系统。 102 | 103 | 嵌入式系统的硬件组成如下: 104 | 105 | ![嵌入式系统的硬件组成](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221107115754270.png) 106 | 107 | 嵌入式处理器种类有1000多种,流行的体系结构有30多个系列,数据总线宽度从8位到32位,处理速度为0.1——2000MIPS(MIPS——每秒百万条指令) 108 | 109 | 与通用的计算机系统化相比,嵌入式系统具有以下显著特点。 110 | 111 | + **系统内核小** 112 | + **专用性强** 113 | + **运行环境差异大** 114 | + **可靠性要求高** 115 | + **系统精简和高实时性操作系统** 116 | + **具有固化在非易失性存储器中的代码** 117 | + **嵌入式系统开发工作和环境** 118 | 119 | 120 | 121 | 参考文献: 122 | 123 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 124 | 125 | 126 | 127 | [返回首页](https://github.com/timerring/hardware-tutorial) 128 | -------------------------------------------------------------------------------- /FPGA-tutorial/F09 - Simulation and Verification of Logic Functions.md: -------------------------------------------------------------------------------- 1 | - [逻辑功能的仿真与验证](#逻辑功能的仿真与验证) 2 | - [例:2选1数据选择器的测试模块](#例2选1数据选择器的测试模块) 3 | - [测试激励块(TB)与设计块(Design Block)之间的关系](#测试激励块tb与设计块design-block之间的关系) 4 | - [仿真过程简介](#仿真过程简介) 5 | - [ModelSim仿真软件的使用](#modelsim仿真软件的使用) 6 | 7 | 8 | # 逻辑功能的仿真与验证 9 | 10 | HDL产生的最初动因就是为了能够模拟硬件系统,可以分析系统的性能,验证其功能是否正确。 11 | 12 | 要测试一个设计块是否正确,就要用Verilog再写一个测试模块(Test Bench)。这个测试模块应包括以下三个方面的内容: 13 | 14 | + 测试模块中要调用到设计块,只有这样才能对它进行测试; 15 | + 测试模块中应包含测试的激励信号源; 16 | + 测试模块能够实施对输出信号的检测,并报告检测结果; 17 | 18 | 写出测试模块的过程又称为搭建测试平台(Test Bench) 19 | 20 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230126094005962.png) 21 | 22 | ## 例:2选1数据选择器的测试模块 23 | 24 | ``` 25 | module test_mux; 26 | reg a,b,s; 27 | wire out; 28 | 29 | mux2to1 u1(out, a, b, s); 30 | initial 31 | begin 32 | a=0; b=1; s=0; 33 | #10 a=1; b=1; s=0; 34 | #10 a=1; b=0; s=0; 35 | #10 a=1; b=0; s=1; 36 | #10 a=1; b=1; s=1; 37 | #10 a=0; b=1; s=1; 38 | #10 $finish; 39 | end 40 | initial 41 | $monitor($time, “a=%b b=%b s=%b out=%b”, a,b,s,out); 42 | endmodule 43 | ``` 44 | 45 | ``` 46 | module mux2to1(out,a,b,sel); 47 | output out; 48 | input a,b,sel; 49 | wire selnot,a1,b1; 50 | not (selnot, sel); 51 | and (a1, a, selnot); 52 | and (b1, b, sel); 53 | or (out1, a1, b1); 54 | endmodule 55 | ``` 56 | 57 | ``` 58 | 59 | 0 a=0 b=1 s=0 out=0 60 | 10 a=1 b=1 s=0 out=1 61 | 20 a=1 b=0 s=0 out=1 62 | 30 a=1 b=0 s=1 out=0 63 | 40 a=1 b=1 s=1 out=1 64 | 50 a=0 b=1 s=1 out=1 65 | ``` 66 | 67 | ## 测试激励块(TB)与设计块(Design Block)之间的关系 68 | 69 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230126094142053.png) 70 | 71 | 仿真时,信号线a、b、s上要加一组测试激励信号,这组激励信号的产生,是通过initial内部的过程语句产生的,而过程语句只能给reg型变量赋值。 72 | 73 | 仿真时,信号线a、b、s上的激励信号是不能消失的,需要有“寄存”效应,能够描述这种“寄存”行为的,只能是reg型。 74 | 75 | 端口连接时有关变量数据类型的一些规定 76 | 77 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230126094207435.png) 78 | 79 | ## 仿真过程简介 80 | 81 | 使用软件ModelSim-Altera 6.5b Starter Edition 进行仿真验证的大致过程 82 | 83 | ![](../AppData/Roaming/Typora/typora-user-images/image-20230126094703361.png) 84 | 85 | ## ModelSim仿真软件的使用 86 | 87 | + 创建一个工作目录 88 | + 输入源文件 89 | + 建立工作库 90 | 91 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230126094804150.png) 92 | 93 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230126094807164.png) 94 | 95 | 编译设计文件 96 | 97 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230126095052433.png) 98 | 99 | 装入设计文件到仿真器 100 | 101 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230126095100369.png) 102 | 103 | 运行仿真器 104 | 105 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230126095115577.png) 106 | 107 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230126095129330.png) 108 | 109 | 110 | 111 | 参考文献: 112 | 113 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 114 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 115 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 116 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 117 | 118 | 119 | 120 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A13 - ARM memory organization, coprocessor and on-chip bus.md: -------------------------------------------------------------------------------- 1 | - [ARM存储器组织、协处理器及片上总线](#arm存储器组织协处理器及片上总线) 2 | - [ARM存储器组织](#arm存储器组织) 3 | - [ARM存储数据类型和存储格式](#arm存储数据类型和存储格式) 4 | - [ARM的存储器层次简介](#arm的存储器层次简介) 5 | - [存储器管理单元MMU](#存储器管理单元mmu) 6 | - [ARM协处理器](#arm协处理器) 7 | - [ARM片上总线AMBA](#arm片上总线amba) 8 | 9 | 10 | # ARM存储器组织、协处理器及片上总线 11 | 12 | ## ARM存储器组织 13 | 14 | ### ARM存储数据类型和存储格式 15 | 16 | ARM处理器支持以下6种数据类型 17 | 18 | + 8位有符号和无符号字节。 19 | + 16位有符号和无符号半字,它们以两字节的边界定位。 20 | + 32位有符号和无符号字,它们以4字节的边界定位。 21 | 22 | 存储器组织 23 | 24 | 在以字节为单位寻址的存储器中有“小端”和“大端”两种方式存储字,这两种方式是根据最低有效字节与相邻较高有效字节相比是存放在较低的还是较高的地址来划分的,两种存储方式如图所示。 25 | 26 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221213105428057.png) 27 | 28 | ### ARM的存储器层次简介 29 | 30 | + 寄存器组 : 存储器层次的顶层,典型为32个32位寄存器,访问时间为几个ns 31 | 32 | + 片上RAM :和片上寄存器组具有同级的读写速度。成本较高。 33 | 34 | + 片上Cache :容量为8~32KB,访问时间大概为10ns。 35 | 36 | + 主存储器 :可能在几兆到1G的动态存储器。访问时间大约50ns。 37 | 38 | + 硬盘:后援存储器,容量从几百兆到几十GB,访问时间为几十ms。 39 | 40 | > 嵌入式系统通常没有硬盘,因此也不采用页方式,但是许多嵌入式系统采用cache,ARM CPU采用了多种Cache结构。 41 | 42 | ### 存储器管理单元MMU 43 | 44 | 在复杂的嵌入式系统设计时,越来越多的会选用带有存储管理单元(MMU)的微处理器芯片。 45 | 46 | MMU完成的主要功能有: 47 | 48 | + 将主存地址从虚拟存储空间映射到物理存储空间。 49 | + 存储器访问权限控制。 50 | + 设置虚拟存储空间的缓冲特性等。 51 | 52 | 虚拟地址存储系统示意图 53 | 54 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221213105604420.png) 55 | 56 | ## ARM协处理器 57 | 58 | ARM通过增加硬件协处理器来支持对其指令集的通用扩展,通过未定义指令陷阱支持这些协处理器的软件仿真。简单的ARM核提供板级协处理器接口,因此协处理器可以作为一个独立的元件接入。 59 | 60 | 最常使用的协处理器是用于控制片上功能的系统协处理器,例如控制ARM720上的高速缓存Cache和存储器管理单元MMU等。ARM也开发了浮点协处理器,也可以支持其它的片上协处理器。ARM体系结构支持通过增加协处理器来扩展指令集的机制。 61 | 62 | ## ARM片上总线AMBA 63 | 64 | IC设计方法从以功能设计为基础转变到了以功能整合为基础。 65 | 66 | + SoC设计以IP的设计复用和功能组装、整合来完成。SoC设计的重点是系统功能的分析与划分、软硬件的功能划分,IP的选择与使用,多层次验证环境和外界设计咨询服务等。 67 | + 片上总线OCB(On-Chip Bus)使得片上不同IP核的连接实现标准化。 68 | + 3种总线标准:IBM的CoreConnect、ARM的AMBA(Advanced Microcontroller Bus Architecture)和Silicore的Wishbone。 69 | 70 | **一个微处理器系统可能含有多条总线** 71 | 72 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221213105742102.png) 73 | 74 | 原因: 75 | 76 | + 数据宽度:高速总线通常提供较宽的数据连接。 77 | + 成本:高速总线通常采用更昂贵的电路和连接器。 78 | + 桥允许总线独立操作,这样在I/O操作中可提供某些并行性。 79 | 80 | 多总线系统 81 | 82 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221213105907415.png) 83 | 84 | 85 | 86 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221213105827064.png) 87 | 88 | 嵌入式系统总线 89 | 90 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221213105946527.png) 91 | 92 | ARM片上总线AMBA 93 | 94 | + AMBA是ARM公司公布的总线标准,AMBA定义了3种总线: 95 | + ASB(Advanced System Bus):是目前ARM常用的系统总线,用于连接高性能系统模块,它支持突发数据传输模式。 96 | + AHB(Advanced High-performance Bus):用于连接高性能系统模块。它支持突发数据传输方式及单个数据传输方式,所有时序参考同一个时钟沿。在高性能ARM系统(如:ARM1020E)中,AHB有逐步取代ASB的趋势。 97 | + APB(Advance Peripheral Bus):是一个简单接口支持低性能的外围接口。 98 | 99 | 通过AMBA组成的系统如下图所示: 100 | 101 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221213110037954.png) 102 | 103 | 基于AMBA总线的典型系统 104 | 105 | AMBA总线 - S3C44b0X 106 | 107 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221213110104645.png) 108 | 109 | 110 | 111 | 参考文献: 112 | 113 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 114 | 115 | 116 | 117 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /FPGA-tutorial/F17 - Fundamentals of Sequential Circuit Modeling.md: -------------------------------------------------------------------------------- 1 | - [时序电路建模基础](#时序电路建模基础) 2 | - [阻塞型赋值语句与非阻塞型赋值语句](#阻塞型赋值语句与非阻塞型赋值语句) 3 | - [赋值运算符](#赋值运算符) 4 | - [过程赋值语句有阻塞型和非阻塞型](#过程赋值语句有阻塞型和非阻塞型) 5 | - [阻塞型过程赋值与非阻塞型过程赋值](#阻塞型过程赋值与非阻塞型过程赋值) 6 | - [事件控制语句](#事件控制语句) 7 | - [电平敏感事件(如锁存器)](#电平敏感事件如锁存器) 8 | - [边沿敏感事件(如触发器)](#边沿敏感事件如触发器) 9 | 10 | 11 | # 时序电路建模基础 12 | 13 | Verilog行为级描述用关键词initial或always,但initial是面向仿真,不能用于逻辑综合。always是无限循环语句,其用法为:                                    14 | 15 | ```verilog 16 | always@(事件控制表达式(或敏感事件表)) 17 |  begin  18 |  块内局部变量的定义; 19 |  过程赋值语句; 20 | end              21 | ``` 22 | 23 | ## 阻塞型赋值语句与非阻塞型赋值语句 24 | 25 | 在always语句内部的过程赋值语句有两种类型: 26 | 27 | + 阻塞型赋值语句(Blocking Assignment Statement) 28 | + 非阻塞型赋值语句(Non-Blocking Assignment Statement) 29 | 30 | ### 赋值运算符 31 | 32 | 赋值运算符(=) :阻塞型过程赋值算符 33 | 34 | + 前一条语句没有完成赋值过程之前,后面的语句不可能被执行。 35 | 36 | 赋值运算符(<=) :非阻塞型过程赋值算符 37 | 38 | + 一条非阻塞型赋值语句的执行,并不会影响块中其它语句的执行。 39 | 40 | ### 过程赋值语句有阻塞型和非阻塞型 41 | 42 | 阻塞型用“=”表示,多条语句顺序执行。 43 | 44 | ```verilog 45 | begin 46 | B = A; 47 | C = B+1; 48 | end 49 | ``` 50 | 51 | 非阻塞型用“<=”表示,语句块内部的语句并行执行。 52 | 53 | ```verilog 54 | begin 55 | B <= A; 56 | C <= B+1; 57 | end 58 | ``` 59 | 60 | ### 阻塞型过程赋值与非阻塞型过程赋值 61 | 62 | ```verilog 63 | //Blocking (=) 64 | initial 65 | begin 66 | #5 a = b; 67 | #10 c = d; 68 | end 69 | ``` 70 | 71 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202123338646.png) 72 | 73 | ```verilog 74 | //Nonblocking (<=) 75 | initial 76 | begin 77 | #5 a <= b; 78 | #10 c <= d; 79 | end 80 | ``` 81 | 82 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230202123435063.png) 83 | 84 | 注意: 85 | 86 | + 在可综合的电路设计中,一个语句块的内部不允许同时出现阻塞型赋值语句和非阻塞型赋值语句。 87 | + 在组合电路的设计中,建议采用阻塞型赋值语句。 88 | + 在时序电路的设计中,建议采用非阻塞型赋值语句。 89 | 90 | ## 事件控制语句 91 | 92 | 用always语句描述硬件电路的逻辑功能时,在always语句中@符号之后紧跟着“事件控制表达式”。 93 | 94 | 逻辑电路中的敏感事件通常有两种类型:电平敏感事件和边沿触发事件。 95 | 96 | 在组合逻辑电路和锁存器中,输入信号电平的变化通常会导致输出信号变化,在Verilog HDL中,将这种输入信号的电平变化称为电平敏感事件。 97 | 98 | 在同步时序逻辑电路中,触发器状态的变化仅仅发生在时钟脉冲的上升沿或下降沿,Verilog HDL中用关键词posedge(上升沿)和 negedge(下降沿)进行说明,这就是边沿触发事件。 99 | 100 | 敏感事件分为电平敏感事件和边沿触发事件 101 | 102 | ### 电平敏感事件(如锁存器) 103 | 104 | ```verilog 105 | always@(sel or a or b) 106 | always@(sel,a,b) 107 | ``` 108 | 109 | sel、a、b中任意一个电平发生变化,后面的过程赋值语句将执行一次。 110 | 111 | ### 边沿敏感事件(如触发器) 112 | 113 | ```verilog 114 |  always@(posedge CP or negedge CR) 115 | ``` 116 | 117 | CP的上升沿或CR的下降沿来到,后面的过程语句就会执行。 118 | 119 | 在always后面的边沿触发事件中,有一个事件必须是时钟事件,还可以有多个异步触发事件,多个触发事件之间用关键词 or 进行连接,例如,语句 120 | 121 | ```verilog 122 | always @ (posedge CP or negedge Rd_ or negedge Sd_) 123 | ``` 124 | 125 | 在Verilog 2001标准中,可以使用逗号来代替or。例如, 126 | 127 | ```verilog 128 | always @ (posedge CP, negedge Rd_, negedge Sd_) 129 | ``` 130 | 131 | `posedge CP` 是时钟事件, `negedge Rd_`和`negedge Sd_`是异步触发事件。如果没有时钟事件,只有异步事件,就会出现语法错误。 132 | 133 | 134 | 135 | 参考文献: 136 | 137 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 138 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 139 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 140 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 141 | 142 | 143 | 144 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A10 - ARM working mode and register organization.md: -------------------------------------------------------------------------------- 1 | - [ARM的工作模式与寄存器组织](#arm的工作模式与寄存器组织) 2 | - [特权模式](#特权模式) 3 | - [处理器启动时的模式转换图](#处理器启动时的模式转换图) 4 | - [ARM的寄存器组织](#arm的寄存器组织) 5 | - [ARM寄存器组成概述](#arm寄存器组成概述) 6 | - [ARM状态下的寄存器组织](#arm状态下的寄存器组织) 7 | - [Thumb状态下的寄存器组织](#thumb状态下的寄存器组织) 8 | 9 | 10 | # ARM的工作模式与寄存器组织 11 | 12 | CPSR(当前程序状态寄存器)的低5位用于定义当前操作模式 , 如图示 13 | 14 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221210105218688.png) 15 | 16 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221210105230923.png) 17 | 18 | ## 特权模式 19 | 20 | 除用户模式外的其他6种模式称为特权模式。 特权模式中除系统模式以外的5种模式又称为异常模式,即 21 | 22 | + FIQ(Fast Interrupt Request) 23 | + IRQ(Interrupt ReQuest) 24 | + SVC(Supervisor) 25 | + 中止(Abort) 26 | + 未定义(Undefined) 27 | 28 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221210105305508.png) 29 | 30 | 大多数应用程序在用户模式下执行,当处理器工作在用户模式时,正在执行的程序不能访问某些被保护的系统资源,也不能改变模式,除非异常发生,这允许操作系统来控制系统资源的使用。 31 | 32 | 当特定的异常出现时,进入相应的模式,每种模式都有某些附加的寄存器,以避免异常出现时,用户模式的状态不可靠。 33 | 34 | 不能由任何异常模式进入系统模式,它与用户模式有完全相同的寄存器,并且它是特权模式,不受任何用户模式的限制。它供需要访问系统资源的操作系统任务使用,但避免了使用与异常模式有关的附加寄存器,这就使得当任何异常出现时,都不会使任务的状态不可靠。 35 | 36 | ### 处理器启动时的模式转换图 37 | 38 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221210105339073.png) 39 | 40 | ## ARM的寄存器组织 41 | 42 | ### ARM寄存器组成概述 43 | 44 | ARM处理器总共有37个寄存器,可以分为以下两类寄存器 45 | 46 | 31个通用寄存器(包括程序计数器PC) 47 | 48 | + R0~R15(PC); 49 | + R13_svc、R14_svc; 50 | + R13_abt、R14_abt; 51 | + R13_und、R14_und; 52 | + R13_irq、R14_irq; 53 | + R8_frq-R14_frq。 54 | 55 | 6个状态寄存器 56 | 57 | + CPSR;SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq和SPSR_fiq 58 | 59 | ### ARM状态下的寄存器组织 60 | 61 | 1. ARM状态的寄存器简介 62 | 63 | ARM状态下的寄存器组织 64 | 65 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221210105606233.png) 66 | 67 | 2) ARM状态的通用寄存器 68 | 69 | **不分组寄存器**(The unbanked registers):R0~R7 70 | 71 | **分组寄存器**(The banked registers):R8~R14 72 | 73 | **程序计数器**:R15(PC) 74 | 75 | **不分组寄存器R0~R7** 76 | 77 | R0~R7是不分组寄存器。这意味着在所有处理器模式下,它们每一个都访问的是同一个物理寄存器。它们是真正并且在每种状态下都统一的通用寄存器。 78 | 79 | 未分组寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未分组寄存器,但必须注意对同一寄存器在不同模式下使用时的数据保护 80 | 81 | **分组寄存器R8-R14** 82 | 83 | + 分组寄存器R8-R12 84 | FIQ模式分组寄存器R8~R12 85 | FIQ以外的分组寄存器R8~R12 86 | + 分组寄存器R13、R14 87 | 寄存器R13通常用做堆栈指针SP 88 | 寄存器R14用作子程序链接寄存器(Link Register-LR),也称为LR 89 | 90 | **程序计数器R15** 91 | 92 | + 寄存器R15被用作程序计数器,也称为PC 93 | + R15值的改变将引起程序执行顺序的变化,这有可能引起程序执行中出现一些不可预料的结果 94 | + ARM处理器采用多级流水线技术,因此保存在R15的程序地址并不是当前指令的地址 95 | + 一些指令对于R15的用法有一些特殊的要求 96 | 97 | 3) ARM程序状态寄存器 98 | 99 | + 所有处理器模式下都可以访问当前的程序状态寄存器CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其它状态和控制信息。 100 | + 在每种异常模式下都有一个对应的物理寄存器——程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。 101 | + CPSR和SPSR的格式 102 | + ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221210110023317.png) 103 | 104 | ### Thumb状态下的寄存器组织 105 | 106 | Thumb状态下的寄存器集是ARM状态下寄存器集的子集。程序员可以直接访问8个通用的寄存器(R0~R7),程序计数器PC、堆栈指针SP、连接寄存器LR和当前状态寄存器CPSP。每一种特权模式都各有一组SP,LR和SPSR。 107 | 108 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221210110105606.png) 109 | 110 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221210110125204.png) 111 | 112 | 113 | 114 | 参考文献: 115 | 116 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 117 | 118 | 119 | 120 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A31 - ARM assembler control pseudo-ops.md: -------------------------------------------------------------------------------- 1 | - [ARM 汇编控制伪操作](#arm-汇编控制伪操作) 2 | - [IF、ELSE、ENDIF](#ifelseendif) 3 | - [语法格式](#语法格式) 4 | - [使用示例](#使用示例) 5 | - [WHILE、WEND](#whilewend) 6 | - [语法格式](#语法格式-1) 7 | - [使用示例](#使用示例-1) 8 | - [MACRO、MEND](#macromend) 9 | - [语法格式](#语法格式-2) 10 | - [语法格式](#语法格式-3) 11 | - [宏的定义体](#宏的定义体) 12 | - [MEXIT](#mexit) 13 | - [语法格式](#语法格式-4) 14 | 15 | 16 | # ARM 汇编控制伪操作 17 | 18 | 1. IF、ELSE、ENDIF条件编译伪操作 19 | 2. WHILE、WEND条件编译伪操作 20 | 3. MACRO、MEND宏定义伪操作 21 | 4. MEXIT宏退出伪操作 22 | 23 | ## IF、ELSE、ENDIF 24 | 25 | ### 语法格式 26 | 27 | ```assembly 28 | IF 逻辑表达式 29 | 指令序列 1 30 | ELSE 31 | 指令序列 2 32 | ENDIF 33 | ``` 34 | 35 | IF 、 ELSE 、 ENDIF 伪操作能根据条件的成立与否决定是否执行某个指令序列。当 IF 后面的逻辑表达式为真,则执行指令序列 1 ,否则执行指令序列 2 。其中, ELSE 及指令序列 2 可以没有,此时,当 IF 后面的逻辑表达式为真,则执行指令序列 1 ,否则继续执行后面的指令。 36 | 37 | IF 、 ELSE 、 ENDIF 伪操作可以嵌套使用。 38 | 39 | ### 使用示例 40 | 41 | ```assembly 42 | GBLL Test ;声明一个全局的逻辑变量,变量名为 Test…… 43 | IF Test = TRUE 44 | 指令序列 1 45 | ELSE 46 | 指令序列 2 47 | ENDIF 48 | ``` 49 | 50 | ## WHILE、WEND 51 | 52 | ### 语法格式 53 | 54 | ```assembly 55 | WHILE 逻辑表达式 56 | 指令序列 57 | WEND 58 | ``` 59 | 60 | WHILE 、 WEND 伪操作能根据条件的成立与否决定是否循环执行某个指令序列。当 WHILE 后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。 61 | 62 | WHILE 、 WEND 伪指令可以嵌套使用。 63 | 64 | ### 使用示例 65 | 66 | ```assembly 67 | GBLA Counter ;声明一个全局的数学变量,变量名为 Counter 68 | Counter SETA 3 ;由变量Counter 控制循环次数 69 | …… 70 | WHILE Counter < 10 71 | 指令序列 72 | WEND 73 | ``` 74 | 75 | ## MACRO、MEND 76 | 77 | ### 语法格式 78 | 79 | ```assembly 80 | $ 标号 宏名 $ 参数 1 , $ 参数 2 ,…… 81 | 指令序列 82 | MEND 83 | ``` 84 | 85 | MACRO 、 MEND 伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码。其中, \$ 标号在宏指令被展开时,标号会被替换为用户定义的符号, 宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。 86 | 87 | 宏指令的使用方式和功能与子程序有些相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了系统的开销,因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序。 88 | 89 | 包含在 MACRO 和 MEND 之间的指令序列称为宏定义体,在宏定义体的第一行应声明宏的原型(包含宏名、所需的参数),然后就可以在汇编程序中通过宏名来调用该指令序列。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数。 90 | 91 | MACRO 、 MEND 伪操作可以嵌套使用。 92 | 93 | MACRO伪操作标识宏定义的开始,MEND标识宏定义的结束。用MACRO和MEND定义的一段代码,称为宏定义体,这样在程序中就可以通过宏名多次调用该代码段来完成相应的功能。 94 | 95 | ### 语法格式 96 | 97 | ```assembly 98 | MACRO 99 | {$label} macroname {$parameter{,$parameter}…} 100 | … ;宏代码 101 | MEND 102 | ``` 103 | 104 | `macroname`为所定义的宏的名称;`$label`在宏指令被展开时,label可被替换成相应的符号,通常是一个标号。(在一个符号前使用\$表示程序被汇编时将使用相应的值来替代\$后的符号);`$parameter`为宏指令的参数,当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数。可以在宏定义时为参数指定相应的默认值。 105 | 106 | ### 宏的定义体 107 | 108 | ```assembly 109 | MACRO 110 | $PM DELAY $CanShu 111 | $PM 112 | LDR R7,=$CanShu ; 113 | ;LDR R7,[R7] ;此时参数是一个立即数 如果是变量的话 是会用到这一句 114 | $PM.LOOP 115 | SUBS R7,R7,#0X01 116 | BNE $PM.LOOP 117 | MEND 118 | 119 | 在程序段中的使用:(使用两次) 120 | ... 121 | AA DELAY 0X000005F0 122 | ... 123 | BB DELAY 0X00000FF0 124 | ... 125 | ``` 126 | 127 | 此时调用多次,编译器就不会出现问题,例子中的AA和BB仅仅是一个标号,用户可以自行书写,因为在宏指令呗展开时,这个符号在汇编时将使用相应的值替代0x00000FF0是一个参数 在此处是一个立即数,用户可自行使用为变量等。 128 | 129 | ## MEXIT 130 | 131 | ### 语法格式 132 | 133 | ```assembly 134 | MEXIT 135 | ``` 136 | 137 | MEXIT 用于从宏定义中跳转出去。 138 | 139 | 如: 140 | 141 | ```assembly 142 | MACRO 143 | $abc macroabc $param1, $param2 144 | ;code 145 | WHILE condition1 146 | ;code 147 | IF condition2 148 | ;code 149 | MEXIT ;<----直接退出宏 150 | ELSE 151 | ;code 152 | ENDIF 153 | WEND 154 | ``` 155 | 156 | 157 | 158 | 159 | 参考文献: 160 | 161 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 162 | 163 | 164 | 165 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A25 - Summary of ARM coprocessor instructions.md: -------------------------------------------------------------------------------- 1 | - [ARM协处理器指令总结](#arm协处理器指令总结) 2 | - [(一)协处理器的数据操作](#一协处理器的数据操作) 3 | - [二进制编码](#二进制编码) 4 | - [汇编格式](#汇编格式) 5 | - [(二)协处理器的数据存取](#二协处理器的数据存取) 6 | - [二进制编码](#二进制编码-1) 7 | - [汇编格式](#汇编格式-1) 8 | - [(三)协处理器的寄存器传送](#三协处理器的寄存器传送) 9 | - [二进制编码](#二进制编码-2) 10 | - [汇编格式](#汇编格式-2) 11 | - [未使用的指令空间](#未使用的指令空间) 12 | 13 | 14 | # ARM协处理器指令总结 15 | 16 | ARM支持16个协处理器,用于各种协处理器操作,最常使用的协处理器是用于控制片上功能的系统协处理器,例如控制ARM720上的高速缓存和存储器管理单元等,也开发了浮点ARM协处理器,还可以开发专用的协处理器。 17 | 18 | 当一个协处理器硬件不能执行属于它的协处理器指令时,将产生未定义指令异常中断。利用该异常中断处理程序可以软件模拟该硬件操作。 19 | 20 | ARM协处理器指令根据其用途主要分为以下三类: 21 | 22 | + 用于ARM处理器初始化协处理器数据操作指令; 23 | + 用于ARM寄存器与协处理器间的数据传送指令; 24 | + 用于协处理器寄存器和内存单元间的数据传送指令。 25 | 26 | ## (一)协处理器的数据操作 27 | 28 | 协处理器数据操作完全是协处理器内部的操作,它完成协处理器寄存器的状态改变。如:在符点协处理器中2个寄存器相加,结果放在第3个寄存器。 29 | 30 | ### 二进制编码 31 | 32 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221226095222876.png) 33 | 34 | ARM对可能存在的任何协处理器提供这条指令。如果它被一个协处理器接受,则ARM继续执行下一条指令,如果它没有被接受,则将产生一个未定义中止异常中断。通常与协处理器号CP#一致的协处理器将接受指令。 35 | 36 | 协处理器执行由Cop1和Cop2域定义的操作,使用CRn和CRm作为源操作数,并将结果放到CRd。其中,Cop1和Cop2为协处理器操作码,CRn、CRm和CRd均为协处理器的寄存器。指令中不涉及ARM处理器的寄存器和存储器。 37 | 38 | ### 汇编格式 39 | 40 | ```assembly 41 | CDP{} , , CRd, CRn, CRm{,} 42 | ``` 43 | 44 | 举例: 45 | 46 | ```assembly 47 | CDP p5,2,C12,C10,C3,4 ;协处理器p5的操作初始化, 48 | ; 其中操作码1为2,操作码2 49 | ; 为4,目标寄存器为C12,源 50 | ; 操作寄存器为C10和C3 51 | ``` 52 | 53 | 注:这里Cop1、CRn、CRd、Cop2和CRm域的解释与协处理器有关。 54 | 55 | ## (二)协处理器的数据存取 56 | 57 | 协处理器数据传送指令从存储器读取数据装入协处理器寄存器,或将协处理器寄存器的数据存入存储器。因为协处理器可以支持它自己的数据类型,因此,每个寄存器传送的字数与协处理器有关。ARM产生存储器地址,但协处理器控制传送字数。 58 | 59 | ### 二进制编码 60 | 61 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221226095301821.png) 62 | 63 | 存储器地址计算在ARM内进行,使用ARM基址和8位立即数偏移量进行计算,8位立即数左移2位产生字偏移。 64 | 65 | 数据由CRd提供或者接受,由协处理器来控制存取字数,N位控制从2种可能长度中选择一种。 66 | 67 | ### 汇编格式 68 | 69 | 前变址格式: 70 | 71 | ```assembly 72 | LDC|STC{}{L} ,CRd,[Rn ]{!} 73 | ``` 74 | 75 | 后变址格式: 76 | 77 | ```assembly 78 | LDC|STC{}{L} ,CRd,[Rn], 79 | ``` 80 | 81 | > 注: 82 | > L标志表明选择长数据类型(N=1)。 83 | > 是#±<8位立即数> 84 | 85 | 举例: 86 | 87 | ```assembly 88 | LDC p6,C0,[R1] 89 | STCEQL p5,C1,[R0],#4 90 | ``` 91 | 92 | 注意事项: 93 | 94 | + N和CRd域的解释与协处理器有关。 95 | + 如果地址不是字对齐的,则最后2位将忽略,有些ARM系统有可能产生异常。 96 | + 存取字数由协处理器控制,ARM将连续产生后续地址,直到协处理器指示存取结束为止。在数据存取的过程中,ARM将不响应中断请求。因此,为了防止存取过长的数据影响系统的中断响应时间,将最大存取长度限制到16个字。 97 | 98 | ## (三)协处理器的寄存器传送 99 | 100 | 在ARM和协处理器寄存器之间传送数据有时是有用的。这些协处理寄存器传送指令使得协处理器中产生的整数能直接传送到ARM寄存器或者影响ARM条件码标志位。典型用法是: 101 | 102 | 浮点FIX操作,它把整数返回到ARM的一个寄存器。 103 | 104 | 浮点比较,把比较的结果返回到ARM条件码标志位 105 | 106 | 从ARM寄存器中取一个整数,并传送给协处理器,在那里转换成浮点表示,并装入协处理器寄存器进行处理。 107 | 108 | 在一些较复杂的ARM CPU中,常使用系统控制协处理器来控制Cache和MMU功能。这类协处理器一般使用这些指令来访问和修改片上的控制寄存器。 109 | 110 | ### 二进制编码 111 | 112 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221226095403806.png) 113 | 114 | 协处理器执行由Cop1和Cop2域定义的操作,使用CRn和CRm作为源操作数,并将32位整数结果返回到ARM,ARM再把它放到Rd。其中,Cop1和Cop2为协处理器操作码,CRn、CRm为协处理器的寄存器。 115 | 116 | 如果在从协处理器读取数据的指令中将PC定义为目的寄存器Rd,则由协处理器产生32位整数的最高4位将被放在CPSR中的N、Z、C和V标志位。 117 | 118 | ### 汇编格式 119 | 120 | (1)从协处理器传送到ARM寄存器: 121 | 122 | ```assembly 123 | MRC{} ,Rd,CRn,CRm{,} 124 | ``` 125 | 126 | (2)从ARM寄存器传送到协处理器: 127 | 128 | ```assembly 129 | MCR{} ,Rd,CRn,CRm{,} 130 | ``` 131 | 132 | 举例: 133 | 134 | ```assembly 135 | MCR p14,3,R0,C1,C2 136 | MRCCS p2,4,R3,C3,C4,6 137 | ``` 138 | 139 | ## 未使用的指令空间 140 | 141 | ARM 32位指令编码并没有全部都做了定义,还有一些未使用的编码可以用来将来扩展指令集。并且算术运算指令、控制指令,Load/Store指令、协处理器指令等都有预留空间。 142 | 143 | 144 | 145 | 参考文献: 146 | 147 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 148 | 149 | 150 | 151 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A34 - What is ATPCS.md: -------------------------------------------------------------------------------- 1 | - [什么是ATPCS](#什么是atpcs) 2 | - [ATPCS介绍](#atpcs介绍) 3 | - [寄存器的使用规则](#寄存器的使用规则) 4 | - [ATPCS中各寄存器的使用规则及其名称](#atpcs中各寄存器的使用规则及其名称) 5 | - [数据栈使用规则](#数据栈使用规则) 6 | - [参数传递规则](#参数传递规则) 7 | - [参数个数固定的子程序参数传递规则](#参数个数固定的子程序参数传递规则) 8 | - [参数个数可变的子程序参数传递规则](#参数个数可变的子程序参数传递规则) 9 | - [子程序结果返回规则](#子程序结果返回规则) 10 | 11 | 12 | # 什么是ATPCS 13 | 14 | ## ATPCS介绍 15 | 16 | ATPCS(ARM-Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。 17 | 18 | ### 寄存器的使用规则 19 | 20 | 子程序间通过寄存器R0~R3来传递参数,这时,寄存器R0~R3可以记作A1~A4。被调用的子程序在返回前无需恢复寄存器R0~R3的内容; 21 | 22 | 在子程序中,使用寄存器R4~R11来保存局部变量。这时,寄存器 R4~R11可以记作V1~V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量; 23 | 24 | 寄存器R12用作子程序间的scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip(Intra-Procedure-call Scratch Register;内部程序调用暂存寄存器)。在子程序间的连接代码段中常有这种使用规则; 25 | 26 | 寄存器R13用作数据栈指针,记作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等; 27 | 28 | 寄存器R14称为链接寄存器,记作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途; 29 | 30 | 寄存器R15是程序计数器,记作pc。它不能用作其他用途。 31 | 32 | #### ATPCS中各寄存器的使用规则及其名称 33 | 34 | | 寄存器 | 别名 | 特殊名 | 使用规则 | 35 | | ------ | ---- | ------ | ------------------------------------------------------------ | 36 | | R0 | a1 | | 参数/结果/scratch寄存器1 | 37 | | R1 | a2 | | 参数/结果/scratch寄存器2 | 38 | | R2 | a3 | | 参数/结果/scratch寄存器3 | 39 | | R3 | a4 | | 参数/结果/scratch寄存器4 | 40 | | R4 | v1 | | ARM状态局部变量寄存器1 | 41 | | R5 | v2 | | ARM状态局部变量寄存器2 | 42 | | R6 | v3 | | ARM状态局部变量寄存器3 | 43 | | R7 | v4 | wr | ARM状态局部变量寄存器4 Thumb状态工作寄存器 | 44 | | R8 | v5 | | ARM状态局部变量寄存器5 | 45 | | R9 | v6 | sb | ARM状态局部变量寄存器6, 在支持RWPI的ATPCS中为静态基址寄存器 | 46 | | R10 | v7 | sl | ARM状态局部变量寄存器7, 在支持数据栈检查的ATPCS中为数据栈限制指针 | 47 | | R11 | v8 | fp | ARM状态局部变量寄存器8/帧指针 | 48 | | R12 | | ip | 子程序内部调用的scratch寄存器 | 49 | | R13 | | sp | 数据栈指针 | 50 | | R14 | | lr | 连接寄存器 | 51 | | R15 | | pc | 程序计数器 | 52 | 53 | ### 数据栈使用规则 54 | 55 | 满(FULL)栈 56 | 57 | 当堆栈指针指向栈顶元素,即指向最后一个入栈的数据元素时 58 | 59 | 空(EMPTY)栈 60 | 61 | 当堆栈指针指向与栈顶元素相邻的一个可用数据单元时 62 | 63 | 递减(DESCENDING)堆栈 64 | 65 | 当数据栈向内存地址减小的方向增长时 66 | 67 | 递增(ASCENDING)堆栈 68 | 69 | 当数据栈向内存地址增加的方向增长时, 70 | 71 | + FD (Full Descending) 满递减 72 | + ED (Empty Descending)空递减 73 | + FA (Full Ascending) 满递增 74 | + EA (Empty Ascending) 空递增 75 | 76 | ATPCS规定数据栈为FD(满递减)类型。异常中断的处理程序可以使用中断程序的数据栈,但是要保证中断程序的数据栈足够大。 77 | 78 | ### 参数传递规则 79 | 80 | #### 参数个数固定的子程序参数传递规则 81 | 82 | 各个浮点参数按顺序处理; 83 | 84 | 为每个浮点参数分配FP寄存器。分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器。 85 | 第一个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递 86 | 87 | #### 参数个数可变的子程序参数传递规则 88 | 89 | 对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数; 90 | 91 | 在参数传递时,将所有参数看作是存放在连续的内存字单元中的字数据。然后,依次将各字数据传送到寄存器R0、Rl、R2、R3中,如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。 92 | 93 | ### 子程序结果返回规则 94 | 95 | 结果为一个32位的整数时,可以通过寄存器R0返回; 96 | 97 | 结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推; 98 | 99 | 结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或者s0来返回; 100 | 101 | 结果为复合型的浮点数(如复数)时,可以通过寄存器f0\~fn或者d0\~dn来返回。 102 | 103 | 对于位数更多的结果,需要通过内存来传递。 104 | 105 | 106 | 107 | 参考文献: 108 | 109 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 110 | 111 | 112 | 113 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A22 - SWP, MRS, MSR of exchange instruction.md: -------------------------------------------------------------------------------- 1 | - [交换指令之SWP,MRS,MSR](#交换指令之swpmrsmsr) 2 | - [存储器与寄存器交换指令(SWP)](#存储器与寄存器交换指令swp) 3 | - [二进制编码格式](#二进制编码格式) 4 | - [汇编格式](#汇编格式) 5 | - [举例](#举例) 6 | - [状态寄存器与通用寄存器之间的传送指令](#状态寄存器与通用寄存器之间的传送指令) 7 | - [MRS](#mrs) 8 | - [MRS的二进制编码](#mrs的二进制编码) 9 | - [汇编格式](#汇编格式-1) 10 | - [MSR](#msr) 11 | - [MSR的二进制编码](#msr的二进制编码) 12 | - [汇编格式](#汇编格式-2) 13 | 14 | 15 | # 交换指令之SWP,MRS,MSR 16 | 17 | ## 存储器与寄存器交换指令(SWP) 18 | 19 | 交换指令把字或无符号字节的读取和存储组合在了一条指令中。这种组合指令通常用于不能被外部其他存储器访问(如:DMA访问)打断的存储器操作。一般用于处理器之间或处理器与DMA控制器之间共享信息的互斥访问。 20 | 21 | ### 二进制编码格式 22 | 23 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221223093025077.png) 24 | 25 | ### 汇编格式 26 | 27 | ```assembly 28 | SWP{} {B} Rd,Rm,[Rn] 29 | ``` 30 | 31 | 本指令将存储器中地址为Rn处的字(B=0)或无符号字节(B=1)读入寄存器Rd,同时,将Rm中同样类型的数据存入存储器中相同的位置。Rd和Rm可以相同,但与Rn应该不同。另外,PC不能出现在该指令中。 32 | 33 | ### 举例 34 | 35 | ```assembly 36 | LDR R0,SEMAPHORE 37 | SWPB R1,R1,[R0] ;交换字节,将存储器单元[R0]中的字节数据读取到R1中,同时,将R1中的数据写入到存储器单元[R0]中 38 | SWP R1,R2,[R3]; 交换字数据,将存储单元[R3]中的字数据读取到R1中,同时,将R2中的数据写入到存储单元[R3]中。 39 | ``` 40 | 41 | ## 状态寄存器与通用寄存器之间的传送指令 42 | 43 | ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。 这两条指令分别是: 44 | 45 | + 状态寄存器到通用寄存器的传送指令(MRS) 46 | + 通用寄存器到状态寄存器的传送指令(MSR) 47 | 48 | ## MRS 49 | 50 | MRS指令用于将状态寄存器的内容传送到通用寄存器中,它主要用于以下3种场合: 51 | 52 | 1. 通过“读-修改-写”修改状态寄存器的内容。MRS用于将状态寄存器的内容读到通用寄存器中,以便修改。 53 | 2. 当异常中断允许嵌套时,需要在进入异常中断后,嵌套中断发生之前,保存当前处理器模式的SPSR。这是需要先通过MRS指令读出SPSR的值,然后用其他指令将SPSR的值保存起来。 54 | 3. 当进程切换时,也需要保存当前寄存器的值。 55 | 56 | ### MRS的二进制编码 57 | 58 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221223093156570.png) 59 | 60 | 这里R用来区分是将CPSR还是SPSR拷贝到目的寄存器Rd,全部32位都被拷贝。 61 | 62 | ### 汇编格式 63 | 64 | ```assembly 65 | MRS{} Rd,CPSR|SPSR 66 | ``` 67 | 68 | 举例: 69 | 70 | ```assembly 71 | MRS R0,CPSR ;将CPSR传送到R0 72 | MRS R3,SPSR ;将SPSR传送到R3 73 | ``` 74 | 75 | 注意事项: 76 | 77 | 不能通过该指令修改CPSR中的T控制位,直接将程序状态切换到Thumb状态,必须通过BX等指令实现程序状态切换。 78 | 79 | 在用户或系统模式下没有可以访问的SPSR,所以SPSR形式在这些模式下不能用。 80 | 81 | 当修改CPSR或SPSR时,必须注意保存所有未使用位的值。 82 | 这条指令不影响条件标志码。 83 | 84 | ## MSR 85 | 86 | ### MSR的二进制编码 87 | 88 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221223093247065.png) 89 | 90 | 操作数可以是一个寄存器Rm也可以是带循环移位的8位有效立即数,在域屏蔽的控制下传送到CPSR或SPSR。 91 | 92 | 域屏蔽控制PSR中4字节的更新,其中第16位控制PSR[7:0]是否更新,第17位控制PSR[15:8],第18位控制PSR[23:16],第19位控制PSR[31:24]。使用立即数时,只有PSR[31:24]可选择。 93 | 94 | ### 汇编格式 95 | 96 | ```assembly 97 | MSR{} CPSR_f | SPSR_f,#<32-bit immediate> 98 | MSR{} CPSR_ | SPSR_,Rm 99 | ``` 100 | 101 | 这里的表示下列情况之一: 102 | 103 | + c---控制域,对应PSR[7:0] 104 | + x---扩展域,对应PSR[15:8](在当前ARM中未使用) 105 | + s---状态域,对应PSR[23:16](在当前ARM中未使用) 106 | + f---标志位域,对应PSR[31:24] 107 | 108 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221223093315822.png) 109 | 110 | 举例: 111 | 112 | 1. 设置N、Z、C和V标志位 113 | 114 | ```assembly 115 | MSR CPSR_f,#0xF0000000 ;设置所有标志位 116 | ``` 117 | 118 | 2. 仅设置C标志位,保存N、Z和V 119 | 120 | ```assembly 121 | MRS R0,CPSR ;将CPSR传送到R0 122 | ORR R0,R0,#0x200000000 ;设置R0的第29位 123 | MSR CPSR_f,R0 ;传送回CPSR 124 | ``` 125 | 126 | 3. 从监控模式切换到IRQ模式 127 | 128 | ```assembly 129 | MRS R0,CPSR ;将CPSR传送到R0 130 | BIC R0,R0,#0x1F ;低5位清0 131 | ORR R0,R0,#0x12 ;设置为IRQ模式 132 | MSR CPSR_c,R0 ;传送回CPSR 133 | ``` 134 | 135 | 注意事项: 136 | 137 | 在用户模式下不能对CPSR[23:0]做任何修改。 138 | 139 | 在用户或系统模式下没有SPSR,所以应尽量避免在这些模式下访问SPSR。 140 | 141 | 在嵌套的异常中断处理中,当退出中断处理程序时,通常通过MSR指令将事先保存了的SPSR内容恢复到当前程序状态寄存器CPSR中。 142 | 143 | 在修改的状态寄存器位域中包括未分配的位时,避免使用立即数方式的MSR指令。 144 | 145 | 不能通过该指令直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令来完成程序状态的切换。 146 | 147 | 148 | 149 | 参考文献: 150 | 151 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 152 | 153 | 154 | 155 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /FPGA-tutorial/F08 - Basic Structure of Verilog HDL Program.md: -------------------------------------------------------------------------------- 1 | - [Verilog HDL程序的基本结构](#verilog-hdl程序的基本结构) 2 | - [简单Verilog HDL程序实例](#简单verilog-hdl程序实例) 3 | - [半加器程序实例](#半加器程序实例) 4 | - [2选1数据选择器的程序实例](#2选1数据选择器的程序实例) 5 | - [Verilog HDL程序的基本结构](#verilog-hdl程序的基本结构-1) 6 | 7 | 8 | # Verilog HDL程序的基本结构 9 | 10 | ## 简单Verilog HDL程序实例 11 | 12 | Verilog使用大约100个预定义的关键词定义该语言的结构 13 | 14 | 1. Verilog HDL程序由模块构成。每个模块的内容都是嵌在两个关键词module和endmodule之间。每个模块实现特定的功能。 15 | 16 | 2. 每个模块先要进行端口的定义,并说明输入(input) 、输出(output) 和双向(inout),然后对模块功能进行描述。 17 | 18 | 3. 除了endmodule外,每个语句后必须有英文的分号(;)。 19 | 20 | 4. 可以用/* --- */和//…..,对Verilog HDL程序的任何部分做注释。 21 | 22 | ### 半加器程序实例 23 | 24 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230125094944033.png) 25 | 26 | ```verilog 27 | /* Gate-level description of a half adder */ 28 | module HalfAdder_GL(A, B, Sum, Carry); 29 | input A ,B ; //输入端口声明 30 | output Sum, Carry ; //输出端口声明 31 | wire A ,B , Sum ,Carry ; 32 | 33 | xor X1 (Sum, A, B ); 34 | and A1 (Carry, A, B); 35 | endmodule 36 | ``` 37 | 38 | ```verilog 39 | /* Dataflow description of a half adder */ 40 | module HalfAdder_DF(A, B, Sum, Carry); 41 | input A ,B ; 42 | output Sum ,Carry ; 43 | wire A ,B,Sum ,Carry ; 44 | assign Sum = A ^ B; 45 | assign Carry = A & B; 46 | endmodule 47 | ``` 48 | 49 | ```verilog 50 | /* Behavioral description of a half adder */ 51 | module HalfAdder_BH(A, B, Sum, Carry); 52 | input A ,B ; 53 | output Sum ,Carry ; 54 | reg Sum ,Carry ; //声明端口数据类型为寄存器 55 | always @(A or B) begin 56 | Sum = A ^ B; //用过程赋值语句描述逻辑功能 57 | Carry = A & B; 58 | end 59 | endmodule 60 | ``` 61 | 62 | ### 2选1数据选择器的程序实例 63 | 64 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230125095030979.png) 65 | 66 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230125095104680.png) 67 | 68 | ```verilog 69 | module mux2to1(a, b, sel, out); 70 | input a, b, sel; //定义输入信号 71 | output out; //定义输出信号 72 | wire selnot,a1,b1; //定义内部节点信号数据类型 73 | //下面对电路的逻辑功能进行描述 74 | not U1(selnot, sel); 75 | and U2(a1, a, selnot); 76 | and U3(b1, b, sel); 77 | or U4(out, a1, b1); 78 | endmodule 79 | ``` 80 | 81 | ```verilog 82 | 83 | module mux2_1(out, a, b, sel) ; 84 | output out; 85 | input a, b; 86 | input sel; 87 | reg out; 88 | 89 | always @(sel or a or b) 90 | begin 91 | if (sel) 92 | out = b; 93 | else out = a; 94 | end 95 | endmodule 96 | ``` 97 | 98 | 行为描述: 99 | 100 | ```verilog 101 | module mux2_1(out, a, b, sel) ; 102 | output out; 103 | input a, b; 104 | input sel; 105 | reg out; 106 | always @(sel or a or b) 107 | begin 108 | case (sel) 109 | 1’b0 : out = a; 110 | 1’b1 : out = b; 111 | endcase 112 | end 113 | endmodule 114 | ``` 115 | 116 | 117 | 118 | ## Verilog HDL程序的基本结构 119 | 120 | 模块定义的一般语法结构如下: 121 | 122 | ```verilog 123 | module模块名(端口名1,端口名2,端口名3,…) ; 124 | 端口类型说明(input, output, inout); 125 | 参数定义(可选); 126 | 数据类型定义(wire, reg等); 127 | 128 | 实例化低层模块和基本门级元件; 129 | 连续赋值语句(assign); 130 | 过程块结构(initial和always) 131 | 行为描述语句; 132 | endmodule 133 | ``` 134 | 135 | 几种描述方式小结: 136 | 137 | 结构描述(门级描述)方式: 138 | 139 | 一般使用Primitive(内部元件)、自定义的下层模块对电路描述。主要用于层次化设计中。 140 | 141 | 数据流描述方式: 142 | 143 | 一般使用assign语句描述,主要用于对组合逻辑电路建模。 144 | 145 | 行为描述方式: 146 | 147 | 一般使用下述语句描述,可以对组合、时序逻辑电路建模。 148 | 149 | + initial 语句 150 | + always 语句 151 | 152 | 153 | 154 | 参考文献: 155 | 156 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 157 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 158 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 159 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 160 | 161 | 162 | 163 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /FPGA-tutorial/F06 - Design of Combinational Logic Circuits.md: -------------------------------------------------------------------------------- 1 | - [组合逻辑电路的设计](#组合逻辑电路的设计) 2 | - [组合逻辑电路的设计步骤](#组合逻辑电路的设计步骤) 3 | - [组合逻辑电路的设计举例](#组合逻辑电路的设计举例) 4 | - [例1](#例1) 5 | - [例2](#例2) 6 | 7 | 8 | # 组合逻辑电路的设计 9 | 10 | 根据实际逻辑问题,求出所要求逻辑功能的最简单逻辑电路。 11 | 12 | ## 组合逻辑电路的设计步骤 13 | 14 | 1.逻辑抽象:根据实际逻辑问题的因果关系确定输入、输出变量,并定义逻辑状态的含义; 15 | 16 | 2.根据逻辑描述列出真值表; 17 | 18 | 3.由真值表写出逻辑表达式。根据所用器件,简化和变换逻辑表达式。 19 | 20 | 4.根据逻辑表达式画出逻辑图。 21 | 22 | ## 组合逻辑电路的设计举例 23 | 24 | ### 例1 25 | 26 | 某雷达站有A、B、C三部雷达,其中A和B消耗功率相等,C的消耗功率是A的两倍。这些雷达由两台发电机X和Y供电,发电机X的最大输出功率等于雷达A的功率消耗,发电机Y的最大输出功率是X的3倍。要求用与、或、非门设计一个逻辑电路,利用各雷达的起动和关闭信号,以最节约电能的方式起、停发电机。 27 | 28 | 解:(1) 逻辑抽象。 29 | 30 | A、B、C是事件产生的原因,应定为输入变量;两台发电机 X 和 Y 是事件产生的结果,定为输出变量。 31 | 32 | 设输入变量A、B、C为1表示雷达起动,为0雷达关闭。输出变量X、Y为1,表示发电机起动;为0,表示发电机停止。 33 | 34 | (2) 根据题意列出真值表 35 | 36 | | **输 入** | **输 入** | **输 入** | **输 出** | 37 | | --------- | --------- | --------- | ---------- | 38 | | **A** | **B** | **C** | **X Y** | 39 | | **0** | **0** | **0** | **0 0** | 40 | | **0** | **0** | **1** | **0 1** | 41 | | **0** | **1** | **0** | **1 0** | 42 | | **0** | **1** | **1** | **0 1** | 43 | | **1** | **0** | **0** | **1 0** | 44 | | **1** | **0** | **1** | **0 1** | 45 | | **1** | **1** | **0** | **0 1** | 46 | | **1** | **1** | **1** | **1 1** | 47 | 48 | (3) 由真值表可画出卡诺图,用卡诺图简化得简化后的逻辑表达式。 49 | 50 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230113112119352.png) 51 | 52 | $X=\bar{A} B \bar{C}+A \bar{B} \bar{C}+A B C$ 53 | 54 | $Y=A B+C$ 55 | 56 | (4) 根据简化后的逻辑表达式画出逻辑图。 57 | 58 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230113112209383.png) 59 | 60 | ### 例2 61 | 62 | 电热水器内部容器示意图中,A、B、C为三个水位检测元件。当水面低于检测元件时,检测元件输出高电平;水面高于检测元件时,检测元件输出低电平。试用与非门设计一个热水器水位状态显示电路,要求当水面在A、B之间的正常状态时,绿灯G亮;水面在B、C间或A以上的异常状态时,黄灯Y亮;水面在C以下的危险状态时,红灯R亮。 63 | 64 | 1.当水面在A、B之间的正常状态时,绿灯G亮; 65 | 66 | 2.水面在B、C间或A以上的异常状态时,黄灯Y亮; 67 | 68 | 3.水面在C以下的危险状态时,红灯R亮。 69 | 70 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230113112239815.png) 71 | 72 | (1) 逻辑抽象 73 | 74 | 输入变量(A、B、C ):为三个检测仪的输出。 75 | 逻辑1:水位低于水位检测仪; 76 | 逻辑0:水位高于水位检测仪。 77 | 78 | 输出变量为绿灯G、黄灯Y、红灯R。 79 | 逻辑1:灯亮; 80 | 逻辑0:灯灭。 81 | 82 | (2) 根据逻辑功能的要求,列出真值表。 83 | 84 | 1.当水面在A、B之间的正常状态时,绿灯G亮; 85 | 2.水面在B、C间或A以上的异常状态时,黄灯Y亮; 86 | 3.水面在C以下的危险状态时,红灯R亮。 87 | 88 | 在具体分析时,发现当逻辑变量被赋予特定含义后,有一些变量的取值组合根本就不会出现,这些最小项应被确定为无关项。 89 | 90 | | **A** | **B** | **C** | **G** | **Y** | **R** | 91 | | ----- | ----- | ----- | ----- | ----- | ----- | 92 | | **0** | **0** | **0** | **0** | **1** | **0** | 93 | | **0** | **0** | **1** | **×** | **×** | **×** | 94 | | **0** | **1** | **0** | **×** | **×** | **×** | 95 | | **0** | **1** | **1** | **×** | **×** | **×** | 96 | | **1** | **0** | **0** | **1** | **0** | **0** | 97 | | **1** | **0** | **1** | **×** | **×** | **×** | 98 | | **1** | **1** | **0** | **0** | **1** | **0** | 99 | | **1** | **1** | **1** | **0** | **0** | **1** | 100 | 101 | (3)由真值表可画出卡诺图。 102 | 103 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230113112342570.png) 104 | 105 | 根据器件要求(与非门),需将逻辑表达式两次求反,变换为与非-与非式 106 | 107 | $\begin{array}{l} 108 | G=A \bar{B}=\overline{\overline{A \bar{B}}} \\ 109 | Y=\bar{A} \bar{B}+B \bar{C}=\overline{\overline{\bar{A} \bar{B}+B \bar{C}}}=\overline{\overline{\bar{A} \bar{B}} \cdot \overline{B \bar{C}}} \\ 110 | R=C 111 | \end{array}$ 112 | 113 | (4)依据逻辑函数式,可画出由与非门构成的逻辑图。 114 | 115 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230113112427909.png) 116 | 117 | 118 | 119 | 参考文献: 120 | 121 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 122 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 123 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 124 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 125 | 126 | 127 | 128 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/Experiment/AE02 - String Copy.md: -------------------------------------------------------------------------------- 1 | # 字符串拷贝 2 | 3 | ## 一、实验目的 4 | 5 | 通过实验掌握使用 LDB/STB,b等指令完成较为复杂的存储区访问和程序分支,学习使用条件码 6 | 7 | ## 二、实验环境 8 | 9 | 硬件:PC机 10 | 11 | 软件:ADS1.2 集成开发环境 12 | 13 | ## 三、实验内容 14 | 15 | 熟悉开发环境的使用并完成一块存储区的拷贝。 16 | 17 | 完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。 18 | 19 | ## 四、实验要求 20 | 21 | 1. 按照2.3节介绍的方法, 在ADS下创建一个工程asmlab2,定义两个数据存储区Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。通过AXD查看寄存器和memory和寄存器中数据变化。 22 | 2. 在指令后面加上适当注释,说明指令功能。 23 | 3. 指出程序执行完成后各相关寄存器及存储器单元的具体内容。 24 | 25 | ## 五、实验完成情况: 26 | 27 | 1、实验源代码(含注释): 28 | 29 | ```assembly 30 | AREA Init,CODE,READONLY ;定义CODE片段Init 只读 31 | ENTRY ;进入程序 32 | CODE32 ;以下为32位的ARM程序 33 | start 34 | MOV SP, #0x400 ; 设置堆栈地址为0x400 35 | LDR R0, =Src ; 先将原字符串地址加载到R0 36 | LDR R1, =Dst ; 将目的字符串地址加载到R1 37 | MOV R3,#0 ; 定义R3中的内容为0 38 | strcopy 39 | LDRB R2,[R0],#1 ; 将R0的内容读入寄存器R2,并将R0R0+1 40 | CMP R2,#0 ; 比较R2和0是否相等,主要检测字符串是否结束 41 | BEQ endcopy ; 等于0则跳转至endcopy 42 | STRB R2,[R1],#1 ; 先将R2中的字节数据写入R1中,并把地址R1+1的值存入R1 43 | ADD R3,R3,#1 ; R3自加一,用于记录字符个数 44 | B strcopy ; 循环 45 | endcopy 46 | LDR R0, =ByteNum ; 将字符数的地址加载到R0 47 | STR R3,[R0] ; 将R3的内容存在R0中 48 | B . 49 | AREA Datapool,DATA,READWRITE ; 定义DATA类型的Datapool 50 | Src DCB "string",0 ; 初始化字符串的存储空间 51 | Dst DCB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 目的字符串存储空间 52 | ByteNum DCD 0 ; 初始化字符数 53 | END 54 | ``` 55 | 56 | 2、实验过程(含结果截图及相应文字解释): 57 | 58 | 定义两个数据存储区Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。通过AXD查看寄存器和memory和寄存器中数据变化。 59 | 60 | 通过存储器可见,内容正在逐渐地进行拷贝。过程如下: 61 | 62 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230215173113443.png) 63 | 64 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230215173134446.png) 65 | 66 | 直到拷贝过程结束,实验结束后存储单元中的内容如下: 67 | 68 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230215173140994.png) 69 | 70 | 相关寄存器中的具体内容如下所示: 71 | 72 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230215173151628.png) 73 | 74 | 练习题: 75 | 76 | 编写程序循环对R4~R11 进行累加8 次赋值,R4~R11 起始值为1~8,每次加操作后把 R4~R11 的内容放入SP 栈中,SP 初始设置为0x800。最后把R4~R11清空赋值为0。 77 | 78 | 提示:多字的加载与存储使用多寄存器寻址,使用的指令为LDM和STM。如: 79 | 80 | ```assembly 81 | LDMIA R0!, {R4-R11} 82 | STMIA R1!, {R4-R11} 83 | ``` 84 | 85 | 编写实验代码如下: 86 | 87 | ```assembly 88 | AREA Init,CODE,READONLY ;定义CODE片段Init 只读 89 | ENTRY ;进入程序 90 | CODE32 ;以下为32位的ARM程序 91 | main NOP 92 | NUM EQU 8 ; 定义NUM为8,即一共经过8次循环 93 | start 94 | MOV SP,#0X800 ;设置栈顶指针为0X800 95 | LDR R0,=src ; 将src的地址加载到R0 96 | MOV R2,#NUM ; 将循环次数赋给R2 97 | MOV R4,#1 ; 设置寄存器R4的初始值 98 | MOV R5,#2 ; 设置寄存器R5的初始值 99 | MOV R6,#3 ; 设置寄存器R6的初始值 100 | MOV R7,#4 ; 设置寄存器R7的初始值 101 | MOV R8,#5 ; 设置寄存器R8的初始值 102 | MOV R9,#6 ; 设置寄存器R9的初始值 103 | MOV R10,#7 ; 设置寄存器R10的初始值 104 | MOV R11,#8 ; 设置寄存器R11的初始值 105 | loop 106 | ADD R4,R4,#1 ; 将寄存器的值加一,下同 107 | ADD R5,R5,#1 108 | ADD R6,R6,#1 109 | ADD R7,R7,#1 110 | ADD R8,R8,#1 111 | ADD R9,R9,#1 112 | ADD R10,R10,#1 113 | ADD R11,R11,#1 114 | STMFD SP!,{R4-R11} ;多寄存器寻址,把R4~R11的内容放入SP栈中 115 | SUBS R2,R2,#1 ;将R2的内容,即循环次数减一 116 | BNE loop ;如果不为0则跳转到loop继续循环 117 | LDMIA R0!,{R4-R11} ;将以R0起始地址的值存入R4-R11,即把R4~R11清空赋值为0. 118 | Stop 119 | B Stop 120 | LTORG ; 声明数据缓冲池 121 | src DCD 0,0,0,0,0,0,0,0 ; 初始化 122 | END 123 | ``` 124 | 125 | 实验初始时,寄存器中内容如下: 126 | 127 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230215173253315.png) 128 | 129 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230215173300701.png) 130 | 131 | 实验结束后,寄存器中的内容如下: 132 | 133 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230215173326499.png) 134 | 135 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A29 - Detailed explanation of ARM symbol definition pseudo-operation.md: -------------------------------------------------------------------------------- 1 | - [ARM符号定义伪操作详解](#arm符号定义伪操作详解) 2 | - [ARM汇编语言的伪操作、宏指令与伪指令](#arm汇编语言的伪操作宏指令与伪指令) 3 | - [两种编译模式的集成开发环境IDE介绍](#两种编译模式的集成开发环境ide介绍) 4 | - [ADS/SDT IDE开发环境](#adssdt-ide开发环境) 5 | - [集成了GNU开发工具的IDE开发环境](#集成了gnu开发工具的ide开发环境) 6 | - [ADS编译环境下的ARM伪操作和宏指令](#ads编译环境下的arm伪操作和宏指令) 7 | - [符号定义伪操作](#符号定义伪操作) 8 | - [GBLA,GBLL及GBLS](#gblagbll及gbls) 9 | - [语法格式](#语法格式) 10 | - [使用示例](#使用示例) 11 | - [LCLA,LCLL及LCLS](#lclalcll及lcls) 12 | - [语法格式](#语法格式-1) 13 | - [使用示例](#使用示例-1) 14 | - [SETA,SETL及SETS](#setasetl及sets) 15 | - [语法格式](#语法格式-2) 16 | - [寄存器列表定义伪指令RLIST](#寄存器列表定义伪指令rlist) 17 | 18 | 19 | # ARM符号定义伪操作详解 20 | 21 | ## ARM汇编语言的伪操作、宏指令与伪指令 22 | 23 | ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成 24 | 伪操作是ARM汇编语言程序里的一些特殊指令助记符,它的作用主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行。 25 | 26 | 宏指令是一段独立的程序代码,可以插在源程序中,它通过伪操作来定义。宏在被使用之前必须提前定义好,宏之间可以互相调用,也可以自己递归调用。通过直接书写宏名来使用宏,并根据宏指令的格式设置相应的输入参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。 27 | 28 | 伪指令也是ARM汇编语言程序里的特殊指令助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正指令操作。 29 | 30 | ## 两种编译模式的集成开发环境IDE介绍 31 | 32 | ### ADS/SDT IDE开发环境 33 | 34 | 它由ARM公司开发,使用了CodeWarrior公司的编译器; 35 | 36 | ### 集成了GNU开发工具的IDE开发环境 37 | 38 | 它由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。 39 | 40 | ## ADS编译环境下的ARM伪操作和宏指令 41 | 42 | ADS编译环境下的伪操作有如下几种: 43 | 44 | + 符号定义(Symbol Definition)伪操作 45 | + 数据定义(Data Definition)伪操作 46 | + 汇编控制(Assembly Control)伪操作 47 | + 框架描述(Frame Description)伪操作 48 | + 信息报告(Reporting)伪操作 49 | + 其他(Miscellaneous)伪操作 50 | 51 | ## 符号定义伪操作 52 | 53 | 1. 全局变量定义伪指令GBLA、GBLL、GBLS 54 | 2. 局部变量定义伪指令LCLA、LCLL、LCLS 55 | 3. 变量赋值伪指令SETA、SETL、SETS 56 | 4. 寄存器列表定义伪指令RLIST 57 | 58 | ### GBLA,GBLL及GBLS 59 | 60 | GBLA,GBLL及GBLS伪操作用于声明一个ARM程序中的全局变量并在默认情况下将其初始化。 61 | 62 | GBLA伪操作声明一个全局的算术变量,并将其初始化成0 63 | 64 | GBLL伪操作声明一个全局的逻辑变量,并将其初始化成{FALSE} 65 | 66 | GBLS伪操作声明一个全局的字符串变量,并将其初始化成空串“” 67 | 68 | #### 语法格式 69 | 70 | ```assembly 71 | Variable 72 | ``` 73 | 74 | ​ 其中: 75 | ``是GBLA,GBLL或GBLS 3种伪操作之一;Variable是全局变量的名称。在其作用范围内必须惟一,即同一个变量名只能在作用范围内出现一次。 76 | 77 | #### 使用示例 78 | 79 | ```assembly 80 | GBLA A1 ;定义一个全局的数值变量,变量名为A1 81 | A1 SETA 0x0F ;将该变量赋值为0x0F 82 | 83 | GBLL A2 ;定义一个全局的逻辑变量,变量名为A2 84 | A2 SETL {TRUE} ;将该变量赋值为真 85 | 86 | GBLS A3 ;定义一个全局的字符串变量,变量名为A3 87 | A3 SETS “Testing” ;将该变量赋值为“Testing” 88 | ``` 89 | 90 | ### LCLA,LCLL及LCLS 91 | 92 | LCLA,LCLL及LCLS伪操作用于声明一个ARM程序中的局部变量,并在默认情况下将其初始化。 93 | 94 | LCLA伪操作声明一个局部的算术变量,并将其初始化成0。 95 | 96 | LCLL伪操作声明一个局部的逻辑变量,并将其初始化成{FALSE} 97 | 98 | LCLS伪操作声明一个局部的串变量,并将其初始化成空串“” 99 | 100 | #### 语法格式 101 | 102 | ```assembly 103 | Variable 104 | ``` 105 | 106 | 其中: 107 | 108 | ``是LCLA,LCLL或LCLS 3种伪操作之一;Variable是局部变量的名称。在其作用范围内必须唯一,即同一个变量名只能在作用范围内出现一次。 109 | 110 | #### 使用示例 111 | 112 | ```assembly 113 | LCLA Test4 ;声明一个局部的数值变量,变量名为Test4 114 | Test4 SETA 0xaa ;将该变量赋值为0xaa 115 | 116 | LCLL Test5 ;声明一个局部的逻辑变量,变量名为Test5 117 | Test5 SETL {TRUE} ;将该变量赋值为真 118 | 119 | LCLS Test6 ;定义一个局部的字符串变量,变量名为Test6 120 | Test6 SETS “Testing” ;将该变量赋值为“Testing” 121 | ``` 122 | 123 | ### SETA,SETL及SETS 124 | 125 | SETA,SETL及SETS伪操作用于给一个ARM程序中的全局或局部变量赋值。 126 | 127 | SETA伪操作给一个全局或局部算术变量赋值 128 | 129 | SETL伪操作给一个全局或局部逻辑变量赋值 130 | 131 | SETS伪操作给一个全局或局部字符串变量赋值 132 | 133 | #### 语法格式 134 | 135 | ```assembly 136 | Variable expr 137 | ``` 138 | 139 | 其中: 140 | 141 | ``是SETA,SETL或SETS 3种伪操作之一;Variable是使用GBLA,GBLL,GBLS,LCLA,LCLL或LCLS定义的变量的名称,在其作用范围内必须唯一;expr为表达式,即赋予变量的值。 142 | 143 | ### 寄存器列表定义伪指令RLIST 144 | 145 | 格式:名称 RLIST {通用寄存器列表} 146 | 147 | 功能:用于对一个通用寄存器列表定义名称, 148 | 149 | ```assembly 150 | reglist RLIST {R0-R3, R8, R12} 151 | … 152 | STMFD SP!, reglist 153 | ; 将列表reglist存储到堆栈中 154 | … 155 | LDMIA R4, reglist 156 | ; 将列表reglist加载到R4中 157 | ``` 158 | 159 | 160 | 161 | 参考文献: 162 | 163 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 164 | 165 | 166 | 167 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A15 - ARM instruction set classification and encoding.md: -------------------------------------------------------------------------------- 1 | - [ARM指令集分类及编码](#arm指令集分类及编码) 2 | - [指令分类及指令格式](#指令分类及指令格式) 3 | - [立即数操作](#立即数操作) 4 | - [寄存器移位操作](#寄存器移位操作) 5 | - [设置条件码](#设置条件码) 6 | - [条件域表1](#条件域表1) 7 | - [条件域表2](#条件域表2) 8 | - [条件执行](#条件执行) 9 | - [条件转移](#条件转移) 10 | - [ARM指令集编码](#arm指令集编码) 11 | 12 | 13 | # ARM指令集分类及编码 14 | 15 | ARM指令集是32位的,程序的启动都是从ARM指令集开始。主要是以下三个方面: 16 | 17 | + 指令分类及指令格式 18 | + 条件执行 19 | + 指令集编码 20 | 21 | ### 指令分类及指令格式 22 | 23 | ARM指令使用的基本格式如下: 24 | 〈opcode〉{〈cond〉} {S} 〈Rd〉,〈Rn〉{,〈operand2〉} 25 | < > 是必须项 , {}是可选项 26 | 27 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221215102100900.png) 28 | 29 | 指令格式中符号说明: 30 | 31 | **opcode**操作码;指令助记符,如ADD、STR等。 32 | **cond** 可选的条件码;执行条件,如EQ、NE等。 33 | **S** 可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。 34 | **Rd** 目标寄存器。 35 | **Rn** 存放第1操作数的寄存器。 36 | **op2** 第2个操作数。 37 | 38 | #### 立即数操作 39 | 40 | 在数据处理指令中,第二操作数除了可以是寄存器,还可以是一个立即数。如果我们只是希望把一个常数加到寄存器,而不是两个寄存器相加,我们可以用立即数值取代第二操作数,如下面例子。立即数用前面加一个“#”的数值常量来表示。 41 | ADD R3, r3,#1 ;r3 := r3 + 1 42 | AND R8, r7,#& ff ;r8 := r7[7:0] 43 | 44 | #### 寄存器移位操作 45 | 46 | 在ARM数据处理指令中,第二操作数还有一种特有的形式-寄存器移位操作,即允许第二个寄存器操作数在同第一操作数运算之前完成移位操作,例如: 47 | ADD r3, r2,r1,LSL #3 ;r3:=r2 + 8 × r1 48 | 49 | #### 设置条件码 50 | 51 | ARM的任何数据处理指令都能通过增加“S”操作码来设置条件码(N,Z,C和V) 52 | 数据处理指令加了“S”后,算术操作(在此包含CMP和CMN)根据算术运算的结果设置所有的标志位 53 | 54 | CPSR和SPSR的格式 55 | 56 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221215102244545.png) 57 | 58 | ##### 条件域表1 59 | 60 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221215102307221.png) 61 | 62 | ##### 条件域表2 63 | 64 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221215102324490.png) 65 | 66 | ### 条件执行 67 | 68 | 所有的ARM指令集都可以是有条件执行的。 69 | ARM指令根据CPSR中的条件位自动判断是否执行指令,在条件满足时,指令执行,否则指令被忽略。 70 | 在ARM的指令编码表中,统一占用编码的最高四位[31:28]来表示“条件码”(即“cond”)。 71 | 72 | ### 条件转移 73 | 74 | | **转移** | **解释** | **一般应用** | 75 | | ---------------- | -------------------------- | ---------------------------------------------------------- | 76 | | **B** **BAL** | **无条件的** **总是** | **总是执行转移** **总是执行转移** | 77 | | **BEQ** | **相等** | **比较的结果为相等或零** | 78 | | **BNE** | **不等** | **比较的结果为不等或非零** | 79 | | **BPL** | **正** | **结果为正数或零** | 80 | | **BMI** **BCC** | **负** **无进位** | **结果为负数** **算术操作未得到进位** | 81 | | **BLO** | **低于** | **无符号数比较,结果为低于** | 82 | | **BCS** **BHS** | **有进位** **高于或相等** | **算术操作得到了进位** **无符号数比较,结果为高于或相等** | 83 | | **BVC** | **无溢出** | **有符号整数操作,未出现溢出** | 84 | | **BVS** | **有溢出** | **有符号整数操作,出现溢出** | 85 | | **BGT** | **大于** | **有符号整数比较,结果为大于** | 86 | | **BGE** | **大于或相等** | **有符号整数比较,结果为大于或相等** | 87 | | **BLT** | **小于** | **有符号整数比较,结果为小于** | 88 | | **BLE** | **小于或相等** | **有符号整数比较,结果为小于或相等** | 89 | | **BHI** | **高于** | **无符号数比较,结果为高于** | 90 | | **BLS** | **低于或相等** | **无符号数比较,结果为低于或相等** | 91 | 92 | ### ARM指令集编码 93 | 94 | ARM指令集是以32位二进制编码的方式给出的,大部分的指令编码中定义了第一操作数、第二操作数、目的操作数、条件标志影响位以及每条指令所对应的不同功能实现的二进制位。每条32位ARM指令都具有不同的二进制编码方式,和不同的指令功能相对应 。编码表如下: 95 | 96 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221215103729583.png) 97 | 98 | 99 | 100 | 参考文献: 101 | 102 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 103 | 104 | 105 | 106 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /FPGA-tutorial/F04 - Algebraic Simplification of Logical Functions.md: -------------------------------------------------------------------------------- 1 | - [逻辑函数的代数法化简](#逻辑函数的代数法化简) 2 | - [逻辑函数的最简形式](#逻辑函数的最简形式) 3 | - [逻辑函数的代数化简法](#逻辑函数的代数化简法) 4 | - [并项法](#并项法) 5 | - [吸收法](#吸收法) 6 | - [消去法](#消去法) 7 | - [配项法](#配项法) 8 | - [示例1](#示例1) 9 | - [示例2](#示例2) 10 | 11 | 12 | # 逻辑函数的代数法化简 13 | 14 | ## 逻辑函数的最简形式 15 | 16 | 1.化简逻辑函数的意义 17 | 18 | $\begin{aligned} 19 | L & =A B+\bar{A} B+\bar{A} \bar{B} \\ 20 | & =(A+\bar{A}) B+\bar{A} \bar{B} \\ 21 | & =1 \cdot B+\bar{A} \bar{B} \\ 22 | & =B+\bar{A} 23 | \end{aligned}$ 24 | 25 | ![image-20230112105112065](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230112105112065.png) 26 | 27 | 两个电路的逻辑功能完全相同。但简化电路使用的逻辑门较少,体积小且成本低。 28 | 29 | 化简的意义:根据化简后的表达式构成的逻辑电路简单,可节省器件,降低成本,提高工作的可靠性。 30 | 31 | 2.逻辑函数的常见表达形式 32 | 33 | $\begin{array}{rlrl} 34 | L & =\frac{A C+\bar{C} D}{\overline{\overline{A C}} \cdot \overline{\bar{C}} D} & & \text { “与-或" 表达式 } \\ 35 | & & \text { “与非-与非" 表达式 } \\ 36 | & =(A+\bar{C})(C+D) & & \text { “或-与" 表达式 } \\ 37 | & =\overline{\overline{(A+\bar{C})}+\overline{(C+D)}} & & \text { “或非-或非" 表达式 } \\ 38 | & =\overline{\bar{A} C+\bar{C} \bar{D}} & & \text { “与-或-非" 表达式 } 39 | \end{array}$ 40 | 41 | “与-或”表达式:也称为 “积之和 (Sum of Products,SOP)”表达式; 42 | 43 | “或-与”表达式:也称为 “和之积(Products of Sum, POS)”表达式。 44 | 45 | 简化标准(最简的与-或表达式) 46 | 47 | 乘积项的个数最少(与门的个数少); 48 | 每个乘积项中包含的变量数最少(与门的输入端个数少)。 49 | 50 | 化简的主要方法: 51 | 52 | 1.公式法(代数法) 53 | 运用逻辑代数的基本定律和恒等式进行化简的方法。 54 | 2.图解法(卡诺图法) 55 | 逻辑变量的个数受限。 56 | 57 | ## 逻辑函数的代数化简法 58 | 59 | 方法: 60 | 61 | #### 并项法 62 | 63 | $A+\bar{A}=1$ 64 | 65 | + $L=\bar{A} \bar{B} C+\bar{A} \bar{B} \bar{C}=\bar{A} \bar{B}(C+\bar{C})=\bar{A} \bar{B}$ 66 | 67 | #### 吸收法 68 | 69 | $A+A B=A$ 70 | 71 | + $L=\bar{A} B+\bar{A} B C D(E+F)=\bar{A} B$ 72 | 73 | #### 消去法 74 | 75 | $A+\bar{A} B=A+B $ 76 | 77 | + $\begin{aligned} 78 | L & =A B+\underline{\bar{A} C}+\underline{\bar{B} C}=A B+(\bar{A}+\bar{B}) C \\ 79 | & =A B+\overline{A B C}=A B+C 80 | \end{aligned}$ 81 | 82 | #### 配项法 83 | 84 | $A+\bar{A}=1$ 85 | 86 | + $\begin{aligned} 87 | L & =A B+\bar{A} \bar{C}+\underline{B \bar{C}}=A B+\bar{A} \bar{C}+(A+\bar{A}) B \bar{C} \\ 88 | & =\underline{A B}+\underline{\bar{A} \bar{C}}+\underline{A B \bar{C}}+\underline{\bar{A} B \bar{C}} \\ 89 | & =(A B+A B \bar{C})+(\bar{A} \bar{C}+\bar{A} \bar{C} B) \\ 90 | & =A B+\bar{A} \bar{C} 91 | \end{aligned}$ 92 | 93 | #### 示例1 94 | 95 | 已知逻辑函数表达式为$L=\bar{A} B \bar{D}+A \bar{B} \bar{D}+\bar{A} B D+A \bar{B} \bar{C} D+A \bar{B} C D$ 96 | 97 | 要求:(1)最简的与-或逻辑函数表达式,并画出逻辑图; 98 | (2)仅用与非门画出最简表达式的逻辑图。 99 | 100 | ![image-20230112110057584](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230112110057584.png) 101 | 102 | $\begin{aligned} 103 | L & =\bar{A} B(\bar{D}+D)+A \bar{B} \bar{D}+A \bar{B}(\bar{C}+C) D \\ 104 | & =\bar{A} B+A \bar{B} \bar{D}+A \bar{B} D \\ 105 | & =\bar{A} B+A \bar{B}(D+\bar{D}) \\ 106 | & =\bar{A} B+A \bar{B} \text { (与-或表达式) } \\ 107 | & =\overline{\overline{\bar{A}} B+A \bar{B}} \\ 108 | & =\overline{\overline{\bar{A}} B \cdot \overline{A \bar{B}}} \text { (与非-与非表达式) } 109 | \end{aligned}$ 110 | 111 | #### 示例2 112 | 113 | 试对逻辑函数表达式$L=\bar{A} \bar{B} C+A \bar{B} \bar{C}$ 进行变换,仅用或非门画出该表达式的逻辑图。 114 | 115 | ![image-20230112110249383](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230112110249383.png) 116 | 117 | $\begin{aligned} 118 | L & =\bar{A} \bar{B} C+A \bar{B} \bar{C}=\overline{\overline{\bar{A} \bar{B} C}}+\overline{\overline{A \bar{B} \bar{C}}} \\ 119 | & =\overline{A+B+\bar{C}+\overline{\bar{A}+B+C}} \\ 120 | & =\overline{\overline{\overline{A+B+\bar{C}}+\overline{\bar{A}+B+C}}} 121 | \end{aligned}$ 122 | 123 | 参考文献: 124 | 125 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 126 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 127 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 128 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 129 | 130 | 131 | 132 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/Experiment/AE01 - Simple Data Movement.md: -------------------------------------------------------------------------------- 1 | # 简单数据搬移 2 | 3 | ## 一、实验目的 4 | 5 | 熟悉实验开发环境,掌握简单ARM汇编指令的使用方法。 6 | 7 | ## 二、实验环境 8 | 9 | 硬件:PC机 10 | 11 | 软件:ADS1.2 集成开发环境 12 | 13 | ## 三、实验内容 14 | 15 | 熟悉开发环境并使用LDR/STR,MOV等指令访问寄存器或存储单元; 16 | 17 | 使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。 18 | 19 | ## 四、实验要求 20 | 21 | (1)按照2.3节介绍的方法, 在ADS下创建一个工程asmlab1,定义两个变量x,y和堆栈地址0x1000,将变量x的内容存到堆栈顶,然后计算x+y,并将和存到堆栈的下一个单元。通过AXD查看寄存器和memory和寄存器中数据变化。 22 | 23 | (2)在指令后面加上适当注释,说明指令功能。 24 | 25 | (3)指出程序执行完成后各相关寄存器及存储器单元的具体内容。 26 | 27 | ## 五、实验完成情况 28 | 29 | 1、实验源代码(含注释): 30 | 31 | ```assembly 32 | AREA Init,CODE,READONLY ;伪指令AREA定义名为Init,属性为只读或的代码片段 33 | ENTRY ;伪指令ENTRY声明程序入口 34 | CODE32 ;声明以下代码为 32 位 ARM 指令 35 | x EQU 45 36 | y EQU 64 ;定义两个变量 x,y 37 | stack_top EQU 0x1000 ;定义堆栈地址 0x1000 38 | start MOV SP, #stack_top ;设置栈顶地址 39 | MOV R0, #x ;把x的值赋给R0 40 | STR R0, [SP] ;R0中的内容入栈 41 | MOV R0, #y ;把y的值赋给R0 42 | LDR R1, [SP] ; 数据出栈,放入R1,即R1中放x的值 43 | ADD R0, R0, R1 ;R0=R0+R1 44 | STR R0, [SP,#4] ;先执行SP+4(ARM为32位指令集),再将R0内容复制到SP指向的寄存器 45 | B . 46 | END ;程序结束 47 | ``` 48 | 49 | 2、实验过程(含结果截图及相应文字解释): 50 | 51 | 根据代码可知, 52 | 53 | 1.首先执行start MOV SP, #stack_top 通过该语句设置了栈顶地址为0x1000。 54 | 55 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230214145117856.png) 56 | 57 | 2.然后执行MOV R0, #x,把x的值赋值给了R0寄存器,此时R0寄存器的值变成45,由于是十六进制存储的,因此显示为2D。 58 | 59 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230214145129493.png) 60 | 61 | 3.然后执行STR R0, [SP],将R0的值入栈,由于前面已经设置了栈顶地址为0x1000,因此可以查看到内存地址0x100处的数据变成了2D。 62 | 63 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230214145826048.png) 64 | 65 | 4.然后执行MOV R0, #y,把y的值赋值给了R0寄存器,此时R0寄存器的值变成64,由于是十六进制存储的,因此显示为40。 66 | 67 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230214145152762.png) 68 | 69 | 5.然后执行LDR R1, [SP],该数据出栈,将数据赋值给R1,此时R1中保存的值为2D。 70 | 71 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230214145201302.png) 72 | 73 | 6.然后执行ADD R0, R0, R1,其含义相当于R0=R0+R1,因此R0寄存器的值为2D+40 = 6D。 74 | 75 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230214145210393.png) 76 | 77 | 7.最后执行STR R0, [SP, #4],先执行SP+4,将指针进行偏移,再将R0的值复制到此时SP指向的地址0x1004,该数据赋值为6D。 78 | 79 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230214145219696.png) 80 | 81 | 最后程序执行完成后各相关寄存器及存储器单元的具体内容如下: 82 | 83 | 寄存器: 84 | 85 | + R0内容为0x6D, 86 | + R1内容为0x2D, 87 | + SP内容为0x1000, 88 | 89 | 存储器单元: 90 | 91 | + 0x1000内容为0x2D, 92 | + 0x1004内容为0x6D。 93 | 94 | 练习题 95 | 96 | 编写程序实现对一段数据的最大值最小值搜索,最大值存于max变量之中,最小值存于min变量之中。 97 | 98 | 提示: 数据的定义采用伪指令:DCD来实现,如: 99 | 100 | ```assembly 101 | DataBuf DCD 11,-2,35,47,96,63,128,-23 102 | ``` 103 | 104 | 搜索最大值和最小值可以利用两个寄存器R1,R2来存放。用到的比较指令为CMP,用到的条件标识符小于为LT,大于为GT。 105 | 106 | 基本思路为:利用R0做基地址,将R1,R2分别存入第一个单元的内容,利用R3做循环计数器,利用R4遍历读取第2至最后一个数据,如果R1的数据小于新读入的R4数据则将R4的内容存入R1, 如果R2的内容大于R4的内容则将R4的内容存入R2。遍历完成之后,R1将存放最大数据,R2将存放最小数据。 107 | 108 | ```assembly 109 | AREA comp,CODE,READONLY ;定义CODE片段comp 只读 110 | ENTRY ;进入程序 111 | CODE32 ;以下为32位的ARM程序 112 | START 113 | LDR R0, = DAT ;加载数据段中DAT的数据的地址到R0 114 | LDR R1, [R0] ;加载R0的内容到R1 115 | LDR R2, [R0] ;加载R0的内容到R1 116 | MOV R3,#1 ;设置循环变量R3并初始化为1 117 | LOOP 118 | ADD R0,R0,#4 ;每次循环R0+4 119 | LDR R4,[R0] ;R4存入R0的数据 120 | CMP R1,R4 ;比较R1,R4 121 | MOVLT R1,R4 ;如果R1R4 就把R4存入R2 124 | ADD R3,R3,#1 ;每次循环R3值加一 125 | CMP R3,#8 ;判断R3与8 126 | BLT LOOP ;如果R3 < 8则跳转到LOOP执行 127 | B . ;退出 128 | AREA D,DATA,READONLY ;定义一个数据段D,读写 129 | DAT DCD 11,-2,35,47,96,63,128,-23 130 | END 131 | ``` 132 | 133 | 实验结果如下: 134 | 135 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230214145928589.png) 136 | 137 | 程序的基本思路是将DataBuf的首地址装载到R0中,再通过首地址将第一个数据装载到R1和R2中,设定R3为循环变量,并且初始化为1。然后进入循环,通过循环比较,将比较过程中得到的最大值放在R1中,最小值放在R2中,每一次循环R3中的值加1,当R3=8时,比较循环结束。 138 | 139 | 140 | 141 | [返回首页](https://github.com/timerring/hardware-tutorial) 142 | -------------------------------------------------------------------------------- /ARM-tutorial/A23 - ARM transfer instruction (branch instruction).md: -------------------------------------------------------------------------------- 1 | - [ARM转移指令(分支指令)](#arm转移指令分支指令) 2 | - [转移和转移链接指令(B,BL)](#转移和转移链接指令bbl) 3 | - [二进制编码](#二进制编码) 4 | - [汇编格式](#汇编格式) 5 | - [(1)无条件转移](#1无条件转移) 6 | - [(2)执行10次循环](#2执行10次循环) 7 | - [(3)调用子程序](#3调用子程序) 8 | - [汇编语言子程序调用及返回](#汇编语言子程序调用及返回) 9 | - [(4)子程序的嵌套调用](#4子程序的嵌套调用) 10 | - [(5)条件子程序调用](#5条件子程序调用) 11 | - [转移交换和转移链接交换(BX,BLX)](#转移交换和转移链接交换bxblx) 12 | 13 | 14 | # ARM转移指令(分支指令) 15 | 16 | ARM有2种方法可实现程序的转移: 17 | 18 | + 一种是利用传送指令直接向PC寄存器R15中写入转移的目标地址,通过改变PC的值实现程序的转移; 19 | + 另一种就是利用转移指令。 20 | 21 | ARM的转移指令可以从当前指令向前或向后的32MB的地址空间跳转,根据完成的功能它可以分为以下4种 : 22 | 23 | + B 转移指令 24 | + BL 带链接的转移指令 25 | + BX 带状态切换的转移指令 26 | + BLX 带链接和状态切换的转移指令 27 | 28 | ## 转移和转移链接指令(B,BL) 29 | 30 | 转移指令B在程序中完成简单的跳转指令,可以跳转到指令中指定的目的地址。BL指令完全象转移指令一样地执行转移,同时把转移后面紧接的一条指令的地址保存到链接寄存器LR(r14),这样可以实现子程序的返回。 31 | 32 | ### 二进制编码 33 | 34 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221224092151198.png) 35 | 36 | 跳转目标地址的计算方法:先对指令中定义的有符号的24位转移量用符号扩展为32位,并将该32位左移2位形成字的偏移,然后将它加到程序计数器PC中(相加前程序计数器的内容为转移指令地址加8字节)。一般情况下汇编器将会计算正确的偏移。 37 | 38 | 转移范围为±32MB。 39 | 40 | L标志为1时,为转移连接指令。 41 | 42 | ### 汇编格式 43 | 44 | ```assembly 45 | B{L}{} 46 | ``` 47 | 48 | L指定转移与连接属性,如果不包括L,便产生没有连接的转移。是条件执行的助记符扩展,缺省为AL,即无条件转移。一般是汇编代码中的标号,是转移到的目标地址。 49 | 50 | 举例: 51 | 52 | #### (1)无条件转移 53 | 54 | ```assembly 55 | B LABEL ;无条件跳转 56 | …… 57 | LABEL …… 58 | ``` 59 | 60 | #### (2)执行10次循环 61 | 62 | ```assembly 63 | MOV R0,#10 ;初始化循环计数器 64 | LOOP …… 65 | SUBS R0,R0,#1 ;计数器减1,设置条件码 66 | BNE LOOP ;如果计数器R0≠0,重复循环 67 | ``` 68 | 69 | #### (3)调用子程序 70 | 71 | ```assembly 72 | … … 73 | BL SUB ;转移连接到子程序SUB 74 | …… ;返回到这里 75 | SUB … … ;子程序入口 76 | MOV PC,R14 ;返回 77 | ``` 78 | 79 | 注意:在子程序返回之前,不应再调用下一级嵌套子程序。 80 | 81 | ### 汇编语言子程序调用及返回 82 | 83 | 在ARM汇编语言中,子程序调用是通过BL指令来完成的。BL指令的语法格式如下: 84 | 85 | ```assembly 86 | BL subname 87 | ``` 88 | 89 | 其中,subname是被调用的子程序的名称。BL指令完成两个操作:将子程序的返回地址放在LR寄存器(r14)中,同时将PC寄存器值设置成目标子程序的第一条指令地址。 90 | 91 | 在返回调用子程序时,转移链接指令保存到LR寄存器(r14)中的值需要拷贝回程序寄存器PC(r15)。 92 | 93 | #### (4)子程序的嵌套调用 94 | 95 | 为了实现子程序的嵌套调用,应该在调用嵌套子程序之前,先将R14内容压栈保存。如: 96 | 97 | ```assembly 98 | BL SUB1 ;转移连接到子程序SUB1 99 | …… ;返回到这里 100 | SUB1 … … ;子程序1入口 101 | STMFD SP!,{R14} 102 | BL SUB2 103 | LTMFD SP!,{R14} 104 | … … 105 | MOV PC,R14 ;返回 106 | SUB2 …… 子程序入口2 107 | ``` 108 | 109 | #### (5)条件子程序调用 110 | 111 | ```assembly 112 | …… 113 | CMP R0,#5 ;如果R0<5 114 | BLLT SUB1 ;然后调用SUB1 115 | BLGE SUB2 ;否则调用SUB2 116 | …… 117 | ``` 118 | 119 | 注意:只有SUB1不改变条件,这里才能正常运行。 120 | 121 | 当转移指令转移到32MB地址空间之外时,将产生不可预测的结果。 122 | 123 | ## 转移交换和转移链接交换(BX,BLX) 124 | 125 | 这些指令用于支持Thumb(16位)指令集的ARM芯片,程序可以通过这些指令完成处理器从ARM状态到Thumb状态的切换。类似的Thumb指令可以使处理器切换回32位ARM指令。 126 | 127 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221224092406211.png) 128 | 129 | 在第一种格式中,寄存器Rm的值是转移目标,Rm的第0位拷贝到CPSR中的T位,进而决定是切换到Thumb状态还是ARM状态。[31:1]位移入PC。 130 | 131 | 如果Rm[0]是1,则切换到Thumb状态,并在Rm中的地址处开始执行,但需将最低位清0,使之半字对齐。 132 | 133 | 如果Rm[0]是0,则切换到ARM状态,并在Rm中的地址处开始执行,但需将Rm[1]清0,使之半字对齐 。 134 | 135 | ARM的状态寄存器CPSR中的状态控制位T-bit(位[5])决定了当前处理器的运行状态,因此,可以通过MSR和MRS指令来直接修改CPSR的状态位,也能够改变处理器运行状态 136 | 但由于ARM采用多级流水线的结构,这样做会造成流水线上预取指令的执行错误,而如果用BX指令,则不会出现这样的问题 137 | 138 | 下面是一段直接进行状态切换的例程。 139 | 140 | ```assembly 141 | ;从ARM状态开始 142 | CODE32 ;表明以下是ARM指令 143 | ADR R0, Into_Thumb+1; 得到目标地址,末位置1, 144 | ; 表示转移到Thumb 145 | BX R0 ;转向Thumb 146 | …… ;执行其它代码 147 | CODE16 ;表明以下是Thumb指令 148 | Into_Thumb : ;Thumb代码 149 | ADR R5, Back_to_ARM ;得到目标地址,末位缺省为0, 150 | ; 转移到ARM 151 | BX R5 ;转向ARM 152 | …… ;执行其它代码 153 | CODE32 ;表明以下是ARM指令 154 | Back_to_ARM: ;ARM代码段起始地址 155 | ``` 156 | 157 | 158 | 159 | 参考文献: 160 | 161 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 162 | 163 | 164 | 165 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /FPGA-tutorial/F10 - Common Commands for Verilog HDL Simulation.md: -------------------------------------------------------------------------------- 1 | - [Verilog HDL仿真常用命令](#verilog-hdl仿真常用命令) 2 | - [系统任务(System Tasks)](#系统任务system-tasks) 3 | - [1.显示任务(Display Task)](#1显示任务display-task) 4 | - [2.\$monitor任务的参数格式与$display的相同.](#2monitor任务的参数格式与display的相同) 5 | - [3.仿真的中止 (Stopping) 和 完成(Finishing)任务](#3仿真的中止-stopping-和-完成finishing任务) 6 | - [编译指令(Compiler Directives)](#编译指令compiler-directives) 7 | - [时间尺度\`timescale](#时间尺度timescale) 8 | - [宏定义\`define](#宏定义define) 9 | - [文件包含指令\`include](#文件包含指令include) 10 | 11 | 12 | # Verilog HDL仿真常用命令 13 | 14 | ## 系统任务(System Tasks) 15 | 16 | ### 1.显示任务(Display Task) 17 | 18 | \$display是Verilog中最有用的任务之一,用于将指定信息(被引用的字符串、变量值或者表达式)以及结束符显示到标准输出设备上。其格式如下: 19 | 20 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230127101107463.png) 21 | 22 | ### 2.\$monitor任务的参数格式与\$display的相同. 23 | 24 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230127101159207.png) 25 | 26 | ### 3.仿真的中止 (Stopping) 和 完成(Finishing)任务 27 | 28 | + \$stop;//在仿真期间,停止执行,未退出仿真环境。 29 | + \$finish;//仿真完成,退出仿真环境,并将控制权返回给操作系统。 30 | + 系统任务\$stop使得仿真进入交互模式,然后设计者可以进行调试。当设计者希望检查信号的值时,就可以使用\$stop使仿真器被挂起。然后可以发送交互命令给仿真器继续仿真。 31 | 32 | ## 编译指令(Compiler Directives) 33 | 34 | 以 `(反撇号)开头的标识符就是编译指令,用来控制代码的整个过程。在Verilog代码编译的整个过程中,编译指令始终有效(编译过程可能跨越多个文件),直至遇到其他不同的编译指令为止。 35 | 36 | ```verilog 37 | `timescale time_unit/time_precision 38 | `include " ../../header.v " 39 | `define WORD_SIZE 32 //定义文本宏 40 | `undef 41 | `ifdef 42 | `ifndef 43 | `else 44 | `elseif 45 | `endif 46 | ``` 47 | 48 | ### 时间尺度`timescale 49 | 50 | \`timescale命令用于在文件中指明时间单位和时间精度,通常在对文件进行仿真时体现。EDA工具可以支持在一个设计中可根据仿真需要在不同模块里面指定不同的时间单位。如模块A仿真的时间单位为皮秒(ps),模块B仿真的时间单位为纳秒(ns)。 51 | 52 | 使用\`timescale命令语句格式如下: 53 | 54 | + \`timescale <时间单位> / <时间精度> 55 | + 使用时注意: <时间单位>和<时间精度>必须是整数,且时间精度不能大于时间单位值。 56 | + 例如:\`timescale 1ns / 1ns 57 | 58 | 时间单位是定义仿真时间和延迟时间的基准单位;时间精度是定义模块仿真时间的精确程度的,又被称为取整精度(在仿真前,被用来对延迟的时间值进行取整操作)。如果在同一个设计中,出现多个\`timescale命令,工具会采用最小的时间精度值来决定仿真的时间单位。 59 | 60 | \`timescale 1ns / 1ps:此命令已定义模块中的时间单位为1ns,即仿真模块中所有的延迟时间单位都是1ns的整数倍;定义了模块的时间精度为1ps,即仿真模块中延迟单位可以指定到小数点后3位,小数超过3位会进行取小数点后3位的操作。 61 | 62 | ### 宏定义\`define 63 | 64 | 在设计中,为了提高程序可读性和简化程序描述,可以使用指定的标识符来代替一个长的字符串,或者使用一个简单的名字来代替没有含义的数字或者符号,此时需使用到宏定义命令\`define。 65 | 66 | 使用\`define命令格式如下: 67 | 68 | + \`define signal(宏名) string(宏内容) 69 | + 在设计中进行了以上声明后,在预编译处理时,在此命令后程序中所有的signal都替换成string,此过程称为“宏展开”。 70 | 71 | ```verilog 72 | //例1 : 73 | `define LENGTH 16 74 | reg [ `LENGTH–1 : 0 ] writedata; 75 | //即定义reg[15:0] writedata; 76 | //例2 : 77 | `define expression a+b+c 78 | assign data = `expression + d ; //经宏展开之后 79 | //assign data = a+b+c+d; 80 | //例3 : 81 | `define A a+b 82 | `define B c+`A 83 | assign data = `B ; // 即data = c + a + b; 84 | ``` 85 | 86 | ### 文件包含指令\`include 87 | 88 | 和C语言中声明头文件很类似。其一般形式为: 89 | 90 | ``include “文件名”` 91 | 92 | 例:文件para.v中有一个宏定义 \`define A 2+3, 在test.v文件中可以直接调用。 93 | 94 | ```verilog 95 | `timescale 1ns/1ps 96 | `include "para.v" 97 | `module test( 98 | input wire clk, 99 | output reg [7:0] result 100 | ); 101 | always@(posedge clk) 102 | begin 103 | result <= `A + 10; 104 | end 105 | endmodule 106 | ``` 107 | 108 | 关于文件包含的几点说明: 109 | 110 | + 一个\`include只能指定一个包含文件; 111 | + \`include中的文件名可以是相对路径,也可以是绝对路径(ISE中调用Modelsim仿真的时候得用绝对路径,否则Modelsim会报错); 112 | + 如果文件1包含文件2,而文件2要用到文件3的内容,那么在文 113 | 114 | 例:para.v 中 : \`define A 2+3 para2.v 中: \`define B \`A+2 test.v中: 115 | 116 | ```verilog 117 | `timescale 1ns/1ps 118 | `include " para.v" 119 | `include " para2.v" 120 | module test( 121 | input wire clk, 122 | output reg [7:0] result 123 | ); 124 | always@(posedge clk) 125 | begin 126 | result <= `B+ 10; 127 | end 128 | endmodule 129 | ``` 130 | 131 | 132 | 133 | 参考文献: 134 | 135 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 136 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 137 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 138 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 139 | 140 | 141 | 142 | [返回首页](https://github.com/timerring/hardware-tutorial) 143 | -------------------------------------------------------------------------------- /FPGA-tutorial/F13 - Verilog HDL Data Flow Modeling and Operators.md: -------------------------------------------------------------------------------- 1 | - [Verilog HDL数据流建模与运算符](#verilog-hdl数据流建模与运算符) 2 | - [数据流建模](#数据流建模) 3 | - [例:用数据流描述方式建立模型](#例用数据流描述方式建立模型) 4 | - [例:用条件运算符描述2选1的数据选择器。](#例用条件运算符描述2选1的数据选择器) 5 | - [例:用数据流建模方法对2线-4线译码器的行为进行描述。](#例用数据流建模方法对2线-4线译码器的行为进行描述) 6 | - [运算符及其优先级](#运算符及其优先级) 7 | - [运算符 (9类)](#运算符-9类) 8 | - [位拼接运算符](#位拼接运算符) 9 | - [相等与全等运算符](#相等与全等运算符) 10 | - [条件运算符](#条件运算符) 11 | - [运算符的优先级](#运算符的优先级) 12 | 13 | 14 | # Verilog HDL数据流建模与运算符 15 | 16 | 对于基本单元逻辑电路,使用Verilog语言提供的门级元件模型描述电路非常方便。 17 | 18 | 但随着电路复杂性的增加,使用的逻辑门较多时,使用HDL门级描述的工作效率就很低。 19 | 20 | 数据流建模能够在较高的抽象级别描述电路的逻辑功能,并且通过逻辑综合软件,能够自动地将数据流描述转换成为门级电路。 21 | 22 | 数据流建模主要使用逻辑表达式,所以要了解各种运算符和表达式。 23 | 24 | ## 数据流建模 25 | 26 | 数据流建模使用的连续赋值语句,由关键词assign开始,后面跟着由操作数和运算符等组成的逻辑表达式。 27 | 28 | 一般用法如下: 29 | 30 | wire [位宽说明] 变量名1,变量名2,……,变量名n; 31 | assign 变量名=表达式; 32 | 33 | 注意,assign 语句只能对wire型变量进行赋值,所以等号左边变量名的数据类型必须是wire型。 34 | 35 | ### 例:用数据流描述方式建立模型 36 | 37 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230130100302128.png) 38 | 39 | $Y=D_{0} \cdot \bar{S}+D_{1} \cdot S$ 40 | 41 | ``` 42 | module mux2to1_dataflow(D0, D1, S, Y ); 43 | input D0, D1, S; 44 | output Y; 45 | wire Y ; 46 | 47 | //下面是逻辑功能描述 48 | assign Y = (~S & D0) | (S & D1); //表达式左边Y必须是wire型 49 | 50 | endmodule 51 | ``` 52 | 53 | ### 例:用条件运算符描述2选1的数据选择器。 54 | 55 | ``` 56 | module mux2x1_df (D0,D1,S,L); 57 | input D0,D1,S; 58 | output L; 59 | 60 | assign L = S ? D1 : D0; 61 | 62 | endmodule 63 | ``` 64 | 65 | 条件运算符:如果S=1,则输出L=D1;否则L=D0。 66 | 67 | ### 例:用数据流建模方法对2线-4线译码器的行为进行描述。 68 | 69 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230130102327345.png) 70 | 71 | ``` 72 | module decoder_df (A1,A0,E,Y); 73 | input A1,A0,E; 74 | output [3:0] Y; 75 | assign Y[0] = ~(~A1 & ~A0 & ~E); 76 | assign Y[1] = ~(~A1 & A0 & ~E); 77 | assign Y[2] = ~( A1 & ~A0 & ~E); 78 | assign Y[3] = ~( A1 & A0 & ~E); 79 | endmodule 80 | ``` 81 | 82 | ## 运算符及其优先级 83 | 84 | ### 运算符 (9类) 85 | 86 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230130102432875.png) 87 | 88 | #### 位拼接运算符 89 | 90 | 作用是将两个或多个信号的某些位拼接起来成为一个新的操作数,进行运算操作。 91 | 92 | ``` 93 | 设A=1’b1,B=2’b10,C=2’b00 94 | 95 | 则{B,C}=4’b1000 96 | {A,B[1],C[0]}=3’b110 97 | {A,B,C,3’b101}=8’b11000101。 98 | ``` 99 | 100 | 对同一个操作数的重复拼接还可以双重大括号构成的运算符{{}} 101 | 102 | 例如{4{A}}=4’b1111,{2{A},2{B},C}=8’b11101000。 103 | 104 | A:4’b1010 、B:4’b1111, 105 | 106 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20230130102613060.png) 107 | 108 | #### 相等与全等运算符 109 | 110 | ==(逻辑相等), !=(逻辑不等) 111 | ===(条件全等),!==(条件不全等) 112 | 113 | a、b的初值同为4’b0100,c和d的初值同为4’b10x0 114 | 115 | | a= =b | a!=b | a= = =b | a!= =b | 116 | | ---------- | -------- | ------------ | ----------- | 117 | | **1** | **0** | **1** | **0** | 118 | | **c= =d** | **c!=d** | **c= = =d** | **c!= =d** | 119 | | **x** | **x** | **1** | **0** | 120 | 121 | #### 条件运算符 122 | 123 | 是三目运算符,运算时根据条件表达式的值选择表达式。 124 | 125 | 一般用法: 126 | 127 | ``` 128 | condition_expr ? expr1 : expr2; 129 | ``` 130 | 131 | 首先计算第一个操作数condition_expr的值,如果结果为逻辑1,则选择第二个操作数expr1的值作为结果返回;如果结果为逻辑0,则选择第三个操作数expr2的值作为结果返回。 132 | 133 | ### 运算符的优先级 134 | 135 | 优先级的顺序从下向上依次增加。 136 | 137 | | **类型** | **符号** | **优先级别** | 138 | | -------- | ---------------------------------- | -------------- | 139 | | **取反** | **! ~ -(求2的补码)** | **最高优先级** | 140 | | **算术** | *** /** **+ -** | | 141 | | **移位** | **>> <<** | | 142 | | **关系** | **< <= > >=** | | 143 | | **等于** | **== !=** | | 144 | | **缩位** | **& ~&** **^ ^~** **\| ~\|** | | 145 | | **逻辑** | **&&** **\|\|** | | 146 | | **条件** | **?:** | **最低优先级** | 147 | 148 | 149 | 150 | 参考文献: 151 | 152 | 1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月 153 | 2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月 154 | 3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月 155 | 4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月 156 | 157 | 158 | 159 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A27 - ARM common development and compilation software introduction.md: -------------------------------------------------------------------------------- 1 | - [ARM常用开发编译软件介绍](#arm常用开发编译软件介绍) 2 | - [编译器介绍](#编译器介绍) 3 | - [1、ADS1.2](#1ads12) 4 | - [2、ARM RealView Developer Suite (RVDS)](#2arm-realview-developer-suite-rvds) 5 | - [3、IAR EWARM](#3iar-ewarm) 6 | - [4、KEIL ARM-MDKARM](#4keil-arm-mdkarm) 7 | - [5、WIN ARM-GCC ARM](#5win-arm-gcc-arm) 8 | 9 | 10 | # ARM常用开发编译软件介绍 11 | 12 | ## 编译器介绍 13 | 14 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221227105406508.png) 15 | 16 | ## 1、ADS1.2 17 | 18 | ADS(ARM Developer Suite),是在1993年由Metrowerks公司开发是ARM处理器下最主要的开发工具。 他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已经不再升级。ADS包括了四个模块分别是:SIMULATOR;C 编译器;实时调试器;应用函数库。ADS对汇编、C/C++、java支持的均很好,是目前最成熟的ARM开发工具。很多ARM开发软件(例如Keil)也是借用的ADS的编译器。ADS在2006年版本已经发布到2.2。但国内大部分开发者使用的均是1.2版本 19 | 20 | ADS1.2提供完整的WINDOWS界面开发环境。C编译器效率高,支持c 以及c++。提供软件模拟仿真功能,使没有Emulators的学习者也能够熟悉ARM的指令系统。配合FFT-ICE使用,ADS1.2提供强大的实时调试跟踪功能,片内运行情况尽在掌握。ADS1.2需要硬件支持才能发挥强大功能。目前支持的硬件调试器有Multi-ICE以及兼容Multi-ICE的调试工具如FFT-ICE。 21 | 22 | 版本:ADS1.2 23 | 24 | 软件大小:130M 25 | 26 | ## 2、ARM RealView Developer Suite (RVDS) 27 | 28 | ARM RealView Developer Suite (RVDS) 是 ARM 公司继 ARM Developer Suite(ADS 1.2) 之后推出的新一代开发工具,是业界公认最好的 ARM 编译器之一。 29 | 30 | 它由 RealView 编译器 (RVCT) ,以及 RealView 调试器( RV Debugger ), CodeWarrior 集成开发环境和 ARMulator 指令集仿真器组成。可以支持所有标准 ARM 架构和内核,针对特定处理器进行代码优化,有多种可以灵活配置的优化选项以取得最小的代码尺寸和最好的性能。 31 | 32 | RealView ICE主要特点: 33 | 34 | + 高性能的调试控制 35 | + 通过 RealView Debugger 代码下载速度可达 1300 Kbytes/ 秒 36 | + 高速单步执行 , 每秒可达 100 37 | + 支持 JTAG 调试通信通道 (DCC) 38 | + 支持多种 JTAG 时钟频率 , 从 2KH~50MHZ 39 | + 更低的 JTAG 时钟频率 ( 低于 1KHZ), 支持 ASIC 外围电路调试 40 | + 宽电压支持 1.0~5.0V 41 | + 支持多核处理器调试 , 同步控制 42 | + 配合 RealView Trace 模块插件可捕获支持 ETM 跟踪数据 43 | + 通过 JTAG 访问 ETB 跟踪数据 44 | + 兼容 GDB 与 KGDB 调试 45 | + 支持 USB1.1 与 2.0 连接 46 | + 支持网络连接调试 10/100baseT 47 | + 支持的 ARM 处理器:ARM7 TM , ARM9 TM , ARM9E TM , ARM10 TM , ARM11 TM 和 Cortex TM 48 | 49 | RealView Trace 主要特性: 50 | 51 | + 非插入式的实时指令跟踪与数据跟踪,跟踪频率可高达 250MHZ ,高达 8 百万帧深度的跟踪缓冲区(高达 4 百万帧深度的 time stamp 缓冲区) 52 | + 48 位 time stamp , 10 纳秒分辨率,支持最长连续 32 天数据跟踪 53 | + 4/8/16 位数据宽度跟踪端口 54 | + 外部事件同步触发器 55 | + 完全可变的触发位置 56 | + 快速 on-the-fly 跟踪数据上传 57 | + 与主机共享 RealView ICE 连接 58 | + 支持 ETM 跟踪端口模式 59 | + 支持 v1.x, v2.x, v3.x for ETM7TM ETM9TM, ETM10TM 与 ETM11TM 等 ETM 协议 60 | + 单边沿和双边沿时钟触发 61 | + 普通与多元的端口 62 | 63 | 库创建工具 64 | 65 | 内容丰富的在线文档 66 | 67 | 版本:ARM RealView Developer2.2 68 | 69 | 软件大小:500M 70 | 71 | ## 3、IAR EWARM 72 | 73 | Embedded Workbench for ARM 是IAR Systems 公司为ARM 微处理器开发的一个集成开发环境(下面简称IAR EWARM)。比较其他的ARM 开发环境,IAR EWARM 具有入门容易、使用方便和代码紧凑等特点。 74 | 75 | EWARM 中包含一个全软件的模拟程序(simulator)。用户不需要任何硬件支持就可以模拟各种ARM 内核、外部设备甚至中断的软件运行环境。从中可以了解和评估IAR EWARM 的功能和使用方法。 76 | 77 | 最新版本是: IAR Embedded Workbench for ARM version 4.30。 78 | 79 | IAR EWARM 的主要特点如下: 80 | 81 | + 高度优化的IAR ARM C/C++ Compiler 82 | + IAR ARM Assembler 83 | + 一个通用的IAR XLINK Linker 84 | + IAR XAR 和XLIB 建库程序和IAR DLIB C/C++运行库 85 | + 功能强大的编辑器 86 | + 项目管理器 87 | + 命令行实用程序 88 | + IAR C-SPY 调试器(先进的高级语言调试器) 89 | 90 | 版本:IAR EWARM 4.40a 91 | 92 | 软件大小:93M 93 | 94 | ## 4、KEIL ARM-MDKARM 95 | 96 | Keil公司已从事MCS-51开发平台uVision著名。近年来,Keil公司也将自己的领域扩展到了ARM的开发工具,即:keil arm,再后来keil真的被arm收购了,他的arm开发工具这一块就是现在的MDK系列。 97 | 98 | Keil uVision调试器可以帮助用户准确地调试ARM器件的片内外围功能(I2C、CAN、UART、SPI、中断、I/O口、A/D转换器、D/A转换器和PWM模块等功能)。 99 | 100 | Keil MDK-ARM最新版本4.54,安装包500多兆,包括ARM的编译器和uVision 4集成开发环境。 101 | 102 | MDK-ARM 具有四种版本:MDK-Lite、MDK 基础版、MDK 标准版和 MDK 专业版。所有版本都提供完整的 C/C++ 开发环境,MDK 专业版包括丰富的中间件库。 103 | 104 | Project/Target/Group/File的重叠管理模式,并可逐级设置;高度智能彩色语法显示; 105 | 106 | 特点 107 | 108 | + 完全支持 ARM Cortex™-M 系列、Cortex-R4、ARM7™ 和 ARM9™ 设备 109 | + 行业领先的 ARM C/C++ 编译工具链 110 | + µVision4 IDE、调试器和模拟环境 111 | + 支持来自 20 多个供应商的 1200 多种设备 112 | + Keil RTX 确定性、占用空间小的实时操作系统(具有源代码) 113 | + TCP/IP 网络套件提供多个协议和各种应用程序 114 | + USB 设备和 USB 主机堆栈配备标准驱动程序类 115 | + ULINKpro支持对正在运行的应用程序进行即时分析并记录执行的每条 Cortex-M 指令 116 | + 有关程序执行的完整代码覆盖率信息 117 | + 执行性能分析器和性能分析器支持程序优化 118 | + 大量示例项目可帮您快速熟悉强大的内置功能 119 | + 符合 CMSIS Cortex 微控制器软件接口标准 120 | 121 | 多种流行编译工具选择 122 | 123 | + Keil高效率C编译器; 124 | + ARM公司的ADS/RealView 编译器; 125 | + GNU GCC 编译器; 126 | + 后续厂商的编译器。 127 | 128 | ## 5、WIN ARM-GCC ARM 129 | 130 | WINARM 是一个免费的开发工具。 131 | 132 | WinARM 里面除了包含 C/C++ 编译器——GCC,汇编、连接器——Binutils,调试器——GDB等工具,也包括了通过 GDB 使用 Wiggler JTAG 的软件——OCDRemote。所以,所需要的工具都包括在了这个 WinARM 发行版中,就比较省心。 133 | 134 | 135 | 136 | 参考文献: 137 | 138 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 139 | 140 | 141 | 142 | [返回首页](https://github.com/timerring/hardware-tutorial) -------------------------------------------------------------------------------- /ARM-tutorial/A28 - Overview of ARM-related development tools.md: -------------------------------------------------------------------------------- 1 | - [ARM相关开发工具概述](#arm相关开发工具概述) 2 | - [JTAG仿真器](#jtag仿真器) 3 | - [J-LINK仿真调试器](#j-link仿真调试器) 4 | - [J-Link ARM主要特点](#j-link-arm主要特点) 5 | - [U-LINK仿真调试器](#u-link仿真调试器) 6 | - [ULINK2特点](#ulink2特点) 7 | - [ULINK和JLINK的比较](#ulink和jlink的比较) 8 | - [ADS1.2集成开发环境](#ads12集成开发环境) 9 | - [使用ADS创建工程](#使用ads创建工程) 10 | 11 | 12 | # ARM相关开发工具概述 13 | 14 | ## JTAG仿真器 15 | 16 | JTAG(Joint Test Action Group;联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试及对系统进行仿真、调试。 17 | 18 | JTAG 技术是一种嵌入式调试技术,它在芯片内部封装了专门的测试电路 TAP ( Test Access Port ,测试访问口),通过专用的 JTAG 测试工具对内部节点进行测试。 19 | 20 | JTAG接口还常用于实现ISP(In-System Programmer,在系统编程),对FLASH等器件进行编程。 21 | 22 | 通常所说的JTAG大致分两类,一类用于测试芯片的电气特性,检测芯片是否有问题;一类用于Debug,一般支持JTAG的CPU内都包含了这两个模块。 23 | 24 | 一个含有JTAG Debug接口模块的CPU,只要时钟正常,就可以通过JTAG接口访问CPU的内部寄存器和挂在CPU总线上的设备,如FLASH,RAM,SOC(比如4510B,44Box,AT91M系列)内置模块的寄存器,象UART,Timers,GPIO等等的寄存器。 25 | 26 | 现在多数的高级器件都支持JTAG协议,如:新型单片机如MSP430、ARM、DSP、FPGA器件等。 27 | 28 | 标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。 29 | 30 | 标准的 JTAG 接口是 4 线: TMS 、 TCK 、 TDI 、 TDO ,分别为测试模式选择、测试时钟、测试数据输入和测试数据输出。如今 JTAG 接口的连接有两种标准,即 14 针接口和 20 针接口,其定义分别如下所示。 31 | 32 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221228103453806.png) 33 | 34 | 14针的JTAG接口为老式接口。 35 | 36 | 引脚信号说明 37 | 38 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221228103552738.png) 39 | 40 | SAMSUNG ARM7 S3C44B0开发套件中的JTAG编程板电路如图 41 | 42 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221228103623561.png) 43 | 44 | S3C2440的官方JTAG编程板 45 | 46 | ![](https://raw.githubusercontent.com/timerring/picgo/master/picbed/image-20221228103650187.png) 47 | 48 | ## J-LINK仿真调试器 49 | 50 | J-Link是SEGGER公司为支持仿真ARM内核芯片推出的采用USB接口的JTAG仿真器。 51 | 52 | 配合IAR EWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有ARM7/ARM9/ARM11,Cortex M0/M1/M3/M4, Cortex A4/A8/A9等内核芯片的仿真,与IAR,Keil等编译环境无缝连接,操作方便、连接方便、简单易学,是学习开发ARM最好最实用的开发工具。 53 | 54 | ### J-Link ARM主要特点 55 | 56 | IAR EWARM集成开发环境无缝连接的JTAG仿真器。 57 | 58 | + 支持CPUs: Any ARM7/9/11, Cortex-A5/A8/A9, Cortex-M0/M1/M3/M4, Cortex-R4, RX610, RX621, RX62N, RX62T, RX630, RX631, RX63N。 59 | + 下载速度高达1 MByte/s。 60 | + 最高JTAG速度15 MHz。 61 | + 目标板电压范围1.2V –3.3V,5V兼容。 62 | + 自动速度识别功能。 63 | + 监测所有JTAG信号和目标板电压。 64 | + 完全即插即用。 65 | + 使用USB电源(但不对目标板供电) 66 | + 带USB连接线和20芯扁平电缆。 67 | + 支持多JTAG器件串行连接。 68 | + 标准20芯JTAG仿真插头。 69 | + 选配14芯JTAG仿真插头。 70 | + 选配用于5V目标板的适配器。 71 | + 带J-Link TCP/IP server,允许通过TCP/ IP网络使用J-Link。 72 | 73 | ## U-LINK仿真调试器 74 | 75 | Keil ULINK USB接口仿真器,是一款多功能ARM调试工具,可以通过JTAG 或 CODS 接口连接到目标系统,进行仿真或下载程序,目前已经成为国内主流的ARM开发工具。 76 | 77 | Keil ULINK的软件环境为Keil uVision Keil系列软件具有良好的调试界面,优秀的编译效果,丰富的使用资料。使其深受国内嵌入式开发工程师的喜爱。 78 | 79 | 目前,ULINK已经停产,新用户推荐选择ULINK2或ULINKPro仿真器。 80 | 81 | ULINK2是ARM公司最新推出的配套RealView MDK使用的仿真器,是ULink仿真器的升级版本。 82 | 83 | ULINK2不仅具有ULINK仿真器的所有功能,还增加了串行调试(SWD)支持,返回时钟支持和实时代理等功能。开发工程师通过结合使用RealView MDK的调试器和ULINK2,可以方便的在目标硬件上进行片上调试(使用on-chip JTAG, SWD和 OCDS)、Flash编程. 84 | 85 | ### ULINK2特点 86 | 87 | + 支持ARM7,ARM9, Cortex-M,8051和C166设备 88 | + JTAG速度高达10MHz 支持Cortex-M串行查看器(SWV)数据和时间跟踪,速度高达1Mbit/s(UART模式) 89 | + 执行、端口仿真和串行调试输出时的存储器读写实时代理 90 | + 与Keil μVision IDE和Debugger无缝隙集成 91 | + 宽目标电压,从2.7V – 5.5V可用 92 | + USB供电(无须电源) 93 | + 使用标准Windows USB设备,即插即用安装目标连接器 94 | 95 | ### ULINK和JLINK的比较 96 | 97 | ULINK是KEIL公司开发的仿真器,专用于KEIL平台下使用,ADS,IAR下不能使用 98 | 99 | JLINK是通用的开发工具,可以用于KEIL,IAR,ADS等平台速度,效率,功能均比ULINK强 100 | 101 | ULINK2的下载速度和调试速度确实没有JLINK的快。 102 | 103 | ## ADS1.2集成开发环境 104 | 105 | 基于Windows操作系统平台的ARM ADS(ARM Developer Suite)软件下进行的,该软件是由ARM公司提供的专门用于ARM 处理器应用开发和调试的综合性工具软件,目前使用的ADS1.2版本。 106 | 107 | ADS1.2主要包含CodeWarrior IDE、AXD两部分;CodeWarrior IDE工具主要用于工程的管理配置、源程序的编辑、编译和链接;AXD主要用于工程的下载和调试。 108 | 109 | CodeWarrior 集成开发环境(IDE)为管理和开发项目提供了简单多样化的图形用户界面。 用户可以使用ADS 的CodeWarrior IDE 为ARM 和Thumb 处理器开发用C,C++,或ARM汇编语言的程序代码。通过提供下面的功能,CodeWarrior IDE 缩短了用户开发项目代码的周期。 110 | 111 | ### 使用ADS创建工程 112 | 113 | + ARM Executabl Image:用于由ARM 指令的代码生成一个ELF 格式的可执行映像文件; 114 | + ARM Object Library:用于由ARM 指令的代码生成一个armar 格式的目标文件库; 115 | + Empty Project :用于创建一个不包含任何库或源文件的工程; 116 | + Makefile Importer Wizard :用于将Visual C 的nmake 或 GNU make 文件转入到CodeWarrior IDE 工程文件; 117 | + Thumb ARM Executable Image:用于由ARM 指令和Thumb 指令的混和代码生成一个可执行的ELF 格式的映像文件; 118 | + Thumb Executable image:用于由Thumb 指令创建一个可执行的ELF 格式的映像文件; 119 | + Thumb Object Library :用于由Thumb 指令的代码生成一个armar 格式的目标文件库。 120 | 121 | 122 | 参考文献: 123 | 124 | 孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017. 125 | 126 | 127 | 128 | [返回首页](https://github.com/timerring/hardware-tutorial) --------------------------------------------------------------------------------