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

共13条 1/2 1 2 跳转至

jobs 的FPGA DIY进程帖(秒表小作品)

院士
2012-09-25 21:07:51     打赏
 
 2012年11月14日  我的FPGA开发板焊接展示   18楼
 2012年11月24日  我的LED灯——作业1(上)   20楼
 2012年11月24日  我的流水灯实验——作业1(下)
  22楼
 2012年11月27日  我的键盘,我的录入(作业稍后奉上)   23楼
 2012年12月22日  一波三折的数码管实验   24楼
 2012年12月22日  初步学习有限状态机(FMS)   25楼
 2013年03月30日
 动态扫描式显示数码管
  29楼
 2013年04月01日
 秒表小作品
  31楼



    今天终于拿到了传说中的EEPW论坛的FPGA活动的PCB板。黑色的PCB板犹如那广阔的天穹,而那金色的焊盘像不像那消失已久的星星啊~~









版主的包装是相当负责与严密,完全可以有效防止快递的一些众所周知的作法。
      快递还在路上的网友们期待吧……

最后,感谢eepw论坛与版主的共同努力!



关键词: fgpa     动态     扫描    

院士
2012-09-25 22:53:08     打赏
2楼
桌子乱 多少有些无奈啊~~
做硬件的,到处是线,这连连,那连连的……

院士
2012-09-25 23:18:52     打赏
3楼
我也只是不想重样。
下回再换成别的可爱的……

院士
2012-09-26 09:53:07     打赏
4楼
我的相机为1000万像素 滴。

院士
2012-11-14 18:29:51     打赏
5楼
强势来袭,我的焊接展示……









上电已经可以找到jtag啊~~

院士
2012-11-24 13:43:40     打赏
6楼

我的LED灯——作业1
实验目的: 熟悉QuartusII软件及FPGA初学 熟悉verilog语言 实验内容: 将LED灯间隔点亮,此为常亮。 源代码如下:

module led_show(led);

 output [7:0] led;  assign led = 8'b10101010; endmodule 将LED灯以每隔0.5秒闪烁,源代码如下:

module led_flicker(sys_clk, sys_rstn, led);

 input sys_clk;  input sys_rstn;  output [7:0] led;                                        /* LED输出信号 */  reg [7:0] led;  reg [24: 0] delay_cnt;    always @(posedge sys_clk or negedge sys_rstn)  begin     if(!sys_rstn)       delay_cnt <= 25'd0;     else     begin       if(delay_cnt == 25'd24999999)         delay_cnt <= 25'd0;       else         delay_cnt <= delay_cnt + 1'b1;     end  end    

 always @ (posedge sys_clk or negedge sys_rstn)

 begin     if(!sys_rstn)       led <= 8'b11111111;     else     begin       if(delay_cnt == 25'd24999999)         led <= ~led;       else         led <= led;     end  end   endmodule 实验结果: 完成LED灯交替常量显示 根据教程所示,将LED灯以1Hz交替显示。(视频省略) 作业: LED灯以0.5Hz的频率闪烁,此时只须要更改1Hz的时钟计数周期即可,源代码如下:

module led_flicker(sys_clk, sys_rstn, led);

 input sys_clk;  input sys_rstn;  output [7:0] led;                                        /* LED输出信号 */  reg [7:0] led;  reg [25: 0] delay_cnt;    always @(posedge sys_clk or negedge sys_rstn)  begin     if(!sys_rstn)       delay_cnt <= 26'd0;     else     begin       if(delay_cnt == 26'd4999999)         delay_cnt <= 26'd0;       else         delay_cnt <= delay_cnt + 1'b1;     end  end    

 always @ (posedge sys_clk or negedge sys_rstn)

 begin     if(!sys_rstn)       led <= 8'b11111111;     else     begin       if(delay_cnt == 26'd4999999)         led <= ~led;       else         led <= led;     end  end   endmodule   完成编译,并成功在fpga开发板上显示。Cheer~~

院士
2012-11-24 16:26:22     打赏
7楼

我的流水灯实验——作业1(下)
实验目的: 完成经典的流水灯实验 实验内容: 根据版主51FPGA的教程,学习流水灯实验,之后完成作业,并提供视频演示。 源代码如下:

//`define homework 0

 

module led_water(sys_clk, sys_rstn, led);

 input sys_clk;  input sys_rstn;  output [7:0] led;    reg [7:0] led;  reg [24:0] delay_cnt;  

 always @ (posedge sys_clk or negedge sys_rstn)

 begin     if(!sys_rstn)       delay_cnt <= 25'd0;     else     begin       if(delay_cnt == 25'd2499999)         delay_cnt <= 25'd0;       else         delay_cnt <= delay_cnt + 1'b1;     end  end    always @(posedge sys_clk or negedge sys_rstn)  begin     if(!sys_rstn)       led <= 8'b11111111;     else     begin       if(delay_cnt == 25'd2499999)       begin `ifdef homework         led <= led >> 1; `else         led <= led << 1; `endif                if(led == 8'b00000000)           led <= 8'b11111111;       end       else         led <= led;     end  end endmodule 实验结果: 达到实验预期要求,简单而漂亮的流水灯正在运行。简单视频如下:
作业: 此次作业采用预编译的选择编译形式,只需要把第一行预定义去掉即为作业要求——流水灯向左显示。

院士
2012-11-27 21:19:20     打赏
8楼
  我的键盘,我的录入
由于数码管买错了,因为数码管实验不得不暂停。但是时间是不等人的,因此先进行下面的实验,即按键实验。 实验目的: 按键录入信息,主要为数字量的输入。 实验内容: 根据版主的教程,来编写相应的实验。
`define experiment2

