您现在的位置:首页 >> 技术文章 >> FPGA技术 >> 内容

matlab代做highspeedlogic★FPGA+verilog编程之流水灯

时间:2016-6-14 23:36:02 点击:

  核心提示:matlab代做,FPGA代做,淘宝,专业代做MATLAB、FPGA博士/硕士/本科毕业设计、项目仿真、Coursework、Assignment...

matlab代做FPGA代做淘宝专业代做MATLABFPGA博士/硕士/本科毕业设计项目仿真CourseworkAssignment

流水灯,以8个并排的led为例,随着时间的推移逐步点亮所有led;被点亮的led数量不断增加,不同于跑马灯任何时刻只有一个led被点亮。

    流水灯的操作也涉及到对bit位置的操作,结合前一篇跑马灯,做流水灯,通过使用不同的建模方法,来实现流水灯;详细的实现过程代码如下:注释比较齐全;实现不难,但是很多细节需要注意,

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Engineer: FpgaBo
// Module Name:   
// Project Name:
// Target Devices: XC3S500E-4pq208----xilinx Spartan-3AN 500;-4standard,-5high
// Tool versions: ISE12.3+Modelsim SE
// Revision 0.01 - File Created
// QQ:851220539
//系统时钟50Mhz,
// LED7--LED6--LED5--LED4--LED3--LED2--LED1--LED0;高电平点亮,LED7为高位
// LED流水灯,从LED0逐渐点亮led直到所有led被点亮,类似流水,从led0流到led7,全部点亮,
//////////////////////////////////////////////////////////////////////////////////
module FlowLed(
    input CLK,
    input RSTn,
    output [7:0] LedFlow1Lift8,//  <---
    output [7:0] LedFlow2Lift8,
    output [7:0] LedFlow3Lift8,
  output [7:0] LedFlow1Left1Right8,//<---,--->
    output [7:0] LedFlow3Right2Left8//三次高位流到低位,两次低位流到高位
    );
//////////////////////////////////////////////////////////////////////////////
//计数模块,控制延时信息
//50Mhz,20ns,20ns*50000=1ms,2^16 =65 536 counter[15:0]
////////////////////////////////////////////////////////////////////////////// 
// parameter  T1MS  = 49_999;
// parameter  T100MS = 99;
 parameter  T1MS  = 49;//used in TestBench
 parameter  T100MS = 9; 
 reg [15:0]counter;
 reg [7:0]cnt;
 always@(posedge CLK or negedge RSTn)begin
  if(!RSTn)begin
   counter <= 16'd0;
  end
  else if(counter  == T1MS )begin
   counter <= 16'd0;
  end
  else begin
   counter <= counter + 16'd1;
  end
 end
 always@(posedge CLK or negedge RSTn)begin
  if(!RSTn)begin
   cnt <= 8'd0;
  end
  else if(cnt  == T100MS )begin
   cnt <= 8'd0;
  end
  else if(counter  == T1MS)begin
   cnt <= cnt + 8'd1;
  end
 end
//////////////////////////////////////////////////////////////////////////////
//1:连接符移位操作
///////////////////////////////////////////////////////////////////////////// 
 reg [7:0]flow1leftr;
