第一篇:2013年北郵電子院計算機實習(xí)題目1——5 文字版
1.設(shè)計一個平均值計數(shù)器,有一個輸入窗口,可迅速算出輸入的一系列數(shù)字的平均值和方差;同時支持加載外部文本,可算出文本中列出數(shù)字的平均值和方差。
2.給出數(shù)字序列A,B的值和邏輯函數(shù)F的表達式(與,或,非,異或,同或等),生成A,B和F的波形圖。注:A,B序列可任意長度。
3.由數(shù)字信號處理原理可知:計算有限長數(shù)字序列線性卷積的公式為:
若x(n)???x(n),0?n?N?1
else?0,nh(n)???h(n),0?n?M?1 else?0,則y(n)?
m?0?x(m)h(n?m)0?n?N?M?1
h(n)??取x(n)???1,0?n?9
else?0,?0.5n,0?n?19 else?0,設(shè)計程序求出:
(1)輸出y(n)的值
(2)在圖形方式下以x軸為n,y軸分別為x(n),h(n),y(n)畫出其關(guān)系圖(圖上x軸單位長度可取5point,y軸單位長度可取20point)
4.每個同學(xué)自己設(shè)計一個多米諾骨牌動畫,時長不少于60秒。
5.模擬信號發(fā)生器
1.題目要求:
(1)調(diào)制方式:幅度調(diào)制,頻率調(diào)制。模擬信號和載波信號的頻率,幅值可變。調(diào)制信號頻率,幅值可變。
(2)畫出信號波形。
(3)對該信號采樣,并做文件存入磁盤中。
(4)可以適用多種調(diào)制方式。
第二篇:北郵電子院專業(yè)實驗報告
電子工程學(xué)院
ASIC專業(yè)實驗報告
班級: 姓名:
學(xué)號: 班內(nèi)序號:
第一部分 語言級仿真
LAB 1:簡單的組合邏輯設(shè)計一、二、實驗?zāi)康?實驗原理 掌握基本組合邏輯電路的實現(xiàn)方法。
本實驗中描述的是一個可綜合的二選一開關(guān),它的功能是當(dāng)sel = 0時,給出out = a,否則給出結(jié)果out = b。在Verilog HDL中,描述組合邏輯時常使用assign結(jié)構(gòu)。equal=(a==b)?1:0是一種在組合邏輯實現(xiàn)分支判斷時常用的格式。parameter定義的size參數(shù)決定位寬。測試模塊用于檢測模塊設(shè)計的是否正確,它給出模塊的輸入信號,觀察模塊的內(nèi)部信號和輸出信號。
三、源代碼
mux.v module scale_mux(out,sel,b,a);parameter size=1;output[size-1:0] out;input[size-1:0]b,a;input sel;assign out =(!sel)?a:
(sel)?b:
{size{1'bx}};endmodule
mux_test.v `define width 8 `timescale 1 ns/1 ns module mux_test;
reg[`width:1]a,b;
wire[`width:1]out;
reg sel;
scale_mux#(`width)m1(.out(out),.sel(sel),.b(b),.a(a));
initial
begin
$monitor($stime,“sel=%b a=%b b=%b out=%b”,sel,a,b,out);
$dumpvars(2,mux_test);
sel=0;b={`width{1'b0}};a={`width{1'b1}};
#5sel=0;b={`width{1'b1}};a={`width{1'b0}};
#5sel=1;b={`width{1'b0}};a={`width{1'b1}};
#5sel=1;b={`width{1'b1}};a={`width{1'b0}};
#5 $finish;
end endmodule
四、仿真結(jié)果與波形
LAB 2:簡單時序邏輯電路的設(shè)計一、二、實驗?zāi)康?實驗原理 掌握基本時序邏輯電路的實現(xiàn)。
在Verilog HDL中,相對于組合邏輯電路,時序邏輯電路也有規(guī)定的表述方式。在可綜合的Verilog HDL模型中,我們常使用always塊和@(posedge clk)或@(negedge clk)的結(jié)構(gòu)來表述時序邏輯。
在always塊中,被賦值的信號都必須定義為reg型,這是由時序邏輯電路的特點所決定的對于reg型數(shù)據(jù),如果未對它進行賦值,仿真工具會認為它是不定態(tài)。為了正確地觀察到仿真結(jié)果,在可綜合的模塊中我們通常定義一個復(fù)位信號rst-,當(dāng)它為低電平時對電路中的寄存器進行復(fù)位。
三、源代碼
counter.v `timescale 1 ns/100 ps module counter(cnt,clk,data,rst_,load);output[4:0]cnt;input [4:0]data;input
clk;input
rst_;input
load;reg
[4:0]cnt;
always@(posedge clk or negedge rst_)
if(!rst_)
#1.2 cnt<=0;
else
if(load)
cnt<=#3 data;
else
cnt<=#4 cnt + 1;
endmodule
counter_test.v `timescale 1 ns/1 ns module counter_test;
wire[4:0]cnt;
reg [4:0]data;
reg
rst_;
reg
load;
reg
clk;
counter c1
(.cnt(cnt),.clk(clk),.data(data),.rst_(rst_),.load(load));
initial begin
clk=0;
forever begin
#10 clk=1'b1;
#10 clk=1'b0;
end
end
initial begin
$timeformat(-9,1,“ns”,9);
$monitor(“time=%t,data=%h,clk=%b,rst_=%b,load=%b,cnt=%b”,$stime,data,clk,rst_,load,cnt);
$dumpvars(2,counter_test);
end task expect;input [4:0]expects;
if(cnt!==expects)begin
$display(“At time %t cnt is %b and should be %b”,$time,cnt,expects);
$display(“TEST FAILED”);
$finish;
end endtask initial begin
@(negedge clk)
{rst_,load,data}=7'b0_X_XXXXX;@(negedge clk)expect(5'h00);
{rst_,load,data}=7'b1_1_11101;@(negedge clk)expect(5'h1D);
{rst_,load,data}=7'b1_0_11101;
repeat(5)@(negedge clk);
expect(5'h02);
{rst_,load,data}=7'b1_1_11111;@(negedge clk)expect(5'h1F);
{rst_,load,data}=7'b0_X_XXXXX;@(negedge clk)expect(5'h00);
$display(“TEST PASSED”);
$finish;
end endmodule
四、仿真結(jié)果與波形
五、思考題
該電路中,rst-是同步還是異步清零端?
在counter.v的always塊中reset沒有等時鐘,而是直接清零。所以是異步清零端。
LAB 3:簡單時序邏輯電路的設(shè)計一、二、實驗?zāi)康?實驗原理 使用預(yù)定義的庫元件來設(shè)計八位寄存器。
八位寄存器中,每一位寄存器由一個二選一MUX和一個觸發(fā)器dffr組成,當(dāng)load=1,裝載數(shù)據(jù);當(dāng)load=0,寄存器保持。對于處理重復(fù)的電路,可用數(shù)組條用的方式,使電路描述清晰、簡潔。
三、源代碼
clock.v `timescale 1 ns /1 ns module clock(clk);reg clk;output clk;initial begin clk=0;forever begin #10 clk=1'b1;#10 clk=1'b0;end end endmodule
mux及dffr模塊調(diào)用代碼
mux mux7(.out(n1[7]),.sel(load),.b(data[7]),.a(out[7]));dffr dffr7(.q(out[7]),.d(n1[7]),.clk(clk),.rst_(rst_));mux mux6(.out(n1[6]),.sel(load),.b(data[6]),.a(out[6]));dffr dffr6(.q(out[6]),.d(n1[6]),.clk(clk),.rst_(rst_));mux mux5(.out(n1[5]),.sel(load),.b(data[5]),.a(out[5]));dffr dffr5(.q(out[5]),.d(n1[5]),.clk(clk),.rst_(rst_));mux mux4(.out(n1[4]),.sel(load),.b(data[4]),.a(out[4]));dffr dffr4(.q(out[4]),.d(n1[4]),.clk(clk),.rst_(rst_));
mux mux3(.out(n1[3]),.sel(load),.b(data[3]),.a(out[3]));dffr dffr3(.q(out[3]),.d(n1[3]),.clk(clk),.rst_(rst_));mux mux2(.out(n1[2]),.sel(load),.b(data[2]),.a(out[2]));dffr dffr2(.q(out[2]),.d(n1[2]),.clk(clk),.rst_(rst_));mux mux1(.out(n1[1]),.sel(load),.b(data[1]),.a(out[1]));dffr dffr1(.q(out[1]),.d(n1[1]),.clk(clk),.rst_(rst_));mux mux0(.out(n1[0]),.sel(load),.b(data[0]),.a(out[0]));dffr dffr0(.q(out[0]),.d(n1[0]),.clk(clk),.rst_(rst_));
例化寄存器
register r1(.data(data),.out(out),.load(load),.clk(clk),.rst_(rst_));例化時鐘
clock c1(.clk(clk));
添加檢測信號 initial begin $timeformat(-9,1,“ns”,9);$monitor(“time=%t,clk=%b,data=%h,load=%b,out=%h”, $stime,clk,data,load,out);$dumpvars(2,register_test);end
四、仿真結(jié)果與波形
LAB 4:用always塊實現(xiàn)較復(fù)雜的組合邏輯電路
一、實驗?zāi)康?/p>
掌握用always實現(xiàn)組合邏輯電路的方法;
了解assign與always兩種組合邏輯電路實現(xiàn)方法之間的區(qū)別。
二、實驗原理
僅使用assign結(jié)構(gòu)來實現(xiàn)組合邏輯電路,在設(shè)計中會發(fā)現(xiàn)很多地方顯得冗長且效率低下。適當(dāng)?shù)厥褂胊lways來設(shè)計組合邏輯,會更具實效。
本實驗描述的是一個簡單的ALU指令譯碼電路的設(shè)計示例。它通過對指令的判斷,對輸入數(shù)據(jù)執(zhí)行相應(yīng)的操作,包括加、減、或和傳數(shù)據(jù),并且無論是指令作用的數(shù)據(jù)還是指令本身發(fā)生變化,結(jié)果都要做出及時的反應(yīng)。
示例中使用了電平敏感的always塊,電平敏感的觸發(fā)條件是指在@后括號內(nèi)電平列表的任何一個電平發(fā)生變化就能觸發(fā)always塊的動作,并且運用了case結(jié)構(gòu)來進行分支判斷。
在always中適當(dāng)運用default(在case結(jié)構(gòu)中)和else(子if…else結(jié)構(gòu)中),通??梢跃C合為純組合邏輯,盡管被賦值的變量一定要定義為reg型。如果不使用default或else對缺省項進行說明,易產(chǎn)生意想不到的鎖存器。
三、源代碼
電路描述
always@(opcode or data or accum)begin if(accum==8'b00000000)#1.2 zero=1;else #1.2 zero=0;
case(opcode)PASS0: #3.5 out =accum;PASS1: #3.5 out =accum;ADD: #3.5 out = data + accum;AND: #3.5 out =data&accum;XOR: #3.5 out =data^accum;PASSD: #3.5 out=data;PASS6:#3.5 out=accum;PASS7:#3.5 out=accum;default:#3.5 out=8'bx;endcase end
四、仿真結(jié)果與波形
LAB 5:存儲器電路的設(shè)計一、二、實驗?zāi)康?實驗原理 設(shè)計和測試存儲器電路。
本實驗中,設(shè)計一個模塊名為mem的存儲器仿真模型,該存儲器具有雙線數(shù)據(jù)總線及異步處理功能。由于數(shù)據(jù)是雙向的,所以要注意,對memory的讀寫在時序上要錯開。
三、源代碼
自行添加的代碼
assign data=(read)?memory[addr]:8'hZ;
always @(posedge write)begin memory[addr]<=data[7:0];end
四、仿真結(jié)果與波形
LAB 6:設(shè)計時序邏輯時采用阻塞賦值與非阻塞賦值的區(qū)別
一、實驗?zāi)康?/p>
明確掌握阻塞賦值與非阻塞賦值的概念和區(qū)別; 了解阻塞賦值的使用情況。
二、實驗原理
在always塊中,阻塞賦值可以理解為賦值語句是順序執(zhí)行的,而非阻塞賦值可以理解為并發(fā)執(zhí)行的。實際時序邏輯設(shè)計中,一般情況下非阻塞賦值語句被更多的使用,有時為了在同一周期實現(xiàn)相互關(guān)聯(lián)的操作,也使用阻塞賦值語句。
三、源代碼
blocking.v `timescale 1 ns/ 100 ps
module blocking(clk,a,b,c);
output[3:0]b,c;
input [3:0]a;
input
clk;
reg
[3:0]b,c;
always@(posedge clk)
begin
b =a;
c =b;
$display(“Blocking: a=%d,b=%d,c=%d.”,a,b,c);
end endmodule
non_blocking.v `timescale 1 ns/ 100 ps module non_blocking(clk,a,b,c);
output[3:0] b,c;input[3:0] a;input clk;reg [3:0]b,c;always @(posedge clk)begin b<=a;c<=b;$display(“Non_blocking:a=%d,b=%d,c=%d”,a,b,c);end endmodule compareTop.v `timescale 1 ns/ 100 ps module compareTop;wire [3:0] b1,c1,b2,c2;reg[3:0]a;reg clk;initial begin clk=0;forever #50 clk=~clk;end initial $dumpvars(2,compareTop);initial begin a=4'h3;$display(“_______________________________”);# 100 a =4'h7;$display(“_______________________________”);# 100 a =4'hf;$display(“_______________________________”);# 100 a =4'ha;$display(“_______________________________”);# 100 a =4'h2;$display(“_______________________________”);# 100 $display(“_______________________________”);$finish;end non_blocking nonblocking(clk,a,b2,c2);blocking blocking(clk,a,b1,c1);endmodule
四、仿真結(jié)果與波形
LAB 7:利用有限狀態(tài)機進行復(fù)雜時序邏輯的設(shè)計一、二、實驗?zāi)康?實驗原理 掌握利用有限狀態(tài)機(FSM)實現(xiàn)復(fù)雜時序邏輯的方法。
控制器是CPU的控制核心,用于產(chǎn)生一系列的控制信號,啟動或停止某些部件。CPU何時進行讀指令,何時進行RAM和I/O端口的讀寫操作等,都由控制器來控制。
三、源代碼
補充代碼
nexstate<=state+1'h01;case(state)1:begin sel=1;rd=0;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 2:begin sel=1;rd=1;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 3:begin sel=1;rd=1;ld_ir=1;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 4:begin sel=1;rd=1;ld_ir=1;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 5:begin sel=0;rd=0;ld_ir=0;inc_pc=1;ld_pc=0;data_e=0;ld_ac=0;wr=0;if(opcode==`HLT)halt=1;end 6:begin sel=0;rd=alu_op;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 7:begin sel=0;rd=alu_op;ld_ir=0;halt=0;data_e=!alu_op;ld_ac=0;wr=0;if(opcode==`SKZ)inc_pc<=zero;if(opcode==`JMP)ld_pc=1;end 0:begin sel=0;rd=alu_op;ld_ir=0;halt=0;data_e=!alu_op;ld_ac=alu_op;inc_pc=(opcode==`SKZ)&zero||(opcode==`JMP);if(opcode==`JMP)ld_pc=1;if(opcode==`STO)wr=1;end //default:begin sel=1'bZ;rd=1'bZ;ld_ir=1'bZ;inc_pc=1'bZ;halt=1'bZ;ld_pc=1'bZ;data_e=1'bZ;ld_ac=1'bZ;wr=1'bZ;end endcase end
control_test.v /***************************** * TEST BENCH FOR CONTROLLER * *****************************/
`timescale 1 ns / 1 ns
module control_test;
reg [8:0] response [0:127];
reg [3:0] stimulus [0:15];
reg [2:0] opcode;
reg
clk;
reg
rst_;
reg
zero;
integer
i,j;
reg[(3*8):1] mnemonic;
// Instantiate controller
control c1(rd , wr , ld_ir , ld_ac , ld_pc , inc_pc , halt , data_e , sel , opcode , zero , clk , rst_);
// Define clock
initial begin
clk = 1;
forever begin
#10 clk = 0;
#10 clk = 1;
end
end
// Generate mnemonic for debugging purposes
always @(opcode)
begin
case(opcode)
3'h0
: mnemonic = “HLT”;
3'h1
: mnemonic = “SKZ”;
3'h2
: mnemonic = “ADD”;
3'h3
: mnemonic = “AND”;
3'h4
: mnemonic = “XOR”;
3'h5
: mnemonic = “LDA”;
3'h6
: mnemonic = “STO”;
3'h7
: mnemonic = “JMP”;
default : mnemonic = “???”;
endcase
end
// Monitor signals
initial
begin
$timeformat(-9, 1, “ ns”, 9);
$display(“ time
rd wr ld_ir ld_ac ld_pc inc_pc halt data_e sel opcode zero state”);
$display(“--------------------------------------------------------------”);//
$shm_open(“waves.shm”);//
$shm_probe(“A”);//
$shm_probe(c1.state);
end
// Apply stimulus
initial
begin
$readmemb(“stimulus.pat”, stimulus);
rst_=1;
@(negedge clk)rst_ = 0;
@(negedge clk)rst_ = 1;
for(i=0;i<=15;i=i+1)
@(posedge ld_ir)
@(negedge clk)
{ opcode, zero } = stimulus[i];
end
// Check response
initial
begin
$readmemb(“response.pat”, response);
@(posedge rst_)
for(j=0;j<=127;j=j+1)
@(negedge clk)
begin
$display(“%t %b %b %b
%b
%b
%b
%b
%b %b
%b
%b”,$time,rd,wr,ld_ir,ld_ac,ld_pc,inc_pc,halt,data_e,sel,opcode,zero,c1.state);
if({rd,wr,ld_ir,ld_ac,ld_pc,inc_pc,halt,data_e,sel}!==
response[j])
begin : blk
reg [8:0] r;
r = response[j];
$display("ERRORTEST1 PASSED!
111_00000
// 18
JMP BEGIN //run test again
@1A 00000000
// 1A
DATA_1:
//constant 00(hex)
11111111
// 1B
DATA_2:
//constant FF(hex)
10101010
// 1C
TEMP:
//variableTEST2 PASSED!
111_00000
// 11
JMP BEGIN
//run test again
@1A 00000001
// 1A
DATA_1:
//constant 1(hex)
10101010
// 1B
DATA_2:
//constant AA(hex)
11111111
// 1C
DATA_3:
//constant FF(hex)
00000000
// 1D
TEMP:
CPUtest3.dat //opcode_operand // addr
assembly code //--------------//-------------------------
111_00011
// 00
JMP LOOP
//jump to the address of LOOP @03 101_11011
// 03
LOOP:
LDA FN2
//load value in FN2 into accum
110_11100
// 04
STO TEMP
//store accumulator in TEMP
010_11010
// 05
ADD FN1
//add value in FN1 to accumulator
110_11011
// 06
STO FN2
//store result in FN2
101_11100
// 07
LDA TEMP
//load TEMP into the accumulator
110_11010
// 08
STO FN1
//store accumulator in FN1
100_11101
// 09
XOR LIMIT //compare accumulator to LIMIT
001_00000
// 0A
SKZ
//if accum = 0, skip to DONE
111_00011
// 0B
JMP LOOP
//jump to address of LOOP
000_00000
// 0C
DONE:
HLT
//end of program
101_11111
// 0D
AGAIN: LDA ONE
110_11010
// 0E
STO FN1
101_11110
// 0F
LDA ZERO
110_11011
// 10
STO FN2
111_00011
// 11
JMP LOOP
//jump to address of LOOP
@1A 00000001
// 1A
FN1:
//variablestores 2nd Fib.No.00000000
// 1C
TEMP:
//temporary variable
10010000
// 1D
LIMIT:
//constant 144stores 1st Fib.No.00000101
// 1B
data2:
//5
variablemax value
00000110
// 1E
LIMIT:
// 6
constant 1
11111111
// 1F
AND1:
//FF and
四、仿真結(jié)果與波形
第二部分 電路綜合一、二、三、四、實驗?zāi)康?實驗內(nèi)容 源代碼
門級電路仿真結(jié)果與波形 掌握邏輯綜合的概念和流程,熟悉采用Design Compiler進行邏輯綜合的基本方法。采用SYNOPSYS公司的綜合工具Design Compiler對實驗7的control.v做綜合。與實驗指導(dǎo)書中相同。
五、思考題
1.control_pad.v文件是verilog語言及的描述還是結(jié)構(gòu)化的描述?
是結(jié)構(gòu)化的描述。
2.control_pad.sdf文件中,對觸發(fā)器的延遲包括哪些信息?
包括對邏輯單元和管腳的上升/下降時延的最大值、最小值和典型值。
第三部分 版圖設(shè)計一、二、三、四、實驗?zāi)康?實驗內(nèi)容 源代碼
仿真結(jié)果與波形 掌握版圖設(shè)計的基本概念和流程,熟悉采用Sysnopsys ICC工具進行版圖設(shè)計的方法。對電路綜合輸出的門級網(wǎng)表control_pad.v進行布局布線。與實驗指導(dǎo)書中相同。布局規(guī)劃后結(jié)果
未產(chǎn)生core ring和mesh前
產(chǎn)生core ring和mesh后
電源線和電影PAD連接后
filler PAD填充后
布局后結(jié)果
時鐘樹綜合后結(jié)果
布線后結(jié)果
寄生參數(shù)的導(dǎo)出和后仿
五、思考題
1.簡述ICC在design setup階段的主要工作。
創(chuàng)建設(shè)計庫,讀取網(wǎng)表文件并創(chuàng)建設(shè)計單元,提供并檢查時間約束,檢查時鐘。在對之前的數(shù)據(jù)與信息進行讀取與檢查后保存設(shè)計單元。2.為什么要填充filler pad?
filler pad把分散的pad單元連接起來,把pad I/O區(qū)域供電連成一個整體。使它們得到持續(xù)供電并提高ESD保護能力。3.derive_pg_connection的作用是什么?
描述有關(guān)電源連接的信息。4.簡述floorplan的主要任務(wù)。
對芯片大小、輸入輸出單元、宏模塊進行規(guī)劃,對電源網(wǎng)絡(luò)進行設(shè)計。5.簡述place階段的主要任務(wù)。
對電路中的延時進行估計與分析,模擬時鐘樹的影響,按照時序要求,對標準化單元進行布局。
6.簡述CTS的主要步驟。
設(shè)置時鐘樹公共選項;綜合時鐘樹;重新連接掃描鏈;使能傳播時鐘;Post-CTS布局優(yōu)化;優(yōu)化時鐘偏移;優(yōu)化時序。
實驗總結(jié)
經(jīng)過數(shù)周的ASIC專業(yè)實驗,我對芯片設(shè)計流程、Verilog HDL語言、Linux基本指令和Vi文本編輯器有了基本的了解。雖然之前對芯片設(shè)計、VHDL一無所知,但通過實驗初步熟悉了ASIC的體系結(jié)構(gòu)和VHDL的基本語法,對電路中時鐘、寄生參數(shù)、元件布局帶來的影響也有了了解。我在實驗中也遇到了許多問題,但我在老師、助教、同學(xué)的幫助下解決了這些問題,也有了更多收獲。通過這次ASIC專業(yè)實驗,我加深了對本專業(yè)的認識。我會繼續(xù)努力成為合格的電子人。
第三篇:北郵電子院嵌入式實驗報告大四上
嵌入式實驗報告
學(xué)院: 電子工程學(xué)院
一、實驗?zāi)康?/p>
1、了解嵌入式系統(tǒng)及其相關(guān)基礎(chǔ)知識。
2、了解宿主PC機與PXA270目標版,能正確連接宿主PC機與PXA270目標版。
3、學(xué)會在宿主機上安裝Linux操作系統(tǒng)——RedHat9.0。、4、學(xué)會建立宿主PC機端的開發(fā)環(huán)境。
5、學(xué)會配置宿主PC機端的超級終端。
6、配置宿主PC機端的TFTP服務(wù),并開通此服務(wù)。
7、配置宿主PC機端的NFS服務(wù),并開通此服務(wù)。
8、學(xué)會簡單Linux驅(qū)動程序的設(shè)計。
二、實驗內(nèi)容
(一)基本實驗
實驗一到六為基礎(chǔ)實驗,主要是為了在熟悉實驗操作平臺的同時為后續(xù)實驗搭建好軟、硬件環(huán)境,配置好相關(guān)的協(xié)議、服務(wù)。
其中實驗一是各個硬件的互聯(lián),搭建好了實驗的硬件環(huán)境。實驗二是在宿主PC端安裝虛擬機,提供了實驗需要的Linux操作系統(tǒng)。實驗三是宿主PC端開發(fā)環(huán)境的安裝與配置。
實驗四是配置宿主PC機端的超級終端,使PC機與PXA270目標板之間可以通過串口通訊。在每次重啟宿主PC機時,都需要重新將超級終端掛載到虛擬機上,掛載之前須通過ifconfig命令查看該機的IP地址,若其已經(jīng)復(fù)位,須用命令:ifconfig eth0 192.168.0.100 up重置宿主PC機的IP地址。掛載虛擬機的代碼為:
root ifconfig eth0 192.168.0.50 up mount –o nolock 192.168.0.100:/ /mnt 實驗五是配置宿主PC機的TFTP服務(wù)。TFTP是簡單文件傳輸協(xié)議。每次重啟宿主PC機時,都要重啟該服務(wù),重啟命令為:
service xinetd restart。
實驗六是配置宿主PC機端NFS服務(wù)。NFS是指網(wǎng)絡(luò)文件系統(tǒng),它實現(xiàn)了文件在不同的系統(tǒng)間使用。當(dāng)使用者想用遠端檔案時,只需調(diào)用“mount”就可以遠端系統(tǒng)掛接在自己的檔案系統(tǒng)之下。每次重啟宿主PC機時,也都要重啟該服務(wù),重啟命令為: service nfs restart service nfs restart
(二)基本接口實驗
實驗
十二、簡單設(shè)備驅(qū)動程序
本次實驗的目的是讓我們動手實踐一個簡單的字符型設(shè)備驅(qū)動程序,學(xué)習(xí)Linux驅(qū)動程序構(gòu)架,學(xué)習(xí)在應(yīng)用程序中調(diào)用驅(qū)動。驅(qū)動程序代碼及注釋為: // 頭文件
#include
#define VERSION “PXA2700EP-SIMPLE_HELLO-V1.00-060530” // 定義版本號 void showversion(void)//顯示版本的函數(shù) { printk(“***************************************”);printk(“t %s tn”,VERSION);printk(“***************************************”);}
/*-------read:用于在指定文件描述符中讀取數(shù)據(jù) file:是文件指針 buf:讀取數(shù)據(jù)緩存區(qū) count:請求傳輸?shù)淖止?jié)數(shù) f_ops:文件當(dāng)前偏移量
當(dāng)讀取標識符OURS_HELLO_DEBUG時,打印信息,然后返回count----------*/ ssize_t SIMPLE_HELLO_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_HELLO_DEBUG
printk(“SIMPLE_HELLO_read[--kernel--]n”);#endif return count;}
/*-----write:用于向打開的文件寫數(shù)據(jù) file:是文件指針 buf:寫入數(shù)據(jù)緩存區(qū) count:求傳輸?shù)淖止?jié)數(shù) f_ops:文件當(dāng)前偏移量
當(dāng)讀取標識符OURS_HELLO_DEBUG時,打印信息,然后返回count----------*/ ssize_t SIMPLE_HELLO_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_HELLO_DEBUG
printk(“SIMPLE_HELLO_write[--kernel--]n”);#endif
return count;}
/*-----ioctl:對設(shè)備的I/O通道進行管理的函數(shù) inode:設(shè)備節(jié)點
flip:打開的一個文件
cmd:驅(qū)動程序的特殊命令編號 data:接收剩余參數(shù)
----------*/ ssize_t SIMPLE_HELLO_ioctl(struct inode * inode ,struct file * file, unsigned int cmd, long data){ #ifdef OURS_HELLO_DEBUG
printk(“SIMPLE_HELLO_ioctl[--kernel--]n”);#endif return 0;}
/*----------open:打開函數(shù)
inode:打開文件所對應(yīng)的i節(jié)點,獲取從設(shè)備號 flip:打開的一個文件
open()方法最重要的是調(diào)用了宏MOD_INC_USE_COUNT,這個宏主要用來使驅(qū)動程序使用計數(shù)器,避免不正確卸載程序
----------*/ ssize_t SIMPLE_HELLO_open(struct inode * inode ,struct file * file){ #ifdef OURS_HELLO_DEBUG
printk(“SIMPLE_HELLO_open[--kernel--]n”);#endif MOD_INC_USE_COUNT;return 0;}
/*----------released:關(guān)閉函數(shù)
Inode:打開文件所對應(yīng)的i節(jié)點,主要獲取從設(shè)備號 flip:打開的一個文件
release()方法最重要的是調(diào)用了宏MOD_DEC_INC_USE_COUNT,這個宏主要用來減少驅(qū)動程序使用計數(shù)器
----------*/ ssize_t SIMPLE_HELLO_release(struct inode * inode ,struct file * file){ #ifdef OURS_HELLO_DEBUG
printk(“SIMPLE_HELLO_release[--kernel--]n”);#endif MOD_DEC_INC_USE_COUNT;return 0;}
struct file_operations HELLO_ops ={ // SIMPLE_HELLO設(shè)備向系統(tǒng)注冊
open: SIMPLE_HELLO_open, read: SIMPLE_HELLO_read, write: SIMPLE_HELLO_write, ioctl: SIMPLE_HELLO_ioctl, release: SIMPLE_HELLO_release, };
/*----------INIT:驅(qū)動程序初始化
devfs_register_chrdev(SIMPLE_HELLO_MAJOR,“hello_serial_ctl”,& HELLO_ops)最為主要
devfs_register_chrdev注冊設(shè)備驅(qū)動程序,包括主設(shè)備號、驅(qū)動程序名、結(jié)構(gòu)體指針----------*/ static int __init HW_ HELLO_init(void){ int ret =-ENODEV;
ret = devfs_register_chrdev(SIMPLE_HELLO_MAJOR, “hello_serial_ctl”,& HELLO_ops);
showversion();
if(ret<0)
{
printk(“pxa270 init_module failed with %d n[--kernel--]”,ret);
}
else
{
printk(“pxa270 hello_driver register success!![--kernel--]n”);
} return ret;}
static int __init pxa270_ HELLO_init(void)//模塊初始化函數(shù),調(diào)用HW_ HELLO_init 函數(shù)
{ int ret =-ENODEV;
#ifdef OURS_HELLO_DEBUG
printk(“pxa270_ HELLO_init[--kernel--]n”);
#endif ret = HW_ HELLO_init();if(ret)return ret;return 0;}
/*----------模塊卸載函數(shù)
devfs_unregister_chrdev(SIMPLE_HELLO_MAJOR,“hello _ctl”)最為主要 devfs_unregister_chrdev卸載設(shè)備驅(qū)動程序,包括主設(shè)備號、驅(qū)動程序名
----------*/ static void __exit cleanup_ HELLO_ctl(void){ #ifdef OURS_HELLO_DEBUG
printk(“cleanup_HELLO_ctl[--kernel--]n”);#endif devfs_unregister_chrdev(SIMPLE_HELLO_MAJOR, “hello_ctl”);}
MODULE_DESCRIPTION(“simple hello driver module”);//描述信息 MODULE_AUTHOR(“l(fā)iduo”);
//驅(qū)動程序作者姓名 MODULE_LICENSE(“GPL”);module_init(pxa270_HELLO_init);
//指定驅(qū)動程序初始化函數(shù) module_exit(cleanup _HELLO_ctl);
//指定驅(qū)動程序卸載函數(shù)
Makefile文件代碼:
#TOPDIR:=$(shell cd..;pwd)TOPDIR:=.KERNELDIR=/pxa270_linux/linux INCLUDEDIR=$(KERNELDIR)/include CROSS_COMPILE=arm-linux-
AS =$(CROSS_COMPILE)as LD =$(CROSS_COMPILE)ld CC =$(CROSS_COMPILE)gcc CPP =$(CC)-E AR =$(CROSS_COMPILE)ar NM =$(CROSS_COMPILE)nm STRIP =$(CROSS_COMPILE)strip OBJCOPY=$(CROSS_COMPILE)objcopy OBJDUMP=$(CROSS_COMPILE)objdump
CFLAGS+=-I..CFLAGS+=-Wall –O –D_KERNEL_-DMODULE –I$(INCLUDEDIR)
TARGET = pxa270_hello_drv.o modules: $(TARGET)
all: $(TARGET)
pxa270_hello_drv.o:pxa270_hello_drv.c $(CC)-c $(CFLAGS)$^-o $@
clean: rm-f *.o *~ core.depend Makefile文件的內(nèi)容用于執(zhí)行編譯工作,一個Makefile文件包括:① 由make工具創(chuàng)建的目標體(target),通常是目標文件或可執(zhí)行文件;② 要創(chuàng)建目標體所依賴的文件(dependency_file);③ 創(chuàng)建每個目標需要運行的命令(command)。
以上兩個文件編輯完成后后,用make modules編譯驅(qū)動程序,編寫測試文件simple_test_driver.c,然后GCC編輯器編譯測試程序生成測試文件。成功生成測試文件后用超級終端開始掛載,加載驅(qū)動程序,使用命令./test測試,觀察測試結(jié)果,實驗完成。
實驗十三 CPU GPIO驅(qū)動程序設(shè)計
本實驗是讓我們在linux系統(tǒng)中插入自己的驅(qū)動程序,調(diào)用它。實現(xiàn)用CPU GPIO控制外部LED,利用PXA270核心板上的LED驗證我們的工作。驅(qū)動程序代碼:
驅(qū)動程序代碼與實驗十二無大區(qū)別,下面列出需要補充的代碼。
一、補充代碼
補充代碼1:
#ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_write [--kernel--]n”);#endif return count;
補充代碼2:
#ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_open [--kernel--]n”);#endif
補充代碼3:
open: SIMPLE_GPIO_LED_open, read: SIMPLE_GPIO_LED_read, write: SIMPLE_GPIO_LED_write, ioctl: SIMPLE_GPIO_LED_ioctl, release: SIMPLE_GPIO_LED_release, 不同之處:GPIO_LED,主文件名、二、Makefile文件:
將實驗十二相關(guān)代碼作如下修改即可: TARGET = pxa270_gpio_led_drv.o modules: $(TARGET)
all: $(TARGET)
pxa270_gpio_led_drv.o:pxa270_gpio_led_drv.c $(CC)-c $(CFLAGS)$^-o $@
三、作業(yè)代碼
要求:使得目標板的核心板上的LED閃爍產(chǎn)生亮7秒,滅5秒的效果。作業(yè)主要代碼:
while(1)
{ ioctl(fd,LED_OFF);
sleep(5);//原來為sleep(1);
ioctl(fd,LED_ON);sleep(7);//原來為sleep(1); }
不同之處:改變代碼中加粗位置括號數(shù)字,可以改變燈亮和熄滅的時間比
四、測試顯示
測試時,超級終端上的顯示如下:
實驗十四 中斷實驗
本實驗是讓我們學(xué)習(xí)中斷的相關(guān)概念,以及Linux系統(tǒng)是如何處理中斷的,并且學(xué)會編寫獲取和處理外中斷的驅(qū)動程序。
一、補充代碼
補充代碼1:
printk(“*****************************************n”);printk(“t %s tn”,VERSION);printk(“************************************************nn”);補充代碼2:
#ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_read [--kernel--]n”);#endif return count;
補充代碼3:
#ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_write [--kernel--]n”);#endif return count;
補充代碼4:
open: SIMPLE_INT_open, read: SIMPLE_INT_read, write: SIMPLE_INT_write, ioctl: SIMPLE_INT_ioctl, release: SIMPLE_INT_release, 二、Makefile文件如實驗十三做相應(yīng)修改。
三、測試時,超級終端上顯示如下:
實驗十五 數(shù)碼管顯示驅(qū)動實驗
本實驗中,我們要編驅(qū)動程序以實現(xiàn)在Linux系統(tǒng)下控制LED數(shù)碼管的顯示。
一、補充代碼
補充代碼1:
printk(“*****************************************n”);printk(“t %s tn”,VERSION);printk(“************************************************nn”);
補充代碼2: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_read [--kernel--]n”);#endif return count;
補充代碼3: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_write [--kernel--]n”);#endif return count;
補充代碼4: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_ioctl [--kernel--]n”);#endif return 0;
補充代碼5: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_open [--kernel--]n”);#endif MOD_INC_USE_COUNT;return 0;
補充代碼6: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_release [--kernel--]n”);#endif MOD_DEC_USE_COUNT;return 0;
補充代碼7: open: SERIAL_LED_open, read: SERIAL_LED_read, write: SERIAL_LED_write, ioctl: SERIAL_LED_ioctl, release: SERIAL_LED_release
補充代碼8: int ret =-ENODEV;ret = devfs_register_chrdev(SERIAL_LED_MAJOR, “serial_led_ctl”, &SERIAL_LED_ops);Showversion();If(ret<0){ printk(“pxa270 init_module failed with %dn [--kernel--]”,ret);return ret;} else { printk(“pxa270 serial_led_driver register success!![--kernel--]n”);} return ret;
補充代碼9: int ret =-ENODEV;#ifdef OURS_HELLO_DEBUG printk(“pxa270_SERIAL_LED_init [--kernel--]n”);#endif ret = HW_SERIAL_LED_init();if(ret)return ret;return 0;
補充代碼10: #ifdef OURS_HELLO_DEBUG printk(“cleanup_SERIAL_LED [--kernel--]n”);#endif devfs_unregister_chrdev(SERIAL_LED_MAJOR, “serial_led”);
補充代碼11: MODULE_DESCRIPTION(“serial_led driver module”);MODULE_AUTHOR(“l(fā)iduo”);MODULE_LICENSE(“GPL”);module_init(pxa270_SERIAL_LED_init);module_exit(cleanup_SERIAL_LED);
二、Makefile文件與實驗十四相同,只需作相應(yīng)修改即可
三、作業(yè)代碼
1、實現(xiàn)目標板上的LED數(shù)碼管循環(huán)顯示數(shù)字9-0。
for(count=0;count<10;count++)
{ data[0] = buf[9-count];//原來為data[0] = buf[count] ret=write(fd,data,1);sleep(1);} 修改之處:將顯示的數(shù)有buf[count]改為buf[9-count],實現(xiàn)反向循環(huán)顯示。
2、實現(xiàn)目標板上的LED數(shù)碼管循環(huán)顯示數(shù)字2、4、6、8、0或者8、6、4、2、0。代碼: for(count=0;count<10;count+=2)//原來為count++
{data[0] = buf[count];ret=write(fd,data,1);sleep(1);}
修改之處:修改count的變化方式,讓其每次增加2,而不是1,使0、2、4、6、8循環(huán)顯示,如要循環(huán)顯示8、6、4、2、0的話,只要在上述代碼中將buf[count]改為buf[8-count]即可。
四、測試顯示:
測試時,顯示如下:
作業(yè)1: 作業(yè)2:
實驗十六 LED點陣驅(qū)動程序設(shè)計
本實驗要求我們學(xué)會編寫驅(qū)動程序,實現(xiàn)在Linux系統(tǒng)下控制LED點陣顯示,并在此基礎(chǔ)上稍加改進,實現(xiàn)對LED的控制。驅(qū)動程序代碼:
一、補充代碼
補充代碼1:
printk(“*****************************************n”);printk(“t %s tn”,VERSION);printk(“************************************************nn”);
補充代碼2:
#ifdef OURS_LED_DEBUG printk(“SIMPLW_LED_read [--kernel--]n”);#endif return count;
補充代碼3:
#ifdef OURS_LED_DEBUG printk(“SIMPLE_LED_ioctl [--kernel--]n”);#endif return 0;
補充代碼4:
open: SIMPLE_LED_open, read: SIMPLE_LED_read, write: SIMPLE_LED_write, ioctl: SIMPLE_LED_ioctl, release: SIMPLE_LED_release
補充代碼5:
int ret =-ENODEV;#ifdef OURS_LED_DEBUG printk(“pxa270_LED_CTL_init [--kernel--]n”);#endif ret = HW_LED_CTL_init();if(ret)return ret;return 0;
補充代碼6:
#ifdef OURS_LED_DEBUG printk(“cleanup_LED_ctl [--kernel--]n”);#endif devfs_unregister_chrdev(SIMPLE_LED_MAJOR, “l(fā)ed_ctl”);
二、Makefile程序仍然可以用前一個實驗的,只要把相關(guān)函數(shù)名改了就可以,此處不再贅述。
三、作業(yè)代碼
1、按橫方向隔行掃描led點陣數(shù)碼管。代碼:
for(i=1;i<=4;i++){ //原來為i<8
buf[0]=c;
buf[1]=~r;// row
for(j=1;j<=8;j++){
write(fd,buf,2);
printf(“buf[0],buf[1]: [%x,%x]n”,buf[0],buf[1]);
usleep(200000);// sleep 0.2 second
c = c<<1;
buf[0]=c;// column
}
c = 1;
r = r<<2;
} //原來為r=r<<1
修改之處:外層for循環(huán)中間i<8改為i<4,同時,將else中的r=r<<1改為r<<2。這樣就可以讓點陣在顯示時跳躍一行進行顯示。
2、按豎方向順序掃描led點陣數(shù)碼管。代碼:
for(i=1;i<=8;i++){
buf[0]=c;
buf[1]=~r;// row
for(j=1;j<=8;j++){
write(fd,buf,2);
printf(“buf[0],buf[1]: [%x,%x]n”,buf[0],buf[1]);
usleep(200000);// sleep 0.2 second
r = r<<1;//原來此處為c=c<<1 buf[1]=~r;//原來此處為buf[1]=~c } r = 1;//原來此處為c=1 c = c<<1;//原來此處為r=r<<1 修改之處(現(xiàn)對于最初的測試程序,而不是作業(yè)1的測試程序):將r和c 進行對調(diào)。實現(xiàn)將橫和豎的對調(diào),已達到豎方向掃描的目的。四、測試顯示
測試時,超級終端顯示如下:
作業(yè)1: 作業(yè)2:
實驗十七 AD驅(qū)動程序
本實驗要求我們學(xué)會編寫驅(qū)動程序?qū)δM量輸入進行采集,并轉(zhuǎn)換為數(shù)字量顯示在超級終端上,從而實現(xiàn)AD轉(zhuǎn)換。
驅(qū)動程序代碼
一、補充代碼
補充代碼1:
printk(“*****************************************n”);printk(“t %s tn”,VERSION);
printk(“************************************************nn”);
補充代碼2:
#ifdef OURS_HELLO_DEBUG printk(“SIMPLE_HELLO_read [--kernel--]n”);#endif return count;
補充代碼3:
#ifdef OURS_HELLO_DEBUG printk(“SIMPLE_HELLO_write [--kernel--]n”);#endif return count;
補充代碼4:
#ifdef OURS_HELLO_DEBUG printk(“SIMPLE_HELLO_open [--kernel--]n”);#endif MOD_INC_USE_COUNT;return 0;
補充代碼5:
#ifdef OURS_HELLO_DEBUG printk(“SIMPLE_HELLO_release [--kernel--]n”);#endif MOD_DEC_USE_COUNT;return 0;
補充代碼6:
open: SIMPLE_HELLO_open, read: SIMPLE_HELLO_read, write: SIMPLE_HELLO_write, ioctl: SIMPLE_HELLO_ioctl, release: SIMPLE_HELLO_release
補充代碼7:
ad_ucb = ucb1x00_get();
int ret =-ENODEV;ret = devfs_register_chrdev(ADCTL_MAJOR, “ad_ctl”, &adctl_ops);Showversion();If(ret<0){ printk(“pxa270 init_module failed with %dn [--kernel--]”,ret);return ret;} else { printk(“pxa270 serial_led_driver register success!![--kernel--]n”);} return ret;
補充代碼8:
int ret =-ENODEV;#ifdef OURS_HELLO_DEBUG printk(“pxa270_AD_CTL_init [--kernel--]n”);#endif ret = HW_AD_CTL_init();if(ret)return ret;return 0;
補充代碼9:
#ifdef OURS_HELLO_DEBUG printk(“cleanup_AD_ctl [--kernel--]n”);#endif devfs_unregister_chrdev(ADCTL_MAJOR, “ad_ctl”);
二、Makefile文件可以用前一個程序的文件,只要將相應(yīng)部分的代碼修改即可
三、作業(yè)代碼
要求:將UCB_ADC_INP_AD0換為其他通道并觀察。代碼:
for(i=0;i<50;i++)
{ Val0 = ioctl(fd,UCB_ADC_INP_AD1,0);usleep(100);val1 = ioctl(fd,UCB_ADC_INP_AD0,0);printf(“val0 = %dtval1 = %dn”,val0,val1;usleep(500000);
}
修改之處:只需交換AD1和AD0即可實現(xiàn)輸出通道的改變。四、測試時顯示
測試時、超級終端顯示如下:
實驗十八 DA驅(qū)動程序
本實驗要求我們編寫驅(qū)動程序,實現(xiàn)將數(shù)字信號轉(zhuǎn)換成模擬信號并在示波器上顯示出模擬信號波形,即實現(xiàn)DA轉(zhuǎn)換。驅(qū)動程序代碼:
一、補充代碼
補充代碼1:
#include“../AD/pxa_ad_drv.h” /引用AD驅(qū)動程序的頭文件/
補充代碼2:
printk(“*****************************************n”);printk(“t %s tn”,VERSION);
printk(“************************************************nn”);
補充代碼3:
#ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_read [--kernel--]n”);#endif return count;
補充代碼4:
#ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_write [--kernel--]n”);#endif return count;
補充代碼5:
#ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_ioctl [--kernel--]n”);#endif return 0;
補充代碼6:
#ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_open [--kernel--]n”);#endif MOD_INC_USE_COUNT;return 0;
補充代碼7:
open: SIMPLE_DA_open, read: SIMPLE_DA_read, write: SIMPLE_DA_write, ioctl: SIMPLE_DA_ioctl, release: SIMPLE_DA_release
補充代碼8:
int ret =-ENODEV;ret = devfs_register_chrdev(SIMPLE_DA_MAJOR, “DA_ctl”, &DA_ctl_ops);Showversion();If(ret<0){ printk(“pxa270 init_module failed with %dn [--kernel--]”,ret);return ret;} else { printk(“pxa270 serial_led_driver register success!![--kernel--]n”);} return ret;
補充代碼9:
int ret =-ENODEV;#ifdef OURS_DA_DEBUG printk(“pxa270_DA_CTL_init [--kernel--]n”);#endif ret = HW_DA_CTL_init();if(ret)return ret;return 0;
補充代碼10:
#ifdef OURS_DA_DEBUG printk(“cleanup_DA_ctl [--kernel--]n”);#endif devfs_unregister_chrdev(SIMPLE_DA_MAJOR, “DA_ctl”);補充代碼11:
MODULE_DESCRIPTION(“serial_led driver module”);MODULE_AUTHOR(“l(fā)iduo”);MODULE_LICENSE(“GPL”);module_init(pxa270_DA_CTL_init);module_exit(cleanup_DA_ctl);
二、Makefile文件可以繼續(xù)用前面程序Mekefile的代碼,只需要將相應(yīng)部分的代碼修改即可。
三、作業(yè)代碼
要求:輸出三角波。代碼:(需要修改部分)
//---------------------print--------------------void da_create_sin(int fd){ unsigned char buf[(int)POINT];unsigned char*c;unsigned long I;int j;double x;for(j=0;j
x=(j/POINT)*(5*M_PI);//此處原來為x=sin((j/POINT
//*(2*M_PI))#ifdef OURS_DEBUG printf(“%ft”,x);#endif buf[j] =(unsigned char)255*(x/2+1)/2;#ifdef OURS_DEBUG printf(“%xn”, buf[j]);#endif } printf(“create sin waven”);printf(“Use”Ctrl + c“quit the functionn”);while(1){ c = buf;for(j=0;j
四、測試顯示:(以下為三角波)
(以下為sin)
三、實驗總結(jié):
在本次嵌入式實驗中,我們首先在老師的指導(dǎo)下了解了嵌入式系統(tǒng),初步接觸了Linux環(huán)境。我們的實驗板是OURS-PXA270-EP,它是一款基于INTEL XSCALE PXA270處理器,針對高校嵌入式系統(tǒng)教學(xué)和實驗科研的平臺。這款設(shè)備主要包括核心板與底板兩個部分,核心板主要集成了高速的PXA270 CPU,配套的存儲器,網(wǎng)卡等設(shè)備;底板主要是各種類型的接口與擴展口。
了解了實驗的平臺后,在接下來的基本實驗中我們學(xué)會了嵌入式開發(fā)系統(tǒng)硬件環(huán)境的搭建、Linux操作系統(tǒng)RedHat9的安裝、軟件環(huán)境的搭建,以及配置超級終端,配置通訊服務(wù)。這些實驗內(nèi)容只要按照實驗指導(dǎo)書上的步驟一步一步做即可,不會出現(xiàn)難以解決的問題,一般都會做的很順利。有三個需要注意的地方時,在配置端口時,一定要確定實驗箱接的是端口一,還是端口二。否則會出現(xiàn)無法建立呼叫的問題(其表現(xiàn)為超級終端接口內(nèi)沒有輸出內(nèi)容)。其次要確定虛擬機上網(wǎng)橋的設(shè)定是否正確。不然也會出現(xiàn)無法呼叫現(xiàn)象。最后,要確定網(wǎng)線是否連接上。在實驗時,由于有些電腦的網(wǎng)線接口有斷裂的現(xiàn)象,如果插口沒接好的話,將會出現(xiàn)nfs連接錯誤。
在基本實驗之后,進行的就是接口實驗??偟膩碚f,實驗的難度不大。當(dāng)然這是建立在對實驗代碼有一定理解的基礎(chǔ)之上的。在實驗十二中,我們對實驗的接口代碼規(guī)則已經(jīng)有了一定的了解。而之后的幾個實驗都是基于實驗十二進行相應(yīng)的改動即可。所以完成下來難度不是很大。而對應(yīng)的作業(yè)中,我們僅需要對測試代碼進行相應(yīng)的改寫。在對c語言有一定的了解的前提下,可以很容易相應(yīng)代碼所實現(xiàn)的功能,僅需要對相應(yīng)代碼做些修改即可。
不過,值得注意的還有兩點,第一:代碼的編寫一定要符合規(guī)則,同時,代碼的輸入要避免輸入錯誤。否則,在需要一次一次編譯一次次查看錯誤一次次改正錯誤,這會是個費時費力的工作。第二:每次實驗時,需要從新設(shè)定虛擬機的ip,即每次實驗開始時都需要重復(fù)做實驗五實驗六。不然在掛載時會出現(xiàn)無法掛載的現(xiàn)象。
通過這次實驗,我對嵌入式編程有了更深層次的理解,加深了我對理論知識的認識,有助于今后的學(xué)習(xí)和工作。感謝黃惠英老師的細心指導(dǎo)。
第四篇:北郵論文題目
附件1:
畢業(yè)設(shè)計參考題目
一、通信類(30個)
? ×××寬帶接入網(wǎng)規(guī)劃設(shè)計
? ×××小區(qū)EPON光纖接入網(wǎng)規(guī)劃設(shè)計方案? ××ADSL寬帶接入網(wǎng)設(shè)計
? ××GSM網(wǎng)擴容工程基站建設(shè)的規(guī)劃設(shè)計? ××SDH傳輸網(wǎng)規(guī)劃設(shè)計(優(yōu)化)方案? ××TD-SCDMA室內(nèi)解決方案? ××TD-SCDMA無線網(wǎng)絡(luò)規(guī)劃/優(yōu)化? ××WCDMA無線網(wǎng)絡(luò)規(guī)劃/優(yōu)化? ××WLAN的規(guī)劃設(shè)計方案
? ××本地網(wǎng)智能化改造及××業(yè)務(wù)的實現(xiàn)? ××地區(qū)××公司關(guān)口局的設(shè)計? ××地區(qū)××公司軟交換關(guān)口局的設(shè)計? ××地區(qū)ASON網(wǎng)絡(luò)設(shè)計方案? ××地區(qū)DWDM傳輸網(wǎng)絡(luò)設(shè)計方案? ××地區(qū)雙向HFC接入網(wǎng)絡(luò)的設(shè)計
? ××多媒體技術(shù)(如視頻會議/VOIP/VOD等)在××地區(qū)通信網(wǎng)
? ××公司VOIP網(wǎng)的規(guī)劃與設(shè)計? ××光纖接入網(wǎng)規(guī)劃設(shè)計? ××寬帶IP城域網(wǎng)的規(guī)劃設(shè)計
? ××市××公司NGN(軟交換)網(wǎng)絡(luò)設(shè)計方案? ××市CDMA移動通信網(wǎng)無線規(guī)劃(優(yōu)化)? ××市GSM無線網(wǎng)絡(luò)優(yōu)化
? ××市TETRA(數(shù)字集群通信系統(tǒng))規(guī)劃/優(yōu)化? ××無線系統(tǒng)(網(wǎng)絡(luò)優(yōu)化)方案設(shè)計? ××智能業(yè)務(wù)在××本地網(wǎng)的實現(xiàn)? ××綜合樓GSM網(wǎng)絡(luò)的室內(nèi)分布設(shè)計? 3G網(wǎng)絡(luò)規(guī)劃、優(yōu)化、測試等方向的自選題? 流媒體技術(shù)及其在××地區(qū)中的應(yīng)用
? 通信網(wǎng)(固網(wǎng)或者移動網(wǎng)絡(luò))網(wǎng)絡(luò)管理方面自擬題目? 網(wǎng)絡(luò)電視(IPTV)技術(shù)在××地區(qū)中的應(yīng)用
二、計算機類(12個)
? ×××局域網(wǎng)優(yōu)化(升級)方案設(shè)計? XX大學(xué)學(xué)籍管理系統(tǒng)開發(fā)與設(shè)計? XX電信計費系統(tǒng)的設(shè)計與實現(xiàn)? XX公司人事信息管理系統(tǒng)的設(shè)計與實現(xiàn)? XX圖書館信息管理系統(tǒng)的設(shè)計與實現(xiàn)? XX系統(tǒng)數(shù)據(jù)庫優(yōu)化的設(shè)計與實現(xiàn)
? 基于數(shù)據(jù)庫技術(shù)的某網(wǎng)站設(shè)計與實現(xiàn)? 某公司/學(xué)校網(wǎng)絡(luò)方案規(guī)劃與設(shè)計? 某管理信息系統(tǒng)的設(shè)計與實現(xiàn)? 網(wǎng)絡(luò)安全策略的研究與應(yīng)用? 網(wǎng)上遠程考試系統(tǒng)的設(shè)計與實現(xiàn)? ××局域網(wǎng)(校園網(wǎng))的規(guī)劃設(shè)計
三、管理與營銷類(14個)
? ××公司××類人員績效考核的研究? ××公司××類人員薪酬管理的研究? ××公司員工培訓(xùn)的研究
? ××郵政儲蓄銀行發(fā)展××業(yè)務(wù)的策略研究? ××郵政局(公司)現(xiàn)代物流發(fā)展(營銷)策略? ××郵政局××業(yè)務(wù)發(fā)展策略探討? 關(guān)于××公司寬帶業(yè)務(wù)營銷策略的探討? 關(guān)于××公司提升服務(wù)質(zhì)量的對策研究
? 關(guān)于××公司提升客戶滿意度的策略研究? 關(guān)于××公司營銷渠道建設(shè)與管理的探討? 關(guān)于××公司運維管理的精細化研究? 關(guān)于××公司增值業(yè)務(wù)發(fā)展策略的探討
? 關(guān)于××通信公司大(商務(wù))客戶營銷策略的研究? 關(guān)于××通信企業(yè)防止客戶流失的策略研究
第五篇:【2011】北郵網(wǎng)研院和計算機院復(fù)試上機題目
2011北郵網(wǎng)研院復(fù)試上機題目
A、字符串操作
Accept:93 Submit:1212 Time Limit:1000MS Memory Limit:65536KB 請仔細閱讀“考前必讀”
Description
大家平時都會用到字符串,現(xiàn)在有幾種字符串操作,需要你用這幾種操作處理下字符串。
Input
多組數(shù)據(jù),以EOF結(jié)束。
第一行一個字符串,字符串長度大于0,并且小于等于200。第二行一個數(shù)字t,(0 共有兩種操作,每行數(shù)據(jù)的第一個數(shù)表示操作的種類: 翻轉(zhuǎn)操作:第一個是一個數(shù)字0,然后兩個數(shù)字i和len,翻轉(zhuǎn)從下標i長度為len的子串。 替換操作:第一個是一個數(shù)字1,然后兩個數(shù)字i和len,接著一個長度為len的字符串str,用str替換從下標i長度為len的子串。字符串操作后會更新,舊的字符串被舍棄。(詳見sample)Output 每個操作之后輸出生成的新的字符串 Sample Input bac 2 0 0 3 1 1 2 as Sample Output cab cas Hint 字符串下標從0開始,所有操作的數(shù)據(jù)范圍都合乎規(guī)范。 B、虛數(shù) Accept:36 Submit:448 Time Limit:1000MS Memory Limit:65536KB 請仔細閱讀“考前必讀” Description 給你一個復(fù)數(shù)集合{Aj+i*Bj},保證Aj和Bj都是整數(shù),初始為空集。 每次會給你如下兩種操作中的一種: 1.“Insert x+iy”,其中x,y都是整數(shù)。表示在集合中加入一個復(fù)數(shù) x+iy,同時輸出此時集合的大?。?/p> 2.“Pop”。如果集合為空集直接返回“Empty!”,如果有元素則以“x+iy”的形式顯示集合中模值最大的復(fù)數(shù),然后將該元素從集合中刪除,之后在第二行顯示操作之后的集合大小,如果為空集則顯示“Empty!”。 Input 第一行只有一個數(shù)T,代表case數(shù)。0<=T<=10 每一組case: 第一行有一個整數(shù)n,表示這組case中一共有n條命令 0 保證不會輸入兩個模值同樣的元素,并保證實部虛部都大于0,小于1000。 Output 依照上述原則輸出每一個命令對應(yīng)的輸出 如果輸入命令是Insert命令,則對應(yīng)的輸出占一行為集合大小; 如果輸入命令是Pop命令,則對應(yīng)的輸出占一行或者兩行,為模值最大的復(fù)數(shù)和集合大小。 請注意,輸出集合大小的格式為“Size:空格x回車”,x為集合大小 Sample Input 5 Pop Insert 1+i2 Insert 2+i3 Pop Pop Sample Output Empty!Size: 1 Size: 2 2+i3 Size: 1 1+i2 Empty! C、中序遍歷樹 Accept:0 Submit:18 Time Limit:1000MS Memory Limit:65536KB 請仔細閱讀“考前必讀” Description 給一棵樹,你可以把其中任意一個節(jié)點作為根節(jié)點。每個節(jié)點都有一個小寫字母,中序遍歷,得到一個字符串,求所有能得到的字符串的字典序最小串。因為這棵樹不一定是二叉樹,所以中序遍歷時,先中序遍歷以節(jié)點序號最小的節(jié)點為根的子樹,然后再遍歷根節(jié)點,最后根據(jù)節(jié)點序號從小到大依次中序遍歷剩下的子樹。 Input 多組數(shù)據(jù),以EOF結(jié)束。 第一行一個數(shù)n(0 接下來n-1行,每行兩個數(shù)a,b,(0<=a,b Output 題中要求的最小的字符串 Sample Input 3 bac 0 1 1 2 4 abcd 0 1 0 2 0 3 Sample Output bac bacd Hint 意思就是請枚舉所有的點為根,然后中序遍歷 最后輸出所有結(jié)果中字典序最小的 比如說第二組數(shù)據(jù) 以0為根時結(jié)果為 bacd 以1為根時結(jié)果為 cadb 以2為根時結(jié)果為 badc 以3為根時結(jié)果為 bacd 所以字典序最小的是bacd D、first集 Accept:0 Submit:17 Time Limit:1000MS Memory Limit:65536KB 請仔細閱讀“考前必讀” Description 對于文法,給出求first集的算法,讓大家求first集。輸入中大寫字母表示非終結(jié)符,小寫字母表示終結(jié)符,#表示空也是終結(jié)符。First集求解算法如下: 為了求每個符號的first集,連續(xù)使用以下規(guī)則,直到每個符號的first集不再增大為止。 1.對于終結(jié)符,它的first集就是它自己。 2.對于非終結(jié)符,如果有產(chǎn)生式 X-> a...,把a加入first(X)中,如果X-># ,即X可以推出空,那么把空加入first(X)中。3.對于X->Y...這樣的產(chǎn)生式,且X,Y都是非終結(jié)符,把first(Y)中的所有非空的元素加入到first(X)中。 對于X->Y1Y2...Yk產(chǎn)生式,X,Y1,Y2...Yk都是非終結(jié)符,對于某個i(i<=k),如果first(Y1),first(Y2),...first(Yi-1)都含有空,那么將first(Yi)中的所有非空元素加入到first(X)中。若所有的first(Yi)(i=1,2,...k)中都有空,那么將空加入first(X)中。 Input 多組數(shù)據(jù),以EOF結(jié)束。 第一行一個數(shù)字n,表示有n個文法式,(0 下面n行,每行第一個是一個大寫字母,表示產(chǎn)生式的左邊,然后一個字符串,由大寫字母(非終結(jié)符),小寫字母(終結(jié)符)和#(空)組成。 Output 按照字典序輸出每個非終結(jié)符的first(集)。每行表示一個first集。第一個字母輸出表示非終結(jié)符(按字母序排列),然后按字母順序輸出first集,如果包含空的話,最后輸出#。一行中每兩個字符間有一個空格。 Sample Input B A A ab A c A # Sample Output A a c # B a c # Hint 2011北郵計算機學(xué)院復(fù)試上機題目(回憶版) A 句子逆轉(zhuǎn) 輸入一個句子,占用一行。句子由單詞和單詞間的空格組成。單詞只有小寫字母。單詞之間由空格隔開。單詞之間不會有多個空格。每個句子至多有1000個字母。多組數(shù)據(jù)輸入。將句子單詞的排列順序倒過來輸出。多組數(shù)據(jù)輸入,以EOF為結(jié)束。SAMPLE: INPUT: It is a apple OUTPUT: apple a is it B 成績管理 實現(xiàn)查詢成績的功能。首先輸入T表示有T組數(shù)據(jù)。每組數(shù)據(jù)首先輸入n,接下來有n行輸入.每行輸入是插入或者查找。插入為Insert id score。id是自然數(shù),不大于1000。每次插入的id都不同。score是自然數(shù),不大于100。查找為Find id。找到輸出該id與score。查找不到輸出No result! SAMPLE: INPUT: 2 2 Insert 0 10 Find 0 5 Insert 1 15 Find 1 Find 2 Insert 2 35 Find 2 Output: name:0 score:10 name:1 score:15 No result!name:2 score:35 C 尋找寶藏 一棵多叉樹T,根結(jié)點為0,某個結(jié)點上有寶藏。從根結(jié)點沿著樹枝向下尋找,如果有分支,沿各分支繼續(xù)尋找是等概率的。計算找到寶藏的概率。首先輸入M,N,L。M多叉樹T的結(jié)點數(shù),結(jié)點分別為0~M-1。N和L分別是樹枝數(shù)和寶藏所在結(jié)點。接下來有N行輸入,每行兩個數(shù),表示這兩個結(jié)點之間有樹枝連接。而且前一個結(jié)點比后一個更靠近根結(jié)點。輸出找到結(jié)點的概率,保留六位小數(shù)。SAMPLE: INPUT: 6 5 5 0 1 0 2 1 3 2 4 2 5 OUTPUT: 0.250000 HINT: 輸出可用printf(“%.6f”,a) D 略