`ifdef experiment1

module keypress(sys_clk, sys_rstn, key_in, led_out);
  input sys_clk;
  input sys_rstn;
  input key_in;
  output led_out;
 
  reg led_out;
 
  always @(posedge sys_clk or negedge sys_rstn)
  begin
    if(!sys_rstn)
      led_out <= 1'b1;
    else if(!key_in)
      led_out <= ~led_out;
    else
      led_out <= led_out;
  end
endmodule

`endif

`ifdef experiment2
module keypress(sys_clk, sys_rstn, key_in, led_out);
  input sys_clk;
  input sys_rstn;
  input key_in;
  output led_out;
 
  reg led_out;
  reg [19:0] delay_cnt;
  wire key_scan;
  wire key_low;
  reg key_samp;
  reg key_samp_r;
  reg key_rst;
  reg key_rst_r;
 
  always @(posedge sys_clk or negedge sys_rstn)
  begin
    if(!sys_rstn)
      key_samp <= 1'b1;
    else
      key_samp <= key_in;
  end
 
  always @(posedge sys_clk or negedge sys_rstn)
  begin
    if(!sys_rstn)
      key_samp_r <= 1'b1;
    else
      key_samp_r <= key_samp;
  end
 
  assign key_scan = key_samp_r & (~key_samp);
 
  always @(posedge sys_clk or negedge sys_rstn)
  begin
    if(!sys_rstn)
      delay_cnt <= 20'h0;
    else if(key_scan)
      delay_cnt <= 20'h0;
    else
      delay_cnt <= delay_cnt + 1'b1;
  end
 
  always @(posedge sys_clk or negedge sys_rstn)
  begin
    if(!sys_rstn)
      key_rst <= 1'b1;
    else if(delay_cnt == 20'hfffff)
      key_rst <= key_in;
  end
 
  always @(posedge sys_clk or negedge sys_rstn)
  begin
    if(!sys_rstn)
      key_rst_r <= 1'b1;
    else
      key_rst_r <= key_rst;
  end
 
  assign key_low = key_rst_r & (~key_rst);
 
  always @(posedge sys_clk or negedge sys_rstn)
  begin
    if(!sys_rstn)
      led_out <= 1'b1;
    else if(key_low)
      led_out <= ~led_out;
    else
      led_out <= led_out;
  end
endmodule

`endif 实验结果: 实验一、按键则LED灯反转,无消抖。我们看到随着按键的按下,LED灯有一个短暂的微亮的过程,即由于抖动的存在,LED灯进行了多次反转,因此,亮度出现短暂微亮。当然,也不是每次都能正常的反转,有的时候是亮几次,然后随着按键的抬起,灯的亮度几乎是随机状态。 实验二、添加了消抖功能果然不一样了。每次按键都能正常返回预定的数据。即,按一次LED灯就反转一 次。 作业: 由于数码管未能正确匹配,因此,作业要稍后再完成了。  

院士
2012-12-22 11:22:29     打赏
9楼

一波三折的数码管实验

由于时间有些紧,加之换货的路途遥远,不过,还好,找到一个闲置的,于是抓紧实验,可是过程又是如此的一波三折……

实验目的: 点亮这信息丰富的4位8位段码LED灯。使其依次显示4位的0至F。 实验内容: 依据51FPGA版主的教程编写如下代码:

