这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 啸风的FPGA DIY开发进程

共78条 2/8 1 2 3 4 5 6 ›| 跳转至
专家
2012-09-26 20:42:50     打赏
11楼

其余的图

之前传的图都是手机拍的,不是很清楚。现在用相机拍的,要好很多。

核心板:



应网友要求,传一个上电图:




接下来当然是我的接口板:





上面的图是不是觉得少了点什么?那请看下图





马上展出的是核心板跟接口板的结合,一款非常完美的FPGA开发板就完成了。







一张是不是觉得看的不过瘾,再给大家多来几张。






专家
2012-09-28 11:23:55     打赏
12楼
开发板脚本文件



为了方便后续进程的进行,编写了一个开发板的脚本文件,用于定义开发板的的每个引脚的。这是仿照别人的脚本文件写的,如果有不对的地方,请大神们多多指教。

跟大家分享一下:
http://share.eepw.com.cn/share/download/id/78986




专家
2012-09-28 15:57:33     打赏
13楼
很不错的啊

专家
2012-09-28 19:32:21     打赏
14楼
1.LED闪烁、LED流水灯演示

准备工作也做的差不多了,脚本文件编写完,每次就不用去一个一个引脚的分配了。刚下午调试了LED闪烁、LED流水灯。其实这两个实验没什么多大的区别。先看视频:


LED闪烁




LED流水灯



代码:

