这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » FPGA

共1条 1/1 1 跳转至

FPGA

菜鸟
2017-06-27 15:36:11     打赏
对于我这个菜鸟来说FPGA真的是个高大上的东西,以前也就是听听别人说玩FPGA的都是大神。其实开始我并不是对这玩意有很大兴趣,跟多的是好奇吧。   在学校实验室呆了差不多两年了吧,一直都是玩的是单片机,什么51,MSP430,STM32,都玩过,虽然说不上精通,但是做一些简单的项目还是可以完成的。我接触FPGA也是偶然的机会吧,学校把我们安排到到公司去做毕业设计。到公司之后带我的工程师就对我说,我这里有两个项目,一个是嵌入式的底层驱动的编写,一个是FPGA视频格式的转换。我向来很久之后我还是选择了FPGA视频格式转换,选择这个的原因就是首先我嵌入式学的并不是很好,还有就是我一直对FPGA的好奇,所以我也就毫不犹豫的选择了。
   选择好自己的课题之后,接下来就是赶快的学习了,我马上就买了两本书,一本是《FPGA/CPLD应用技术》Verilog语言版的,另一本书是《****玩转FPGA》。然后又自己买了一块开发板,因为学习FPGA只有理论的学习是远远不够的,一定需要不断的实践才能让自己进步的更快。后面开始就是玩开发板和学Verilog语言了。经过了差不多一周的样子吧,自己点亮了流水灯。其实中间还有个小的插曲的,就是我安装QuatusII 软件的时候怎么装都安装不成功,弄了好久,最后换了系统之后才给安装上去,现在我也还不知道是什么原因。后面就天天跑跑例程,看看现象。对基本的语法的熟悉了之后,我开始自己写了一个用数码管显示的数字时钟。但是看着时钟可以准确的跑的时候真的贼开心。
   再说说现在吧,现在正在弄FPGA的视频格式的转换,真的,头都快要炸了,天天看大量的资料,还有很多的算法。然后现在回学校了,很多的东西都没有,还得自己买,我都已经把我所有的生活费都给投资进来了,希望可以早点完成吧。不过现在的进度还有点慢,好想可以碰到一位大神给我来指点指点啊。
   最后在说说我学习FPGA的经验吧,虽然说我现在还只是个菜鸟,但是还是有一点点自己的感触的,首先我必须的承认的是FPGA这东西真的不简单(也许是我太蠢了吧,嘻嘻)。真的要学好这个东西必须得脚踏实地,不能好高骛远。还有就是需要大量的实践,不能只有理论的学习。还有就是必须得有一块自己的开发板,不需要很高端,只要可以跑起程序,看到现象就可以了。
    差不多了,该继续干活了,下次继续讲我最近的情况。最后贴点东西吧。。
   如果有大牛看到就给我多多指点,如果可以加我QQ给我指导就更加的万分感激了。企鹅:2445248608


module color_bar(
        input clk,            //像素时钟输入,1280x720@60P的像素时钟为74.25
        input rst,            //复位,高有效
        output hs,            //行同步、高有效
        output vs,            //场同步、高有效
        output de,            //数据有效
        output[7:0] rgb_r,    //像素数据、红色分量
        output[7:0] rgb_g,    //像素数据、绿色分量
        output[7:0] rgb_b     //像素数据、蓝色分量
);
/*********视频时序参数定义******************************************/
parameter H_ACTIVE = 16'd1280;  //行有效长度(像素时钟周期个数)
parameter H_FP = 16'd110;       //行同步前肩长度
parameter H_SYNC = 16'd40;      //行同步长度
parameter H_BP = 16'd220;       //行同步后肩长度
parameter V_ACTIVE = 16'd720;   //场有效长度(行的个数)
parameter V_FP         = 16'd5;        //场同步前肩长度
parameter V_SYNC  = 16'd5;      //场同步长度
parameter V_BP        = 16'd20;       //场同步后肩长度
parameter H_TOTAL = H_ACTIVE + H_FP + H_SYNC + H_BP;//行总长度
parameter V_TOTAL = V_ACTIVE + V_FP + V_SYNC + V_BP;//场总长度
/*********彩条RGB color bar颜色参数定义*****************************/
parameter WHITE_R                 = 8'hff;
parameter WHITE_G                 = 8'hff;
parameter WHITE_B                 = 8'hff;
parameter YELLOW_R                 = 8'hff;
parameter YELLOW_G                 = 8'hff;
parameter YELLOW_B                 = 8'h00;                                      
parameter CYAN_R                 = 8'h00;
parameter CYAN_G                 = 8'hff;
parameter CYAN_B                 = 8'hff;                                     
parameter GREEN_R                 = 8'h00;
parameter GREEN_G                 = 8'hff;
parameter GREEN_B                 = 8'h00;
parameter MAGENTA_R         = 8'hff;
parameter MAGENTA_G         = 8'h00;
parameter MAGENTA_B         = 8'hff;
parameter RED_R                 = 8'hff;
parameter RED_G                 = 8'h00;
parameter RED_B                 = 8'h00;
parameter BLUE_R                 = 8'h00;
parameter BLUE_G                 = 8'h00;
parameter BLUE_B                 = 8'hff;
parameter BLACK_R                 = 8'h00;
parameter BLACK_G                 = 8'h00;
parameter BLACK_B                 = 8'h00;
reg hs_reg;//定义一个寄存器,用于行同步
reg vs_reg;//定义一个寄存器,用户场同步
reg hs_reg_d0;//hs_reg一个时钟的延迟
              //所有以_d0、d1、d2等为后缀的均为某个寄存器的延迟
reg vs_reg_d0;//vs_reg一个时钟的延迟
reg[11:0] h_cnt;//用于行的计数器
reg[11:0] v_cnt;//用于场(帧)的计数器
reg[11:0] active_x;//有效图像的的坐标x
reg[11:0] active_y;//有效图像的坐标y
reg[7:0] rgb_r_reg;//像素数据r分量
reg[7:0] rgb_g_reg;//像素数据g分量
reg[7:0] rgb_b_reg;//像素数据b分量
reg h_active;//行图像有效
reg v_active;//场图像有效
wire video_active;//一帧内图像的有效区域h_active & v_active
reg video_active_d0;
assign hs = hs_reg_d0;
assign vs = vs_reg_d0;
assign video_active = h_active & v_active;
assign de = video_active_d0;
assign rgb_r = rgb_r_reg;
assign rgb_g = rgb_g_reg;
assign rgb_b = rgb_b_reg;
always@(posedge clk or posedge rst)
begin
        if(rst)
                begin
                        hs_reg_d0 <= 1'b0;
                        vs_reg_d0 <= 1'b0;
                        video_active_d0 <= 1'b0;
                end
        else
                begin
                        hs_reg_d0 <= hs_reg;
                        vs_reg_d0 <= vs_reg;
                        video_active_d0 <= video_active;
                end
end

always@(posedge clk or posedge rst)
begin
        if(rst)
                h_cnt <= 12'd0;
        else if(h_cnt == H_TOTAL - 1)//行计数器到最大值清零
                h_cnt <= 12'd0;
        else
                h_cnt <= h_cnt + 12'd1;
end