module led_display(sys_clk, sys_rstn, sm_seg, sm_bit);

 input sys_clk;  input sys_rstn;  output [7:0] sm_seg;  output [7:0] sm_bit;    reg [7:0] sm_seg;  wire [7:0] sm_bit;  reg [3:0] disp_dat;  reg [25:0] delay_cnt;    always @(posedge sys_clk or negedge sys_rstn)  begin     if(!sys_rstn)       delay_cnt <= 26'd0;     else     begin       if(delay_cnt == 26'd49999999)         delay_cnt <= 26'd0;       else         delay_cnt <= delay_cnt + 1'b1;     end  end    always @(posedge sys_clk or negedge sys_rstn)  begin     if(!sys_rstn)       disp_dat <= 4'd0;     else     begin       if(delay_cnt == 26'd49999999)         disp_dat <= disp_dat + 1'b1;       else         disp_dat <= disp_dat;     end  end    always @(disp_dat)  begin     case(disp_dat)       4'h0 : sm_seg = 8'hc0;       4'h1 : sm_seg = 8'hf9;       4'h2 : sm_seg = 8'ha4;       4'h3 : sm_seg = 8'hb0;       4'h4 : sm_seg = 8'h99;       4'h5 : sm_seg = 8'h92;       4'h6 : sm_seg = 8'h82;       4'h7 : sm_seg = 8'hf8;       4'h8 : sm_seg = 8'h80;       4'h9 : sm_seg = 8'h90;       4'ha : sm_seg = 8'h88;       4'hb : sm_seg = 8'h83;       4'hc : sm_seg = 8'hc6;       4'hd : sm_seg = 8'ha1;       4'he : sm_seg = 8'h86;       4'hf : sm_seg = 8'h8e;     endcase  end    assign sm_bit = 8'b00000000; endmodule 实验结果: 成功编译后下载至fpga内,则依次显示,与预期效果一致。请大家稍后看视频,检查我的成果。 实验感受: 遭遇第一折,编译成功后,下载至芯片内,发现LED显示残缺,第一反应,代码wrong!仔细查找,并无error。再查找原理图,对照物料清单,发现使用的为共阳极的LED数码管,而其编号却为共阴极的,至此,发现数码管购买错误,不得不暂停实验。 遭遇第二折,偶然发现还有一个闲置的LED数码管,恰好为共阳极的,于是兴奋的直接拿过来。为了节省开支,我焊了一个座,这样数码管就可以插拔了,可是,接口使用的为2.54mm的,而数码管的引脚为细引脚,这样造成了接触不良,要么这边的亮,要么那边的亮。唉,为了省钱再想办法。原因是细,那么我将其弄成一个小小的曲度,这样就增大了接触面积,果然问题得到解决。 遭遇第三折,不再闪,不再接触不良。却有一位灯不亮。因为只有一位灯,考虑极可能为片选虚焊造成。找出原理图,第三位对应的为R97与Q5.拿起电烙铁进行补焊。重新上电,激动人心的时刻终于到来。四位数码管终于可以正常亮了。


院士
2012-12-22 14:25:29     打赏
10楼
初步学习有限状态机(FMS) 学习FPGA不可能不学习状态机,那么今天中午就踏下心来学习传说中的有限状态机。 实验目的: 学习有限状态机概念及动用。使用数码管做一个只有两个状态的显示方案。即按下按键后,数码管不再继续显示。 实验内容: 先说四个名词:Mealy型,Moore型,Gray编码,独热码编码。现在分别解释一下: 前两个是有限状态机的两个类型,Mealy型取决于各个输入值,还取决于当前所在状态;而Moore型只取决于当前状态。 后两个是状态机的编码方式,Gray编码是以包含全部状态信息的最小位为编码量,即如果有4个状态量,则分别为2’b00, 2’b01, 2’b10, 2’b11;而独热型,以每位占用一个状态来表示,即如果有4个状态量,则需要4位长度来表示。常用独热型来表示。 下面展示一下我设计的只有两个状态量的状态机吧!

module simple_fsm(sys_clk, sys_rstn, sm_seg, sm_bit, key1);

 input sys_clk;  input sys_rstn;  input key1;  output [7:0]sm_seg;  output [7:0]sm_bit;    reg [7:0] sm_seg;  wire [7:0] sm_bit;  reg [3:0] disp_dat;  reg [25:0] delay_cnt;    reg [1:0] state;  parameter     Start = 2'b01, Stop = 2'b10;    always @(posedge sys_clk or negedge sys_rstn)  begin     if(!sys_rstn)     begin       delay_cnt <= 26'd0;                                    /* 默认状态 */       state <= Stop;     end     else case(state)       Stop:         begin           if(key1)             state <= Start;         end       Start:         begin           if(!key1)             state <= Stop;                       if(delay_cnt == 26'd49999999)             delay_cnt <= 26'd0;           else

            delay_cnt <= delay_cnt + 1'b1;           

        end       default:         state <= Start;     endcase  end   always @(posedge sys_clk or negedge sys_rstn)  begin     if(!sys_rstn)       disp_dat <= 4'd0;     else       begin         if(delay_cnt == 26'd49999999)           disp_dat <= disp_dat + 1'b1;         else           disp_dat <= disp_dat;       end  end   always @(disp_dat)  begin     case(disp_dat)       4'h0 : sm_seg = 8'hc0;       4'h1 : sm_seg = 8'hf9;       4'h2 : sm_seg = 8'ha4;       4'h3 : sm_seg = 8'hb0;       4'h4 : sm_seg = 8'h99;       4'h5 : sm_seg = 8'h92;       4'h6 : sm_seg = 8'h82;       4'h7 : sm_seg = 8'hf8;       4'h8 : sm_seg = 8'h80;       4'h9 : sm_seg = 8'h90;       4'ha : sm_seg = 8'h88;       4'hb : sm_seg = 8'h83;       4'hc : sm_seg = 8'hc6;       4'hd : sm_seg = 8'ha1;       4'he : sm_seg = 8'h86;       4'hf : sm_seg = 8'h8e;     endcase  end   assign sm_bit = 8'b00001111; endmodule 实验结果: 与预期的结果一致,按下Key2键后,显示暂停,松开后,显示继续。 视频稍后奉上。

共13条 1/2 1 2 跳转至

回复

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