杭电数字电路课程设计-实验十七-流水灯实验

实验目的

  1. 熟悉掌握开关和显示灯作为输入和输出设备进行各种实验的方法。
  2. 掌握灵活运用Verilog HDL 语言进行各种描述与建模的技巧和方法。

实验要求

  1. 使用合适的描述方式编程实现规定功能的流水灯模块。
  2. 课前任务:在Xilinx ISE上完成创建工程、编辑程序源代码、编程、综合、仿真、验证,确保逻辑正确性。
  3. 实验室任务:配置管脚,生成*.bit文件,完成板级验证。
  4. 撰写实验报告。

实验原理

流水灯的实现方法:
  想实现流水灯,只需用一个寄存器来对应开发板上的LED灯,初始时为寄存器中的某几位赋值为1,则开发板上对应的LED灯亮起。接着只需定时将寄存器进行移位,则开发板上的LED灯也跟着移位,即达到了流水灯的效果。想实现不同模式流水灯的转换,只需根据输入进行不同的寄存器初值赋值,以及采用不同的移位策略即可。

程序代码

module LSD(clk,reset,SW,led);
	input clk,reset;
	input [1:0] SW;
	output  reg [7:0] led;
    wire clk_2HZ;
	reg [1:0] CZ;
	
	Fdiv F(reset,clk,clk_2HZ);
	
	initial begin led <= 8'b0; end
	always @(posedge reset or posedge clk_2HZ) begin
	if(reset) begin led<=8'b00000000; end
	else if( led== 8'b0) 
		begin
			case(SW)
			2'b00:begin led<=8'b10000000;CZ<=SW; end
			2'b01:begin led<=8'b00000001;CZ<=SW; end
			2'b10:begin led<=8'b00011000;CZ<=SW; end
			2'b11:begin led<=8'b10000001;CZ<=SW; end	
			endcase
		end
    else if( SW!=CZ) 
    	begin
			case(SW)
			2'b00:begin led<=8'b10000000;CZ<=SW; end
			2'b01:begin led<=8'b00000001;CZ<=SW; end
			2'b10:begin led<=8'b00011000;CZ<=SW; end
			2'b11:begin led<=8'b10000001;CZ<=SW; end	
			endcase
		end
		else begin
		case(SW)
			2'b00:begin led[7:0] <= {led[0],led[7:1]};end  
			2'b01:begin led[7:0] <= {led[6:0],led[7]};end
			2'b10:begin led[7:4] <= {led[6:4],led[7]};led[3:0] <= {led[0],led[3:1]};end
			2'b11:begin led[7:4] <= {led[4],led[7:5]};led[3:0] <= {led[2:0],led[3]};end	
		endcase
		end
	end
endmodule

module Fdiv(///分频
    input rst_,
    input clk_25M,
    output reg clk_out
    );
	 reg [31:0] cnt;
	 initial begin cnt =32'd0; end
	 initial begin clk_out = 0; end
	 
	 always @(posedge rst_ or posedge clk_25M) begin
	  if(rst_) begin
		cnt<=32'd0;
		clk_out<=1'b0;end
		else if (cnt==32'd12499999) begin
		   clk_out <=~clk_out;                                                                     
			cnt <= 32'd0; end
      else begin
		   cnt<= cnt+1'b1;
			clk_out <= 0;
			end
	end
endmodule

测试用例

always #20 clk=~clk;
	initial begin
		clk=0;
		reset = 0;
		SW = 00;
		#2000000000;
		reset = 0;SW = 01;
		#2000000000;
		reset = 1;SW = 00;
		#1000000000;
		reset = 0;SW = 10;
		#2000000000;
		reset = 0;SW = 11;
		#2000000000;
	end
endmodule

仿真波形图

在这里插入图片描述
  从波形图可以看出,起初寄存器led[7:0]未赋值,当第一次时钟脉冲累计到阈值时led[7:0]赋值为第一种模式,此后当时钟脉冲再次到达阈值时,led[7:0]进行移位,实现了流水灯的效果。

电路管脚图

在这里插入图片描述
在这里插入图片描述

引脚配置文件

NET "led[7]" IOSTANDARD = LVCMOS18;
NET "led[6]" IOSTANDARD = LVCMOS18;
NET "led[5]" IOSTANDARD = LVCMOS18;
NET "led[4]" IOSTANDARD = LVCMOS18;
NET "led[3]" IOSTANDARD = LVCMOS18;
NET "led[2]" IOSTANDARD = LVCMOS18;
NET "led[1]" IOSTANDARD = LVCMOS18;
NET "led[0]" IOSTANDARD = LVCMOS18;
NET "SW[1]" IOSTANDARD = LVCMOS18;
NET "SW[0]" IOSTANDARD = LVCMOS18;

NET "led[7]" LOC = R1;
NET "led[6]" LOC = P2;
NET "led[5]" LOC = P1;
NET "led[4]" LOC = N2;
NET "led[3]" LOC = M1;
NET "led[2]" LOC = M2;
NET "led[1]" LOC = L1;
NET "led[0]" LOC = J2;
NET "SW[1]" LOC = T3;
NET "SW[0]" LOC = U3;
NET "clk" LOC = H4;
NET "reset" LOC = R4;

NET "clk" IOSTANDARD = LVCMOS18;
NET "reset" IOSTANDARD = LVCMOS18;
NET "reset" PULLDOWN;
NET "SW[1]" PULLDOWN;
NET "SW[0]" PULLDOWN;

工程文件

工程文件: 流水灯实验.
关注我即可下载

  • 0
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值