DE2-115 學習例子


      又快過去一個月了,最近很少寫東西,准備把無雙大神的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去掉即可。好了就上傳這些,等下次東西多了再拿來看看,都是參照別人的難免很不爽,只有慢慢努力寫自己的!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM