找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4512|回复: 1
打印 上一主题 下一主题
收起左侧

FPGA学习板的流水灯Quartus源码

[复制链接]
跳转到指定楼层
楼主
自制,功能包括:
开关1、2(17、16)控制流水灯速度,00-1分频,01-2分频,10-4分频,11-8分频
开关3、4(15、14)控制流水灯花型,00-00010001,每次移动1,01-00110011,每次移动2,10-01110111,每次移动3,11-00001111,每次移动4
开关5(13)控制流水灯移动方向,0-左,1-右
按钮1(0)复位
LCD屏显示速度、花型和方向,显示效果大致为

(有频闪)
虽然是个智障小程序,不过是FPGA入门课的常见作业……解压之后直接用Quartus打开就可以了

源程序如下:
  1. module LED(
  2.         input rst_n,
  3.                 input sw1,
  4.                 input sw2,
  5.                 input sw3,
  6.                 input sw4,
  7.                 input sw5,
  8.                 output led0,
  9.                 output led1,
  10.                 output led2,
  11.                 output led3,
  12.                 output led4,
  13.                 output led5,
  14.                 output led6,
  15.                 output led7,
  16. input clk,
  17. output reg [7:0] dat,
  18. output reg rs,
  19. output rw,
  20. output en
  21. );   
  22. reg e;   
  23. reg  [15:0] counter;
  24. reg [5:0] current,next,next_f;
  25. reg clkr;
  26. reg [1:0] cnt_f,cnt_g;
  27. reg [26:0] cnt;
  28. reg [7:0] led;
  29. reg [3:0] spd;
  30. reg [1:0] knd;
  31. reg drc;
  32. reg [1:0] stt;
  33. reg [4:0] flg;
  34. reg [4:0] flg_f;
  35. reg [5:0] stt_f;
  36. reg [2:0] i;
  37. always @(posedge clk or negedge rst_n) begin
  38.         if(!rst_n) begin
  39.                 cnt <= 27'd0;
  40.                 stt <= 2'd0;
  41.                 next_f <= 6'h0;
  42.                 cnt_g <= 2'h0;
  43.         end
  44.         else begin
  45.                 i <= sw2 * 2'd3;
  46.                 spd <= (sw1 + 1'b1) * (i + 1'b1);
  47.                 knd[0] <= sw3;
  48.                 knd[1] <= sw4;
  49.                 drc <= sw5;
  50.                 cnt <= cnt + 1'b1;
  51.                 if(cnt == 27'h400000 * spd) begin
  52.                         cnt <= 27'd0;
  53.                         stt <= stt + 1'b1 - drc * 2'd2;
  54.                         case(knd * 4 + stt)
  55.                                 4'h0:led <= 8'h11;
  56.                                 4'h1:led <= 8'h22;
  57.                                 4'h2:led <= 8'h44;
  58.                                 4'h3:led <= 8'h88;
  59.                                 4'h4:led <= 8'h33;
  60.                                 4'h5:led <= 8'hCC;
  61.                                 4'h6:led <= 8'h33;
  62.                                 4'h7:led <= 8'hCC;
  63.                                 4'h8:led <= 8'h77;
  64.                                 4'h9:led <= 8'hEE;
  65.                                 4'hA:led <= 8'hDD;
  66.                                 4'hB:led <= 8'hBB;
  67.                                 4'hC:led <= 8'hF;
  68.                                 4'hD:led <= 8'hF0;
  69.                                 4'hE:led <= 8'hF;
  70.                                 4'hF:led <= 8'hF0;
  71.                         endcase
  72.                 end
  73.         end
  74. end
  75. always @(posedge clk)      
  76. begin
  77.   counter=counter+1;
  78.   if(counter==16'h000f)  
  79.   clkr=~clkr;
  80. end
  81. always @(posedge clkr)
  82. begin
  83. current=next;
  84.   case(current)
  85.     6'h0:   begin  rs<=0; dat<=8'h38; next<=6'h1; end //清屏       
  86.     6'h1:   begin  rs<=0; dat<=8'h0c; next<=6'h2; end //设置显示模式
  87.     6'h2:   begin  rs<=0; dat<=8'h6; next<=6'h3; end //显示器开、光标不显示、光标不允许闪烁
  88.     6'h3:   begin  rs<=0; dat<=8'h1; next<=6'h4; end
  89.     6'h4:   begin  rs<=1; dat<=" "; next<=6'h5; end
  90.     6'h5:   begin  rs<=1; dat<="S"; next<=6'h6; end
  91.     6'h6:   begin  rs<=1; dat<="p"; next<=6'h7; end
  92.     6'h7:   begin  rs<=1; dat<="e"; next<=6'h8; end
  93.     6'h8:   begin  rs<=1; dat<="e"; next<=6'h9; end
  94.     6'h9:   begin  rs<=1; dat<="d"; next<=6'hA; end
  95.     6'hA:   begin  rs<=1; dat<=":"; next<=6'hB; end
  96.     6'hB:   begin  rs<=1; dat<= 8'h30 + spd; next<=6'hC; end
  97.     6'hC:   begin  rs<=1; dat<=" "; next<=6'hD; end
  98.     6'hD:   begin  rs<=1; dat<="K"; next<=6'hE; end
  99.     6'hE:   begin  rs<=1; dat<="i"; next<=6'hF; end
  100.     6'hF:   begin  rs<=1; dat<="n"; next<=6'h10; end
  101.          6'h10:   begin  rs<=1; dat<="d"; next<=6'h11; end
  102.          6'h11:   begin  rs<=1; dat<=":"; next<=6'h12; end
  103.          6'h12:   begin  rs<=1; dat<= 8'h31 + knd; next<=6'h13; end
  104.          6'h13:   begin  rs<=1; dat<=" "; next<=6'h14; end
  105.          6'h14:   begin  rs<=0; dat<=8'hC0; next<=6'h15; end
  106.          6'h15:   begin  rs<=1; dat<=" "; next<=6'h16; end
  107.          6'h16:   begin  rs<=1; dat<=" "; next<=6'h17; end
  108.          6'h17:   begin  rs<=1; dat<="D"; next<=6'h18; end
  109.          6'h18:   begin  rs<=1; dat<="i"; next<=6'h19; end
  110.          6'h19:   begin  rs<=1; dat<="r"; next<=6'h1A; end
  111.          6'h1A:   begin  rs<=1; dat<="e"; next<=6'h1B; end
  112.          6'h1B:   begin  rs<=1; dat<="c"; next<=6'h1C; end
  113.          6'h1C:   begin  rs<=1; dat<="t"; next<=6'h1D; end
  114.          6'h1D:   begin  rs<=1; dat<="i"; next<=6'h1E; end
  115.          6'h1E:   begin  rs<=1; dat<="o"; next<=6'h1F; end
  116.          6'h1F:   begin  rs<=1; dat<="n"; next<=6'h20; end
  117.          6'h20:   begin  rs<=1; dat<=":"; next<=6'h21; end
  118.          6'h21:   begin  rs<=1; dat<= 8'h30 + drc; next<=6'h22; end
  119.          6'h22:   begin  rs<=1; dat<=" "; next<=6'h23; end
  120.          6'h23:   begin  rs<=1; dat<=" "; next<=6'h24; end
  121.          6'h24:   begin  rs<=1; dat<=" "; next<=6'h25; end
  122.     6'h25:   begin rs<=0;  dat<=8'h00;                    //行一遍 然后 把液晶的E 脚 拉高
  123.               if(cnt_f!=2'h2)  
  124.                   begin  
  125.                        e<=0;next<=6'h0;cnt_f<=cnt_f+1;   
  126.                   end  
  127.                    else  
  128.                      begin next<=6'h25; e<=1; next <= next_f; cnt_f <= cnt_g;
  129.                     end   
  130.               end
  131.    default:   next=6'h0;
  132.     endcase
  133. end
  134. assign en=clkr|e;
  135. assign rw=0;
  136. assign led0 = led[0];
  137. assign led1 = led[1];
  138. assign led2 = led[2];
  139. assign led3 = led[3];
  140. assign led4 = led[4];
  141. assign led5 = led[5];
  142. assign led6 = led[6];
  143. assign led7 = led[7];
  144. endmodule  
复制代码


所有资料51hei提供下载:
LED.rar (3.29 MB, 下载次数: 35)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:191615 发表于 2018-11-22 14:56 | 只看该作者
学习了,我是初学者,有点头大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表