always@(posedge CLK or negedge RSTn)begin 
 if(!RSTn)begin   
  flow1leftr <= 8'h00;
 end 
 else if(cnt  == T100MS)begin  //led0到led7逐个被点亮,全部被点亮时,全部熄灭一个时钟,
  //00--01--03--07--0f--1f--3f--7f--ff;
  flow1leftr <= {flow1leftr[6:0],1'b1};
  if(flow1leftr == 8'hff)
   flow1leftr <= 8'h00;//9ms为一个周期
  // flow1leftr <= 8'h01;//8ms为一个周期,无全灭
 end  else begin   
  flow1leftr <= flow1leftr;
 end
end
 assign LedFlow1Lift8 = flow1leftr;
//////////////////////////////////////////////////////////////////////////////
//2:移位运算符,
//////////////////////////////////////////////////////////////////////////////
 reg [7:0]flow2leftr;
always@(posedge CLK or negedge RSTn)begin 
 if(!RSTn)begin   
  flow2leftr <= 8'hff;
 end 
 else if(cnt  == T100MS)begin 
//1111_1111--1111_1110--1111_1100--1111_1000--1111_0000--1110_0000--1100_0000--1000_0000--0000_0000
  flow2leftr <=  {flow2leftr << 1};
   if(flow2leftr == 8'h00)
    flow2leftr <= 8'hff;
 end 
 else begin   
  flow2leftr <=  flow2leftr;
 end
end
 assign LedFlow2Lift8 = ~flow2leftr;//将flow2leftr的每一位进行取反
//0000_0000--0000_0001--0000_0011--0000_0111--0000_1111--0001_1111--0011_1111--0111_1111--1111_1111
///////////////////////////////////////////////////////////////////////////////
//方法3 case 语句跳转
//////////////////////////////////////////////////////////////////////////////
  reg [7:0]flow3leftr;
  reg [3:0]i;
always@(posedge CLK or negedge RSTn)begin 
 if(!RSTn)begin   
  flow3leftr <= 8'd00;
  i<=4'd0;
 end 
 else begin 
  case(i)
   4'd0: begin
      if(cnt  == T100MS) begin
       i<=i+4'd1;
      end
      flow3leftr <= 8'h01;
     end
   4'd1: begin
      if(cnt  == T100MS) begin  i<=i+4'd1;end flow3leftr <= 8'h03;
     end
   4'd2: begin
      if(cnt  == T100MS) begin  i<=i+4'd1;end flow3leftr <= 8'h07;
     end
   4'd3: begin
      if(cnt  == T100MS) begin  i<=i+4'd1;end flow3leftr <= 8'h0f;
     end
   4'd4: begin
      if(cnt  == T100MS) begin  i<=i+4'd1;end flow3leftr <= 8'h1f;
     end
   4'd5: begin
      if(cnt  == T100MS) begin  i<=i+4'd1;end flow3leftr <= 8'h3f;
     end
   4'd6: begin
      if(cnt  == T100MS) begin  i<=i+4'd1;end flow3leftr <= 8'h7f;
     end
   4'd7: begin
      if(cnt  == T100MS) begin  i<=4'd0;end   flow3leftr <= 8'hff;
     end
   default:begin
      flow3leftr <= 8'h00;
      i<=4'd0;
     end
  endcase
 end 
end
 assign LedFlow3Lift8 = flow3leftr;
///////////////////////////////////////////////////////////////////////////////
//左移一次,右移一次
///////////////////////////////////////////////////////////////////////////////
 reg [7:0]flow1left1rightr;
 reg [1:0]j;
always@(posedge CLK or negedge RSTn)begin 
 if(!RSTn)begin   
  flow1left1rightr<= 8'h00;
  j <= 2'b01;
 end 
 else if(cnt  == T100MS)begin
  case(j)
   2'b10:begin//-->
      flow1left1rightr <= {1'b1,flow1left1rightr[7:1]};//1xxx_xxxx
     if(flow1left1rightr==8'hff)begin
      j <= 2'b01;
      flow1left1rightr <= 8'h00;
     end
   end
   2'b01:begin//80-40-20-10-08-04-02-01
      flow1left1rightr <= {flow1left1rightr[6:0],1'b1};//xxxx_xxx1
     if(flow1left1rightr==8'hff)begin
      flow1left1rightr <= 8'h00;
      j <= 2'b10;
     end
  //  end
   end//01-80-10
   default:begin
     flow1left1rightr <= 8'h00;
     j <= 2'b01;
   end
  endcase
 end
end 
 assign LedFlow1Left1Right8 = flow1left1rightr;
///////////////////////////////////////////////////////////////////////////////
//右移3次,左移2,
///////////////////////////////////////////////////////////////////////////////
 reg [7:0]flow3right2leftr;
 reg [2:0]k;
always@(posedge CLK or negedge RSTn)begin 
 if(!RSTn)begin   
  flow3right2leftr<= 8'h00;
  k <= 3'd0;
 end 
 else if(cnt  == T100MS)begin
  case(k)
   3'd0,3'd1:begin// 00 --80--c0  => ff;80 => ff           
      flow3right2leftr <= {1'b1,flow1left1rightr[7:1]};
     if(flow3right2leftr==8'hff)begin
      flow3right2leftr <= 8'h80;
      k <= k + 3'd1;
     end
    end
   3'd2:begin// 80 => ff
      flow3right2leftr <= {1'b1,flow1left1rightr[7:1]};
     if(flow3right2leftr==8'hff)begin
      flow3right2leftr <= 8'h01;
      k <= k + 3'd1;
     end
    end
   3'd3:begin//ff<=03<=01
      flow3right2leftr <= {flow3right2leftr[6:0],1'b1};
     if(8'hff == flow3right2leftr)begin
      k <= k + 3'd1;
      flow3right2leftr <= 8'h01;
     end
   end
   3'd4:begin//ff <=03 01
      flow3right2leftr <= {flow3right2leftr[6:0],1'b1};
     if(8'hff == flow3right2leftr)begin
      k <= 3'd0;
      flow3right2leftr <= 8'h80;
     end
   end
   default:begin
      flow3right2leftr <= 8'h00;
      k <= 3'd0;
   end
  endcase
 end
end 
 assign LedFlow3Right2Left8 = flow3right2leftr;
endmodule
总结:fpga作为控制器件,最简单的实验室对led的操作,包括点亮led,闪烁灯,流水灯,跑马灯灯实验虽然简单,却需要使用verilog中最基本的语句,包括if语句,case语句,模块结构层次简单,实现功能简单,这些小模块可以作为大型系统中的子模块,涉及到位操作,计数监测,延时,信号初始化,过程赋值,连续赋值基本概念。相同的功能,可以通过不同的方式进行实现。

作者:matlab代做 来源:matlab代做
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|matlab淘宝代做(www.hslogic.com) © 2018 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科毕业设计、课题设计、论文,毕业论文,Coursework、Eassy、Assignment