




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課程設計(論文)說明書 題 目 : 基于FPGA的RS232串口通信 院 (系) : 信息與通信學院 專 業(yè) : 微電子學 學生姓名 : 學 號 : 指導教師 : 職 稱 : 副教授 2012 年 12 月 10 日摘 要實驗設計了基于verilog描述的RS232串口通信控制器,通過串口調試工具實現PC機和FPGA互發(fā)和接收數據。完成的功能包括實現收發(fā)一幀10個bit、波特率為9600的串口通信控制器,FPGA接收數據后顯示在串口助手的接收數據欄里。實驗的重心放在了RS232串口通信控制器發(fā)送模塊和接收模塊的設計,采用了自頂向下的思路進行設計。報告中給出了完整的設計思路和過程,并將系統(tǒng)分模塊
2、進行了詳細的設計,給出了verilog語言描述。完成了各個模塊以及系統(tǒng)整體的仿真驗證。最終下載到實驗板上測試通過。關鍵詞: RS232;verilog;串口通信;發(fā)送;接收;分頻AbstractExperiment design based on the description of the Verilog RS232 serial communication controller, through the serial port debugging tools to achieve PC machine and FPGA sending and receiving data. Complet
3、e function includes transmitting a frame of 10 bit, baud rate to 9600 serial communication controller, FPGA receives the data displayed in a serial assistants to receive data column.Key words:RS232 ; verilog ; Serial communication ;transmission ;receive ; frequency division 目 錄引言第一部分 任務要求41.1課題要求41.
4、2設計目標4第二部分 系統(tǒng)設計52.1設計思路52.2系統(tǒng)結構設計6系統(tǒng)結構框圖6系統(tǒng)邏輯功能劃分6層次模塊劃分7模塊設計圖9發(fā)送模塊設計10接收模塊設計11分頻模塊設計12按鍵防抖模塊設計12譯碼顯示模塊設計122.3系統(tǒng)硬件語言描述13描述思路13總體電路的描述13分塊電路的描述142.4系統(tǒng)仿真驗證21第三部分 結果與分析233.1實現功能說明233.2器件資源分析233.3故障和問題分析25第四部分 總結與結論264.1實驗結論264.2總結體會26第五部分 附錄部分285.1元器件和儀表清單285.2VHDL源代碼285.3電路圖395.4參考文獻41引言數據采集系統(tǒng)常需要進行異步串
5、行數據傳輸。目前廣泛使用的RS232異步串行接口,如8250、 NS16450等專用集成器件,雖然使用簡單,卻占用電路板面積、布線復雜等缺點。片上系統(tǒng)SoC(System on Chip)是以嵌入式系統(tǒng)為核心,以IP復用技術為基礎,集軟、硬件于一體的設計方法。使用IP復用技術,將UART集成到FPGA器件上,可增加系統(tǒng)的可靠性,縮小PCB板面積;其次由于IP核的特點,使用IP核可使整個系統(tǒng)更加靈活,還可根據需要實現功能升級、擴充和裁減。這里采用VHDL語言編寫 UART模塊,將其集成到FPGA上,與器件其他功能模塊構成片上系統(tǒng)SoC。第一部分 任務要求1.1課題要求設計并實現一個可以和PC機通
6、過RS232協(xié)議進行通信的串口通信控制器。1. PC機通過串口調試工具來驗證程序的功能;2. 實現一個收發(fā)一幀10個bit的串口控制器,10個bit是1位起始位,8位數據位,1位結束位,無奇偶校驗位;3. 串口的波特率選擇9600bit,串口處于全雙工工作狀態(tài);4. PC機可隨時向FPGA發(fā)送0F的十六進制數據;1.2設計目標根據課題要求,實驗中將目標進行了細化,敘述如下:1. 設定數據幀格式為10bit,其中第一位為起始位,定位低電平,8位數據位,1位結束位,無數據傳輸時為高電平;2.通過串口調試工具向FPGA發(fā)送數據,FPGA接收后顯示串口調試工具的接收數據窗口;第二部分 系統(tǒng)設計2.1系
7、統(tǒng)結構設計2.1.1系統(tǒng)結構框圖接收數據PC發(fā)送數據FPGA PGA圖2.1 RS232串口通信控制器系統(tǒng)結構框圖串口通信控制器的輸入是PC發(fā)送的數據。當發(fā)送數據按鍵按下時,FPGA向PC發(fā)送已定義好的數據。同時,當FPGA檢測到PC發(fā)送數據幀的起始位時,開始接收數據,并行輸出。2.1.2系統(tǒng)邏輯功能劃分PC發(fā)送模塊分頻模塊接收模塊圖2.2 RS232串口通信控制器系統(tǒng)邏輯框圖如圖2.2所示,系統(tǒng)可邏輯地劃分為三個子系統(tǒng):一是分頻子系統(tǒng),包括為發(fā)送模塊和接收模塊提供波特率為9600bit的時鐘;二是發(fā)送子系統(tǒng),包括發(fā)送模塊;三是接收子系統(tǒng),包括接收模塊和串口助手顯示模塊。2.1.3層次模塊劃分
8、系統(tǒng)劃分為兩層,自頂向下分別是頂層模塊、控制器子模塊。頂層描述了整個系統(tǒng)的功能和運行;控制器子模塊實現系統(tǒng)中各個獨立而完整的功能部分,每個層次可用一個或多個具體模塊加以實現。A. 頂層模塊:作用為集成子模塊功能,控制子模塊的連接和耦合信號。定義名稱為uart1,在其中例化子模塊。B. 中層模塊:具體實現頂層模塊的描述,包括的功能主要是產生時鐘信號,發(fā)送模塊和接收模塊的定義和狀態(tài)的轉移:speed_select時鐘分頻模塊,將50MHz的時鐘分頻為9600×1Hz的時鐘。定義波特率為9600bit,波特因子為1。輸入:50MHz晶振信號。輸出:送往接收模塊和發(fā)送模塊的9600×
9、;11Hz的信號。a) my_uart_rx接收模塊,檢測接收端,若檢測到低電平則開始接收數據,每隔1個周期接收一位數據,直到接滿8bit。輸入:9600×1Hz時鐘信號、PC機發(fā)送的串行數據。輸出:PC機發(fā)送的串行數據并行輸出。b) my_uart_tx發(fā)送模塊。當發(fā)送數據按鍵確定有效時向PC發(fā)送自定義的數據。輸入:9600×1Hz時鐘信號、發(fā)送數據按鍵。輸出:字符串的串行輸出。以上模塊分別定義在一個工程內,最后在頂層模塊中用語言進行連接。2.1.4模塊設計圖發(fā)送模塊設計發(fā)送模塊工作時首先檢測發(fā)送數據下降沿到來,如復位信號有效時,控制器處于復位狀態(tài),一旦檢測到復位信號無效
10、并且檢測到下降沿的到來則進入起始狀態(tài)。從PC接收到的數據幀:1位起始位+8位數據位+1()位停止位(無奇偶校驗),檢測到電腦端的起始位后(rs232_rx下降沿)打開波特率發(fā)生器,到起始電平時間的中點時檢測數據,每隔“一個”電平時間,采集一次并存入接收暫存寄存器,待到1(或)個結束位到來后將接收暫存寄存器數據放入接收寄存器并關閉波特率發(fā)生器,清楚數據檢測使能標志。 接收模塊設計與發(fā)送模塊類似,接收模塊分為檢驗下降沿到來、啟動接收數據使能有效、接收數據處理等模塊。沒有檢測到起始位時程序一直處于開始狀態(tài),一旦檢測到低電平的起始位(neg_rs232_rx=1),則進入找中狀態(tài)。定時計數器cnt=0
11、時則進入等待狀態(tài),當定時計數器cnt=1時對數據進行采樣,直到移位計數器rx_temp_data0 <= rs232_rx;,即8bit數據采樣完畢,此時進入停止狀態(tài),重新返回開始狀態(tài)。檢測到由接收模塊使能位的下降沿后開啟波特率發(fā)生器并使能發(fā)送,隔半個電平時間后開始發(fā)送數據幀每隔“一個”電平時間更新要發(fā)的數據位,發(fā)送一位結束位后停止工作2.1.7分頻模塊設計串行異步通信的關鍵在于準確地檢測到起始位,因此接收端的時鐘必須采用比波特率更高的時鐘信號,以便提高采樣的分辨率和抗干擾能力,從而更準確地判定起始位。本實驗中波特率為9600bit,取波特率因子為1。接收端檢測到傳輸線上電平由高到低的變
12、化后便開始對接收時鐘進行計數,當計到8個時鐘以后,再次對傳輸線進行采樣,如果仍為低電平,則確認是起始位,而不是干擾信號,之后每隔16個時鐘進行一次采樣,直到采樣到停止位。而且由于每一次采樣都是在碼元的中心進行的,這樣還可以最大限度地避免收、發(fā)時鐘偏差對數據傳送造成的影響。2.2系統(tǒng)硬件語言描述verilog描述思路第二部分“系統(tǒng)設計”中對系統(tǒng)的功能和邏輯結構、狀態(tài)轉移以及模塊劃分都有了詳細的敘述,模塊間的耦合和信號的傳遞關系已經清晰??梢允褂胿erilog語言描述硬件電路了。發(fā)送模塊和接收模塊的verilog語言描述按照事先設計好的狀態(tài)轉移進行編寫可以使電路思想明晰化,避免編程過程中用軟件的思
13、維去描述硬件的電路系統(tǒng),也可有效避免系統(tǒng)性的錯誤。由于進行了細致的模塊劃分,模塊的間的耦合程度降到了很低,這就使得電路設計的可靠性大為增強,只要模塊的輸出滿足了功能定義,整個系統(tǒng)就能正常工作,即便個別模塊出現問題,也不會過多影響到其他模塊。實際測試過程中也印證了這一點。2.2.2總體電路的描述頂層符號文件描述如下:圖2.8 頂層符號文件2.2.3分塊電路的verilog描述本節(jié)給出分塊電路的硬件描述,對關鍵部分進行了分析。1、 發(fā)送模塊的描述timescale 1ns / 1psmodule my_uart_tx( clk,rst_n, rx_data,rx_int,rs232_tx, clk
14、_bps,bps_start,led1);input clk;/ 50MHz主時鐘input rst_n;/低電平復位信號input clk_bps;/ clk_bps_r高電平為接收數據位的中間采樣點,同時也作為發(fā)送數據改變點input7:0 rx_data;/接收數據寄存器input rx_int;/接收數據中斷信號,接收到數據期間始終為高電平,在該模塊中利用它的下降沿來啟動串口發(fā)送數據output rs232_tx;/ RS232發(fā)送數據信號output bps_start;/接收或者要發(fā)送數據,波特率時鐘啟動信號置位output led1;reg rx_int0,rx_int1,rx_
15、int2;/rx_int信號寄存器,捕捉下降沿濾波用wire neg_rx_int;/ rx_int下降沿標志位always (posedge clk or negedge rst_n) beginif(!rst_n) beginrx_int0 <= 1'b0;rx_int1 <= 1'b0;rx_int2 <= 1'b0; endelse beginrx_int0 <= rx_int;rx_int1 <= rx_int0;rx_int2 <= rx_int1; endEndassign neg_rx_int = rx_int1 &a
16、mp; rx_int2;/捕捉到下降沿后,neg_rx_int拉高保持一個主時鐘周期reg7:0 tx_data;/待發(fā)送數據的寄存器reg bps_start_r;reg tx_en;/發(fā)送數據使能信號,高有效reg3:0 num;always (posedge clk or negedge rst_n) beginif(!rst_n) beginbps_start_r <= 1'bz;tx_en <= 1'b0;tx_data <= 8'd0;endelse if(neg_rx_int) begin/接收數據完畢,準備把接收到的數據發(fā)回去bps_s
17、tart_r <= 1'b1;tx_data <= rx_data;/把接收到的數據存入發(fā)送數據寄存器tx_en <= 1'b1;/進入發(fā)送數據狀態(tài)中endelse if(num=4'd11) begin/數據發(fā)送完成,復位bps_start_r <= 1'b0;tx_en <= 1'b0;endendassign bps_start = bps_start_r;reg rs232_tx_r;reg led1_r;always (posedge clk or negedge rst_n) beginif(!rst_n) be
18、ginnum <= 4'd0;rs232_tx_r <= 1'b1;led1_r<=1'b0;endelse if(tx_en) beginif(clk_bps)begin led1_r<=1'b1;case (num)4'd0: rs232_tx_r <= 1'b0; /發(fā)送起始位4'd1: rs232_tx_r <= tx_data0;/發(fā)送bit04'd2: rs232_tx_r <= tx_data1;/發(fā)送bit14'd3: rs232_tx_r <= tx_dat
19、a2;/發(fā)送bit24'd4: rs232_tx_r <= tx_data3;/發(fā)送bit34'd5: rs232_tx_r <= tx_data4;/發(fā)送bit44'd6: rs232_tx_r <= tx_data5;/發(fā)送bit54'd7: rs232_tx_r <= tx_data6;/發(fā)送bit64'd8: rs232_tx_r <= tx_data7;/發(fā)送bit74'd9: rs232_tx_r <= 1'b1;/發(fā)送結束位default: rs232_tx_r <= 1'b
20、1;endcasenum <= num+1'b1;endelse if(num=4'd11)begin num <= 4'd0;/復位led1_r<=1'b0;endendendassign rs232_tx = rs232_tx_r;assign led1=led1_r;endmodule2、 接收模塊的描述timescale 1ns / 1psmodule my_uart_rx(clk,rst_n, rs232_rx,rx_data,rx_int,clk_bps,bps_start,led0);input clk;/ 50MHz主時鐘inp
21、ut rst_n;/低電平復位信號input rs232_rx;/ RS232接收數據信號input clk_bps;/ clk_bps的高電平為接收或者發(fā)送數據位的中間采樣點output bps_start;/接收到數據后,波特率時鐘啟動信號置位output7:0 rx_data;/接收數據寄存器,保存直至下一個數據來到output rx_int;/接收數據中斷信號,接收到數據期間始終為高電平output led0;reg rs232_rx0,rs232_rx1,rs232_rx2,rs232_rx3;/接收數據寄存器,濾波用wire neg_rs232_rx;/表示數據線接收到下降沿alw
22、ays (posedge clk or negedge rst_n) beginif(!rst_n) beginrs232_rx0 <= 1'b0;rs232_rx1 <= 1'b0;rs232_rx2 <= 1'b0;rs232_rx3 <= 1'b0;endelse beginrs232_rx0 <= rs232_rx;rs232_rx1 <= rs232_rx0;rs232_rx2 <= rs232_rx1;rs232_rx3 <= rs232_rx2;endendassign neg_rs232_rx =
23、rs232_rx3 & rs232_rx2 & rs232_rx1 & rs232_rx0;/接收到下降沿后neg_rs232_rx置高一個時鐘周期reg bps_start_r;reg3:0 num;/移位次數reg rx_int;/接收數據中斷信號,接收到數據期間始終為高電平always (posedge clk or negedge rst_n)if(!rst_n) beginbps_start_r <= 1'bz;rx_int <= 1'b0;endelse if(neg_rs232_rx) begin/接收到串口接收線rs232_r
24、x的下降沿標志信號bps_start_r <= 1'b1;/啟動串口準備數據接收rx_int <= 1'b1;/接收數據中斷信號使能endelse if(num=4'd12) begin/接收完有用數據信息bps_start_r <= 1'b0;/數據接收完畢,釋放波特率啟動信號rx_int <= 1'b0;/接收數據中斷信號關閉endassign bps_start = bps_start_r;reg7:0 rx_data_r;/串口接收數據寄存器,保存直至下一個數據來到reg led0_r;reg7:0 rx_temp_dat
25、a;/當前接收數據寄存器always (posedge clk or negedge rst_n)if(!rst_n) beginrx_temp_data <= 8'd0;num <= 4'd0;rx_data_r <= 8'd0;led0_r<=1'b0;endelse if(rx_int) begin/接收數據處理 led0_r<=1'b1;if(clk_bps) begin/讀取并保存數據,接收數據為一個起始位,8bit數據,1或2個結束位case (num)4'd1: rx_temp_data0 <=
26、rs232_rx;/鎖存第0bit4'd2: rx_temp_data1 <= rs232_rx;/鎖存第1bit4'd3: rx_temp_data2 <= rs232_rx;/鎖存第2bit4'd4: rx_temp_data3 <= rs232_rx;/鎖存第3bit4'd5: rx_temp_data4 <= rs232_rx;/鎖存第4bit4'd6: rx_temp_data5 <= rs232_rx;/鎖存第5bit4'd7: rx_temp_data6 <= rs232_rx;/鎖存第6bit4
27、'd8: rx_temp_data7 <= rs232_rx;/鎖存第7bitdefault: ;endcasenum <= num+1'b1;endelse if(num = 4'd12) begin/我們的標準接收模式下只有1+8+1(2)=11bit的有效數據num <= 4'd0;/接收到STOP位后結束,num清零rx_data_r <= rx_temp_data;/把數據鎖存到數據寄存器rx_data中l(wèi)ed0_r<=1'b0;endendassign rx_data = rx_data_r;assign led
28、0=led0_r;endmodule3、 分頻模塊的描述module speed_select(clk,rst_n,bps_start,clk_bps);input clk;/ / 50MHz主時鐘input rst_n;/低電平復位信號input bps_start;/接收到數據后,波特率時鐘啟動信號置位output clk_bps;/ clk_bps的高電平為接收或者發(fā)送數據位的中間采樣點defineBPS_PARA5207/波特率9600分頻點數define BPS_PARA_22603reg12:0 cnt;reg clk_bps_r;reg2:0 uart_ctrl;/ uart?a
29、lways (posedge clk or negedge rst_n) beginif(!rst_n) cnt <= 13'd0;else if(cnt = BPS_PARA) | !bps_start) cnt <= 13'd0;/clear else cnt <= cnt+1'b1; endalways (posedge clk or negedge rst_n) beginif(!rst_n) clk_bps_r <= 1'b0;else if(cnt = BPS_PARA_2) clk_bps_r <= 1'b1;
30、else clk_bps_r <= 1'b0; endassign clk_bps = clk_bps_r;endmodule2.3系統(tǒng)仿真驗證系統(tǒng)仿真分為兩個步驟進行,首先是關鍵模塊的仿真,驗證子系統(tǒng)功能的正確性,然后是綜合仿真,驗證整個系統(tǒng)的功能。仿真環(huán)境是QuartusII 7.2。首先是分頻模塊的仿真。由仿真結果可看出bclk的時鐘周期為104us,與要求結果一致,頻率為9600Hz。圖2.9 分頻模塊仿真圖(9600Hz分頻)然后是發(fā)送模塊的仿真波形。下圖為發(fā)送模塊第一個字符發(fā)送的波形,第一個字符的數值為“01100110”,發(fā)送時低位先發(fā)送,因此仿真波形由時間的先后順
31、序,其序列應為“01100110”,每一幀數據為10個bit,第一個bit為起始位,最后一個bit為停止位,可以看出,中間的八位為“01100110”,說明了仿真波形的正確性。圖2.10 發(fā)送模塊仿真圖下圖為接收模塊仿真圖。設定的輸入信號為“10010110”。接收時將先接收到的數據作為低位,后接收到的數據作為高位,因此轉化成的并行數據應為“01101001”,因此仿真波形正確。圖2.11 接收模塊仿真圖第三部分 結果與分析3.1實現功能說明本實驗完成的RS232串口通信控制器,完成了課題要求的所有功能。由于頂層設計采用了子系統(tǒng)分模塊描述的方法,使得控制器具有很好的擴展性??梢栽诓桓淖兿到y(tǒng)框架
32、和模塊間電路連接關系,增加其他模塊,實現其他功能。本課題中并沒有在數據幀中加入校驗位,僅僅實現了1位起始位,1位停止位和8位數據位的傳輸。初步實現了PC和FPGA之間的通信。數字系統(tǒng)的設計,真正的重點在于把系統(tǒng)層面的設計做好,把系統(tǒng)狀態(tài)機設計完整,系統(tǒng)架構清晰,層次明確,穩(wěn)定性好,可擴展和可移植性好,這樣的系統(tǒng)給到用戶,只要添加用戶模塊或者稍作修改即可完成非特定的功能。3.2器件資源分析在設計階段,對系統(tǒng)描述采用過多種方式,嘗試了多種描述,代碼的長度在增加,模塊在增多,但系統(tǒng)穩(wěn)定性和可擴展性也在增強,層次結構和模塊設計也更加完善。設計之初對資源使用沒有多少概念,時常以軟件的思想描述硬件,在描述
33、中使用乘法等資源耗費嚴重的操作,也曾使用過嵌套多層的IF-ELSE語句,產生很長的選擇器,降低了模塊的可靠性,增加處理延時。隨著設計的深入,加上反復求精的過程磨練,逐步對硬件描述綜合出的實際電路形式有了更多的理解,對延時和資源占用有了初步概念。一個顯見的結論是描述代碼的長度和綜合后的電路形式與資源占用無必然聯(lián)系。需要關注編譯器在綜合時如何將verilog行為級描述轉化為結構化的門級電路,才能分析清楚資源占用率和電路結構。行為級描述可能與實際綜合的電路產生不一致,需要謹慎對待。圖3.1是QuartusII編譯工程后的綜合報告。邏輯單元占用率27%。圖3.1 QuartusII編譯綜合報告3.3故
34、障和問題分析實驗中由于仔細設計了詳細劃分了子模塊、各模塊的實現都仔細進行了描述,故沒有出現太多的故障。由于以前對verilog語言的理解停留在很低的層次,甚至和C語言等軟件語言混為一談,沒有很好地理解狀態(tài)機、硬件并發(fā)性、數字系統(tǒng)設計的方法,主要的麻煩產生在verilog描述上。在查閱了諸多相關資料后對verilog的語法基本熟悉,從最初的類似C語言的風格到模塊初步成型、狀態(tài)機引入,再到最后全模塊化,自頂向下設計系統(tǒng),完成verilog描述。最深的感受在于,開始時一心專注于代碼的編寫和語法的使用,忽視了系統(tǒng)設計,導致設計結果不令人滿意,后來逐步采用自頂向下的設計思路,先從邏輯上把系統(tǒng)的功能和子系統(tǒng)的劃分描述清楚,然后設計各個模塊的接口和定義,最后分別去描述底層各個模塊的功能和實現,清晰明了,一氣呵成。這也是系統(tǒng)沒有多少故障的主要原因。verilog描述中解決的最成功的一個問題是Multi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 17436-2025船舶危險區(qū)域防爆電氣設備的選用
- GB/T 45619-2025農業(yè)社會化服務農產品批發(fā)市場服務規(guī)范
- 客戶關系培訓
- 消息隊列協(xié)議書
- 過年酒席租賃合同協(xié)議
- 《新生兒的護理與喂養(yǎng)》課件
- 鄰居協(xié)議書模板
- 房地產企業(yè)保密協(xié)議
- 暗股股份協(xié)議書
- 測繪服務協(xié)議示本
- 第18課《井岡翠竹》課件-2024-2025學年統(tǒng)編版語文七年級下冊
- 【MOOC】《思想道德與法治》(東南大學)章節(jié)中國大學慕課答案
- 卜算子-送鮑浩然之浙東課件
- MOOC 中醫(yī)與辨證-暨南大學 中國大學慕課答案
- 國家開放大學《高等數學基礎》形考任務1-4參考答案
- 自愿放棄繳納住房公積金的承諾書
- 國慶主題班會祖國我為你驕傲課件
- 河北省建設工程竣工驗收報告格式及填寫范例
- 腦血管意外的急救課件
- 利浦倉施工方案
- 三調土地利用現狀分類和三大地類對應甄選
評論
0/150
提交評論