always@(posedge clk or posedge rst)
begin
        if(rst)
                active_x <= 12'd0;
        else if(h_cnt >= H_FP + H_SYNC + H_BP - 1)//计算图像的x坐标
                active_x <= h_cnt - (H_FP[11:0] + H_SYNC[11:0] + H_BP[11:0] - 12'd1);
        else
                active_x <= active_x;
end

always@(posedge clk or posedge rst)
begin
        if(rst)
                v_cnt <= 12'd0;
        else if(h_cnt == H_FP  - 1)//在行数计算器为H_FP - 1的时候场计数器+1或清零
                if(v_cnt == V_TOTAL - 1)//场计数器到最大值了,清零
                        v_cnt <= 12'd0;
                else
                        v_cnt <= v_cnt + 12'd1;//没到最大值,+1
        else
                v_cnt <= v_cnt;
end

always@(posedge clk or posedge rst)
begin
        if(rst)
                hs_reg <= 1'b0;
        else if(h_cnt == H_FP - 1)//行同步开始了...
                hs_reg <= 1'b1;
        else if(h_cnt == H_FP + H_SYNC - 1)//行同步这时候要结束了
                hs_reg <= 1'b0;
        else
                hs_reg <= hs_reg;
end

always@(posedge clk or posedge rst)
begin
        if(rst)
                h_active <= 1'b0;
        else if(h_cnt == H_FP + H_SYNC + H_BP - 1)
                h_active <= 1'b1;
        else if(h_cnt == H_TOTAL - 1)
                h_active <= 1'b0;
        else
                h_active <= h_active;
end

always@(posedge clk or posedge rst)
begin
        if(rst)
                vs_reg <= 1'd0;
        else if((v_cnt == V_FP - 1) && (h_cnt == H_FP - 1))
                vs_reg <= 1'b1;
        else if((v_cnt == V_FP + V_SYNC - 1) && (h_cnt == H_FP - 1))
                vs_reg <= 1'b0;        
        else
                vs_reg <= vs_reg;
end

always@(posedge clk or posedge rst)
begin
        if(rst)
                v_active <= 1'd0;
        else if((v_cnt == V_FP + V_SYNC + V_BP - 1) && (h_cnt == H_FP - 1))
                v_active <= 1'b1;
        else if((v_cnt == V_TOTAL - 1) && (h_cnt == H_FP - 1))
                v_active <= 1'b0;        
        else
                v_active <= v_active;
end

always@(posedge clk or posedge rst)
begin
        if(rst)
                begin
                        rgb_r_reg <= 8'h00;
                        rgb_g_reg <= 8'h00;
                        rgb_b_reg <= 8'h00;
                end
        else if(video_active)
                if(active_x == 12'd0)
                        begin
                                rgb_r_reg <= WHITE_R;
                                rgb_g_reg <= WHITE_G;
                                rgb_b_reg <= WHITE_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 1)
                        begin
                                rgb_r_reg <= YELLOW_R;
                                rgb_g_reg <= YELLOW_G;
                                rgb_b_reg <= YELLOW_B;
                        end                        
                else if(active_x == (H_ACTIVE/8) * 2)
                        begin
                                rgb_r_reg <= CYAN_R;
                                rgb_g_reg <= CYAN_G;
                                rgb_b_reg <= CYAN_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 3)
                        begin
                                rgb_r_reg <= GREEN_R;
                                rgb_g_reg <= GREEN_G;
                                rgb_b_reg <= GREEN_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 4)
                        begin
                                rgb_r_reg <= MAGENTA_R;
                                rgb_g_reg <= MAGENTA_G;
                                rgb_b_reg <= MAGENTA_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 5)
                        begin
                                rgb_r_reg <= RED_R;
                                rgb_g_reg <= RED_G;
                                rgb_b_reg <= RED_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 6)
                        begin
                                rgb_r_reg <= BLUE_R;
                                rgb_g_reg <= BLUE_G;
                                rgb_b_reg <= BLUE_B;
                        end        
                else if(active_x == (H_ACTIVE/8) * 7)
                        begin
                                rgb_r_reg <= BLACK_R;
                                rgb_g_reg <= BLACK_G;
                                rgb_b_reg <= BLACK_B;
                        end
                else
                        begin
                                rgb_r_reg <= rgb_r_reg;
                                rgb_g_reg <= rgb_g_reg;
                                rgb_b_reg <= rgb_b_reg;
                        end                        
        else
                begin
                        rgb_r_reg <= 8'h00;
                        rgb_g_reg <= 8'h00;
                        rgb_b_reg <= 8'h00;
                end
end

endmodule 


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]