又快過去一個月了,最近很少寫東西,准備把無雙大神的sobel邊緣檢測用到自己的DE2-115里面,有句話說,前人栽樹后人乘涼,誰叫我這么笨,只能用別人的東西,效果還算明顯,對我來說拿那個東西參加個比賽應該不成問題,最主要我把sobel 算子改成多個方向了,其實也是避免和別人一樣,再說sobel算子每個人的版本也不同,這也是為什么那么多人都可以拿相同的東西去發表論文,突然覺得自己非要把實話說出來,大家都懂得!先鏈接一下大神的東西,雖然過去很久了,但是這依然讓我覺得好!http://www.cnblogs.com/oomusou/archive/2008/10/16/de2_70_tv_sobel.html。這個改動有詳細的說明,照着改就可以實現自己開發板。
當然今天我是想把基礎性的代碼(感覺別人的代碼寫的自己要費好長時間懂)所以我想說可以嘗試自己寫寫,當然廢話了,現成的多好,好吧,先把一些基礎例子的上傳一下
`timescale 1ns / 1ps //////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: // Design Name: // Module Name: my_uart_top // Project Name: // Target Device: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // //////////////////////////////////////////////////////////////////////////////// module my_uart_top( clk,rst_n, rs232_rx,rs232_tx ); input clk; // 50MHz時鍾 input rst_n; //低電平復位信號 input rs232_rx; // RS232接收數據信號 output rs232_tx; // RS232發送數據信號 wire bps_start1,bps_start2; //接收到數據后,波特率時鍾啟動信號置位 wire clk_bps1,clk_bps2; // clk_bps_r高電平為接收數據位的中間采樣點,同時也作為發送數據的數據改變點 wire[7:0] rx_data; //接收數據寄存器,保存直至下一個數據來到 wire rx_int; //接收數據中斷信號,接收到數據期間始終為高電平 //---------------------------------------------------- //下面的四個模塊中,speed_rx和speed_tx是兩個完全獨立的硬件模塊,可稱之為邏輯復制 //(不是資源共享,和軟件中的同一個子程序調用不能混為一談) //////////////////////////////////////////// speed_select speed_rx( .clk(clk), //波特率選擇模塊 .rst_n(rst_n), .bps_start(bps_start1), .clk_bps(clk_bps1) ); my_uart_rx my_uart_rx( .clk(clk), //接收數據模塊 .rst_n(rst_n), .rs232_rx(rs232_rx), .rx_data(rx_data), .rx_int(rx_int), .clk_bps(clk_bps1), .bps_start(bps_start1) ); /////////////////////////////////////////// speed_select speed_tx( .clk(clk), //波特率選擇模塊 .rst_n(rst_n), .bps_start(bps_start2), .clk_bps(clk_bps2) ); my_uart_tx my_uart_tx( .clk(clk), //發送數據模塊 .rst_n(rst_n), .rx_data(rx_data), .rx_int(rx_int), .rs232_tx(rs232_tx), .clk_bps(clk_bps2), .bps_start(bps_start2) ); endmodule `timescale 1ns / 1ps //////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 17:11:32 08/28/08 // Design Name: // Module Name: my_uart_rx // Project Name: // Target Device: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // //////////////////////////////////////////////////////////////////////////////// module my_uart_tx( clk,rst_n, rx_data,rx_int,rs232_tx, clk_bps,bps_start ); input clk; // 50MHz主時鍾 input rst_n; //低電平復位信號 input clk_bps; // clk_bps_r高電平為接收數據位的中間采樣點,同時也作為發送數據的數據改變點 input[7:0] rx_data; //接收數據寄存器 input rx_int; //接收數據中斷信號,接收到數據期間始終為高電平,在該模塊中利用它的下降沿來啟動串口發送數據 output rs232_tx; // RS232發送數據信號 output bps_start; //接收或者要發送數據,波特率時鍾啟動信號置位 //--------------------------------------------------------- reg rx_int0,rx_int1,rx_int2; //rx_int信號寄存器,捕捉下降沿濾波用 wire neg_rx_int; // rx_int下降沿標志位 always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin rx_int0 <= 1'b0; rx_int1 <= 1'b0; rx_int2 <= 1'b0; end else begin rx_int0 <= rx_int; rx_int1 <= rx_int0; rx_int2 <= rx_int1; end end assign neg_rx_int = ~rx_int1 & rx_int2; //捕捉到下降沿后,neg_rx_int拉高保持一個主時鍾周期 //--------------------------------------------------------- reg[7:0] tx_data; //待發送數據的寄存器 //--------------------------------------------------------- reg bps_start_r; reg tx_en; //發送數據使能信號,高有效 reg[3:0] num; always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin bps_start_r <= 1'bz; tx_en <= 1'b0; tx_data <= 8'd0; end else if(neg_rx_int) begin //接收數據完畢,准備把接收到的數據發回去 bps_start_r <= 1'b1; tx_data <= rx_data; //把接收到的數據存入發送數據寄存器 tx_en <= 1'b1; //進入發送數據狀態中 end else if(num==4'd11) begin //數據發送完成,復位 bps_start_r <= 1'b0; tx_en <= 1'b0; end end assign bps_start = bps_start_r; //--------------------------------------------------------- reg rs232_tx_r; always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin num <= 4'd0; rs232_tx_r <= 1'b1; end else if(tx_en) begin if(clk_bps) begin num <= num+1'b1; case (num) 4'd0: rs232_tx_r <= 1'b0; //發送起始位 4'd1: rs232_tx_r <= tx_data[0]; //發送bit0 4'd2: rs232_tx_r <= tx_data[1]; //發送bit1 4'd3: rs232_tx_r <= tx_data[2]; //發送bit2 4'd4: rs232_tx_r <= tx_data[3]; //發送bit3 4'd5: rs232_tx_r <= tx_data[4]; //發送bit4 4'd6: rs232_tx_r <= tx_data[5]; //發送bit5 4'd7: rs232_tx_r <= tx_data[6]; //發送bit6 4'd8: rs232_tx_r <= tx_data[7]; //發送bit7 4'd9: rs232_tx_r <= 1'b1; //發送結束位 default: rs232_tx_r <= 1'b1; endcase end else if(num==4'd11) num <= 4'd0; //復位 end end assign rs232_tx = rs232_tx_r; endmodule `timescale 1ns / 1ps //////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 17:11:32 08/28/08 // Design Name: // Module Name: my_uart_rx // Project Name: // Target Device: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // //////////////////////////////////////////////////////////////////////////////// module my_uart_rx( clk,rst_n, rs232_rx,rx_data,rx_int, clk_bps,bps_start ); input clk; // 50MHz主時鍾 input rst_n; //低電平復位信號 input rs232_rx; // RS232接收數據信號 input clk_bps; // clk_bps的高電平為接收或者發送數據位的中間采樣點 output bps_start; //接收到數據后,波特率時鍾啟動信號置位 output[7:0] rx_data; //接收數據寄存器,保存直至下一個數據來到 output rx_int; //接收數據中斷信號,接收到數據期間始終為高電平 //---------------------------------------------------------------- reg rs232_rx0,rs232_rx1,rs232_rx2,rs232_rx3; //接收數據寄存器,濾波用 wire neg_rs232_rx; //表示數據線接收到下降沿 always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin rs232_rx0 <= 1'b0; rs232_rx1 <= 1'b0; rs232_rx2 <= 1'b0; rs232_rx3 <= 1'b0; end else begin rs232_rx0 <= rs232_rx; rs232_rx1 <= rs232_rx0; rs232_rx2 <= rs232_rx1; rs232_rx3 <= rs232_rx2; end end //下面的下降沿檢測可以濾掉<20ns-40ns的毛刺(包括高脈沖和低脈沖毛刺), //這里就是用資源換穩定(前提是我們對時間要求不是那么苛刻,因為輸入信號打了好幾拍) //(當然我們的有效低脈沖信號肯定是遠遠大於40ns的) assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0; //接收到下降沿后neg_rs232_rx置高一個時鍾周期 //---------------------------------------------------------------- reg bps_start_r; reg[3:0] num; //移位次數 reg rx_int; //接收數據中斷信號,接收到數據期間始終為高電平 always @ (posedge clk or negedge rst_n) if(!rst_n) begin bps_start_r <= 1'bz; rx_int <= 1'b0; end else if(neg_rs232_rx) begin //接收到串口接收線rs232_rx的下降沿標志信號 bps_start_r <= 1'b1; //啟動串口准備數據接收 rx_int <= 1'b1; //接收數據中斷信號使能 end else if(num==4'd12) begin //接收完有用數據信息 bps_start_r <= 1'b0; //數據接收完畢,釋放波特率啟動信號 rx_int <= 1'b0; //接收數據中斷信號關閉 end assign bps_start = bps_start_r; //---------------------------------------------------------------- reg[7:0] rx_data_r; //串口接收數據寄存器,保存直至下一個數據來到 //---------------------------------------------------------------- reg[7:0] rx_temp_data; //當前接收數據寄存器 always @ (posedge clk or negedge rst_n) if(!rst_n) begin rx_temp_data <= 8'd0; num <= 4'd0; rx_data_r <= 8'd0; end else if(rx_int) begin //接收數據處理 if(clk_bps) begin //讀取並保存數據,接收數據為一個起始位,8bit數據,1或2個結束位 num <= num+1'b1; case (num) 4'd1: rx_temp_data[0] <= rs232_rx; //鎖存第0bit 4'd2: rx_temp_data[1] <= rs232_rx; //鎖存第1bit 4'd3: rx_temp_data[2] <= rs232_rx; //鎖存第2bit 4'd4: rx_temp_data[3] <= rs232_rx; //鎖存第3bit 4'd5: rx_temp_data[4] <= rs232_rx; //鎖存第4bit 4'd6: rx_temp_data[5] <= rs232_rx; //鎖存第5bit 4'd7: rx_temp_data[6] <= rs232_rx; //鎖存第6bit 4'd8: rx_temp_data[7] <= rs232_rx; //鎖存第7bit default: ; endcase end else if(num == 4'd12) begin //我們的標准接收模式下只有1+8+1(2)=11bit的有效數據 num <= 4'd0; //接收到STOP位后結束,num清零 rx_data_r <= rx_temp_data; //把數據鎖存到數據寄存器rx_data中 end end assign rx_data = rx_data_r; endmodule `timescale 1ns / 1ps //////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 17:27:40 08/28/08 // Design Name: // Module Name: speed_select // Project Name: // Target Device: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // //////////////////////////////////////////////////////////////////////////////// module speed_select( clk,rst_n, bps_start,clk_bps ); input clk; // 50MHz主時鍾 input rst_n; //低電平復位信號 input bps_start; //接收到數據后,波特率時鍾啟動信號置位 output clk_bps; // clk_bps的高電平為接收或者發送數據位的中間采樣點 /* parameter bps9600 = 5207, //波特率為9600bps bps19200 = 2603, //波特率為19200bps bps38400 = 1301, //波特率為38400bps bps57600 = 867, //波特率為57600bps bps115200 = 433; //波特率為115200bps parameter bps9600_2 = 2603, bps19200_2 = 1301, bps38400_2 = 650, bps57600_2 = 433, bps115200_2 = 216; */ //以下波特率分頻計數值可參照上面的參數進行更改 `define BPS_PARA 5207 //波特率為9600時的分頻計數值 `define BPS_PARA_2 2603 //波特率為9600時的分頻計數值的一半,用於數據采樣 reg[12:0] cnt; //分頻計數 reg clk_bps_r; //波特率時鍾寄存器 //---------------------------------------------------------- reg[2:0] uart_ctrl; // uart波特率選擇寄存器 //---------------------------------------------------------- always @ (posedge clk or negedge rst_n) if(!rst_n) cnt <= 13'd0; else if((cnt == `BPS_PARA) || !bps_start) cnt <= 13'd0; //波特率計數清零 else cnt <= cnt+1'b1; //波特率時鍾計數啟動 always @ (posedge clk or negedge rst_n) if(!rst_n) clk_bps_r <= 1'b0; else if(cnt == `BPS_PARA_2) clk_bps_r <= 1'b1; // clk_bps_r高電平為接收數據位的中間采樣點,同時也作為發送數據的數據改變點 else clk_bps_r <= 1'b0; assign clk_bps = clk_bps_r; endmodule
當然這個是rs232的東西,應用場合是EPM240T100C5但是DE2-115也可以用;
下個就是VGA顯示了,先找個大神的例子http://www.cnblogs.com/spartan/archive/2011/05/05/2038167.html,在這里,當然如果里面有問題就是這個pll問題,建議出現這個問題把
50.pll pll_inst (
51 .inclk0 ( CLOCK_50 ),
52 .c0 ( CLK_25 )
53 );50行那個pll去掉即可。好了就上傳這些,等下次東西多了再拿來看看,都是參照別人的難免很不爽,只有慢慢努力寫自己的!