module led_flash(
                 clk,rst_n,
                 led
                 );
                
    input clk;          //50MHz
    input rst_n;        //复位信号,低电平有效
   
    output[7: 0] led;   //8个LED灯
   
    reg[23: 0] cnt;     //计数器,最大可以计到2^24 *20 ns ,大约320ms
   
    always @(posedge clk or negedge rst_n)
        if(!rst_n)
            cnt <= 24'b0;
        else
            cnt <= cnt + 1'b1;     //循环计数
           
    reg[7: 0] led_r;
      
    always @(posedge clk or negedge rst_n)
        if(!rst_n)
            led_r <= 8'b11111111;
        else if(cnt == 24'hffffff)   //每大约320ms led_r进行翻转
            led_r <= ~led_r;
           
    assign led = led_r;   
           
endmodule   

专家
2012-09-28 21:40:15     打赏
15楼

2、八位数码管静态显示


视频:




module smg_8bit(
   clk,rst_n,
   sm_cs,sm_db 
  );

input clk;  // 50MHz
input rst_n; // 复位信号,低有效

output[7:0] sm_cs; //数码管片选信号,低有效
output[6:0] sm_db; //7段数码管(不包括小数点)

reg[24:0] cnt; //计数器,最大可以计数到2的25次方*20ns=640ms

always @ (posedge clk or negedge rst_n)
 if(!rst_n) cnt <= 25'd0;
 else cnt <= cnt+1'b1; //循环计数
 
reg[3:0] num; //显示数值

always @ (posedge clk or negedge rst_n)
 if(!rst_n) num <= 4'd0;
 else if(cnt == 24'hffffff) num <= num+1'b1; //每640ms增一

//-------------------------------------------------------------------------------
/* 共阳极 :不带小数点
              ;0,  1,  2,  3,  4, 5,  6,  7, 
      db      0xc0,0xf9,0xa4,0xb0,0x99,0x92,7dh,07h
              ;8,  9, a,  b,   c,  d,  e,  f , 
      db      80h,90h,88h,83h,c6h,a1h,86h,8eh*/
parameter seg0 = 7'hc0,
   seg1 = 7'hf9,
   seg2 = 7'ha4,
   seg3 = 7'hb0,
   seg4 = 7'h99,
   seg5 = 7'h92,
   seg6 = 7'h82,
   seg7 = 7'hf8,
   seg8 = 7'h80,
   seg9 = 7'h90,
   sega = 7'h88,
   segb = 7'h83,
   segc = 7'hc6,
   segd = 7'ha1,
   sege = 7'h86,
   segf = 7'h8e;

reg[6:0] sm_dbr;  //7段数码管(不包括小数点)
 
always @ (num)
  case (num) //NUM值显示在两个数码管上
   4'h0: sm_dbr <= seg0;

   4'h1: sm_dbr <= seg1;
   4'h2: sm_dbr <= seg2;
   4'h3: sm_dbr <= seg3;
   4'h4: sm_dbr <= seg4;
   4'h5: sm_dbr <= seg5;
   4'h6: sm_dbr <= seg6;
   4'h7: sm_dbr <= seg7;
   4'h8: sm_dbr <= seg8;
   4'h9: sm_dbr <= seg9;
   4'ha: sm_dbr <= sega;
   4'hb: sm_dbr <= segb;
   4'hc: sm_dbr <= segc;
   4'hd: sm_dbr <= segd;
   4'he: sm_dbr <= sege;
   4'hf: sm_dbr <= segf;
   default: ;
   endcase

assign sm_db = sm_dbr;
assign sm_cs = 8'b0;  //数码管常开
endmodule


sof文件:http://share.eepw.com.cn/share/download/id/78999


专家
2012-09-29 20:08:53     打赏
16楼

3、蜂鸣器输出报警音

既然是报警音,当然有点刺耳  。  回头弄乐曲的时候声音就悦耳了



源码:

module beep(
   clk,rst_n,
   beep 
  );

input clk;  //50MHz
input rst_n; //低电平复位信号

output beep; //蜂鸣器

//---------------------------------------------------
reg[15:0] cnt; // 计数器

always @ (posedge clk or negedge rst_n) //异步复位
 if(!rst_n) cnt <= 16'd0;
 else cnt <= cnt+1'b1; //寄存器cnt 2^16 * 20 ns循环计数

//----------------------------------------------------
reg beep_r; //beep信号值寄存器

always @ (posedge clk or negedge rst_n)
 if(!rst_n) beep_r <= 1'b0;
 else if(cnt == 4'hffff) beep_r <= ~beep_r; //每2^16 * 20 ns让beep_r值翻转一次

assign beep = beep_r; 

endmodule


sof文件:http://share.eepw.com.cn/share/download/id/79006


专家
2012-10-02 20:13:33     打赏
17楼

4、按键实验

啥也不说,先上效果视频。




源码:

//当八个独立按键的某一个被按下后,相应的LED被点亮;
//  再次按下后,LED熄灭,按键控制LED亮灭

module key(
      clk,rst_n,
   key,led
      );

input   clk; //主时钟信号,50MHz
input   rst_n; //复位信号,低有效
input[7: 0] key;  
//八个独立按键,低表示按下
output[7: 0] led; //发光二极管,分别由按键控制

//---------------------------------------------------------------------------
reg[7: 0] key_rst; 

always @(posedge clk  or negedge rst_n)
    if (!rst_n) key_rst <= 8'b1111_1111;
    else key_rst <= key;

reg[7: 0] key_rst_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clk  or negedge rst_n )
    if (!rst_n) key_rst_r <= 8'b1111_1111;
    else key_rst_r <= key_rst;
  
//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期
wire[7: 0] key_an = key_rst_r & ( ~key_rst);

//---------------------------------------------------------------------------
reg[19:0]  cnt; //计数寄存器

always @ (posedge clk  or negedge rst_n)
    if (!rst_n) cnt <= 20'd0; //异步复位
 else if(key_an) cnt <=20'd0;
    else cnt <= cnt + 1'b1;
 
reg[7: 0] low_sw;

always @(posedge clk  or negedge rst_n)
    if (!rst_n) low_sw <= 8'b1111_1111;
    else if (cnt == 20'hfffff)  //满20ms,将按键值锁存到寄存器low_sw中  cnt == 20'hfffff
      low_sw <= key;
     
//---------------------------------------------------------------------------
reg  [7:0] low_sw_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clk  or negedge rst_n )
    if (!rst_n) low_sw_r <= 8'b1111_1111;
    else low_sw_r <= low_sw;
  
//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期
wire[7: 0] led_ctrl = low_sw_r[7: 0] & ( ~low_sw[7: 0]);

reg[7: 0] d;

 
always @ (posedge clk or negedge rst_n)
    if (!rst_n) 
        d <= 8'b1111_1111;
    else begin  //某个按键值变化时,LED将做亮灭翻转
        if ( led_ctrl[0] ) d[0] <= ~d[0]; 
        if ( led_ctrl[1] ) d[1] <= ~d[1];
        if ( led_ctrl[2] ) d[2] <= ~d[2];
        if ( led_ctrl[3] ) d[3] <= ~d[3]; 
        if ( led_ctrl[4] ) d[4] <= ~d[4];
        if ( led_ctrl[5] ) d[5] <= ~d[5];
        if ( led_ctrl[6] ) d[6] <= ~d[6]; 
        if ( led_ctrl[7] ) d[7] <= ~d[7];
     
      end

assign led[0] = d[0] ? 1'b1 : 1'b0;  //LED翻转输出
assign led[1] = d[1] ? 1'b1 : 1'b0;
assign led[2] = d[2] ? 1'b1 : 1'b0;
assign led[3] = d[3] ? 1'b1 : 1'b0;
assign led[4] = d[4] ? 1'b1 : 1'b0;
assign led[5] = d[5] ? 1'b1 : 1'b0;
assign led[6] = d[6] ? 1'b1 : 1'b0;
assign led[7] = d[7] ? 1'b1 : 1'b0;

endmodule

sof文件:
——回复可见内容——


专家
2012-10-03 11:24:28     打赏
18楼

5、VGA八色显示

视频:



源码:

module veg_8_colour(
   clk,rst_n,
   hsync,vsync,
   vga_r,vga_g,vga_b
  );

input clk;  //50MHz
input rst_n; //低电平复位
output hsync; //行同步信号
output vsync; //场同步信号
output vga_r;
output vga_g;
output vga_b;

//--------------------------------------------------
reg[10:0] x_cnt; //行坐标
reg[9:0] y_cnt; //列坐标

always @ (posedge clk or negedge rst_n)
 if(!rst_n) x_cnt <= 11'd0;
 else if(x_cnt == 11'd1039) x_cnt <= 11'd0;
 else x_cnt <= x_cnt+1'b1;

always @ (posedge clk or negedge rst_n)
 if(!rst_n) y_cnt <= 10'd0;
 else if(y_cnt == 10'd665) y_cnt <= 10'd0;
 else if(x_cnt == 11'd1039) y_cnt <= y_cnt+1'b1;

//--------------------------------------------------
wire valid; //有效显示区标志

assign valid = (x_cnt >= 11'd187) && (x_cnt < 11'd987)
     && (y_cnt >= 10'd31) && (y_cnt < 10'd631);

wire[9:0] xpos,ypos; //有效显示区坐标

assign xpos = x_cnt-11'd187;
assign ypos = y_cnt-10'd31;

//--------------------------------------------------
reg hsync_r,vsync_r; //同步信号产生

always @ (posedge clk or negedge rst_n)
 if(!rst_n) hsync_r <= 1'b1;
 else if(x_cnt == 11'd0) hsync_r <= 1'b0; //产生hsync信号
 else if(x_cnt == 11'd120) hsync_r <= 1'b1;
 
always @ (posedge clk or negedge rst_n)
 if(!rst_n) vsync_r <= 1'b1;
 else if(y_cnt == 10'd0) vsync_r <= 1'b0; //产生vsync信号
 else if(y_cnt == 10'd6) vsync_r <= 1'b1;

assign hsync = hsync_r;
assign vsync = vsync_r;

//--------------------------------------------------

//对行进行8等分,显示8个区间
//用红蓝绿及三种颜色的叠加使得显示8种颜色

wire a_dis,b_dis,c_dis,d_dis,e_dis,f_dis,g_dis,h_dis; 

assign a_dis = ( (xpos>=0  ) && (xpos<=100) );
assign b_dis = ( (xpos>=100) && (xpos<=200) );
assign c_dis = ( (xpos>=200) && (xpos<=300) );
assign d_dis = ( (xpos>=300) && (xpos<=400) );
assign e_dis = ( (xpos>=400) && (xpos<=500) );
assign f_dis = ( (xpos>=500) && (xpos<=600) );
assign g_dis = ( (xpos>=600) && (xpos<=700) );
assign h_dis = ( (xpos>=700) && (xpos<=800) );


//--------------------------------------------------
//r,g,b控制液晶屏颜色显示
//a显示红色
//b显示绿色
//c显示蓝色
//d区间为红绿叠加 显示黄色
//e区间为红蓝叠加 显示紫色
//f区间为蓝绿叠加 显示天蓝色
//h区间没有任何颜色  显示黑色

assign vga_r = valid ?  (a_dis | d_dis | e_dis | g_dis) : 1'b0;
assign vga_g = valid ?  (b_dis | d_dis | f_dis | g_dis) : 1'b0;
assign vga_b = valid ?  (c_dis | e_dis | f_dis | g_dis) : 1'b0;  

endmodule


sof文件:http://share.eepw.com.cn/share/download/id/79019


助工
2012-10-03 22:43:00     打赏
19楼

厉害呀,速度这么快


专家
2012-10-10 18:45:15     打赏
20楼

6、硬件电子琴

视频:





源码:

module key_song(
              key,clk,rst_n,
              beep,led
              );
  input clk,rst_n;
  input [7:0] key;
  output beep;
  output [7:0] led;

  reg beep_reg;
  reg [15:0] count, delay;
  reg [7:0] key_reg;
 
  always @ (posedge clk or negedge rst_n)
     if(!rst_n)
         count <= 16'd0;
  else if((count==delay)&(!(delay==16'd65535)))
   begin
   count <= 16'd0;
   beep_reg <= ~beep_reg;
   end
     else
      count <= count + 1'b1;
 
  always @ (key)
 begin
  key_reg=key;
  case(key_reg)
  8'b11111110: delay <=16'd47774; //中音1
  8'b11111101: delay <=16'd42567; //中音2
  8'b11111011: delay <=16'd37919; //中音3
  8'b11110111: delay <=16'd35791; //中音4
  8'b11101111: delay <=16'd31888; //中音5
  8'b11011111: delay <=16'd28409; //中音6
  8'b10111111: delay <=16'd25309; //中音7
  8'b01111111: delay <=16'd23889; //高音1
  default: delay <=16'd65535;
  endcase
 end
assign beep=beep_reg;
assign led=key_reg;
endmodule


sof文件:key_song.zip


共78条 2/8 1 2 3 4 5 6 ›| 跳转至

回复

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