FPGA(一):用Verilog实现流水灯

大三的冬季学期选了工程教育中级,上的内容是fpga相关的东西,目前课程已经上了一大半,进入到大作业项目阶段,上的知识点不是太多,主要还是普及教育为主,很多东西还是需要自己课下花时间认真地自学。写过几个认为还可以拿出来的例子,希望有时间可以一一分享出来供大家参考借鉴,如有错误还请多多指正。

这次主要选择流水灯作为自己在FPGA方面的第一篇博客,很多人学习单片机、stm32抑或是FPGA都会有点灯相关的实验,这个流水灯实现的代码也比较简单。

说明:这个实验我是在学校发的通信原理课程项目板子上写的,板子的型号是MAX10 —10M50DAF484C7G,不同的板子在接口上会有一定的区别,还请注意。

流水灯实现代码

module flow_led(
	input clk_50,
	input rst_n,
	output reg [9:0]led
);
reg [24:0]counter;

// 初始化
initial
	begin
		led <= 10'b1111111111;
		counter <= 25'd0;
	end

// 计数	
always @ (posedge clk_50 or negedge rst_n)
begin
	if(!rst_n) begin
		counter <= 25'd0;
	end else if(counter == 25'd24999999) begin // 0.5秒换灯
		counter <= 25'd0;
	end else begin
		counter <= counter + 25'd1;
	end
end

// 移位
always @ (posedge clk_50 or negedge rst_n)
begin
	if(!rst_n) begin
		led <= 10'b1000000000;  // 初始亮一个灯,便于循环展示
	end else if(counter == 25'd24999999) begin  // o.5秒换灯
		led[9:0] <= {led[8:0],led[9]};  // 拼接移位
	end else begin
		led <= led;
	end
end
endmodule

编译界面

在这里插入图片描述注:当只用检查语法基本问题的时候不需要全部编译,可以只Compile那个Analysis & Synthesis,因为全部编译会特别耗费时间,特别是对于更高版本的Quartus II软件,目前这个代码我是在Quartus Prime Standard Edition 16.0版本上编译实现的。全部编译会让人等待个15秒-20秒左右的时间,确实有点烦呀。

引脚配置

具体的引脚配置可以参考每个开发板的引脚说明,这里不再详细叙说。请看下图:
在这里插入图片描述注:如果是第一次配置引脚,退出后需要重新编译才可以把代码和板子接口对应上。

烧录进开发板

在这里插入图片描述
注:看到Progress为"100%(Successful)"说明烧录成功,此时就可以看到板子上小灯像流水一样循环点亮了。(具体下载方法不再说明)

  • 16
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 下面是使用 Verilog 实现流水灯的简单示例代码: ``` module TrafficLight(input clk, input reset, output reg green, output red); reg [26:0] counter; always @(posedge clk) begin if (reset) counter <= 0; else counter <= counter + 1; end always @(posedge clk) begin if (counter < 13'b1000_0000_0000) green <= 1'b1; else green <= 1'b0; end always @(posedge clk) begin if (counter >= 13'b1000_0000_0000 && counter < 13'b1100_0000_0000) red <= 1'b1; else red <= 1'b0; end endmodule ``` 这段代码利用了 Verilog 的时序控制语句,实现了一个 27 位计数器(counter),当计数器的值小于 1000_0000_0000 时,绿灯亮;当计数器的值在 1000_0000_0000 到 1100_0000_0000 之间时,红灯亮。 ### 回答2: 流水灯是一种常见的电子元件,它在一系列灯泡之间产生连续的亮灭效果。使用Verilog语言来实现流水灯可以很简单。 首先,我们需要定义一个变量来表示流水灯的状态,例如一个4位的寄存器"Lights"。然后,我们需要一个时钟信号"clk"来控制流水灯的频率。在每个时钟周期,我们将流水灯向右移动一个位置,并将最左边的灯设为关闭状态。 下面是用Verilog实现流水灯的代码: ``` module pipeline_led ( input wire clk, output reg [3:0] Lights ); always@(posedge clk) begin Lights <= Lights << 1; // 向左移动一个位置 Lights[0] <= 0; // 将最左边的灯关闭 end endmodule ``` 在这个代码中,我们使用"always@(posedge clk)"语句来指示模块的行为在上升沿时执行。在时钟信号的上升沿发生时,我们将流水灯向左移动一个位置,再将最左边的灯关闭。 这个模块的输入是一个时钟信号"clk",输出是一个四位的寄存器"Lights"。根据你的需求可以调整寄存器的位宽和灯的数量。 要注意的是,本代码只是一个简单的示例来展示如何使用Verilog实现流水灯。在实际的项目中,你可能还需要考虑其他因素,如灯的数量、频率控制等。 ### 回答3: 流水灯是一种常见的电子产品,具有一组LED灯按照特定顺序逐个点亮的效果。我们可以使用Verilog语言来实现流水灯的控制。 首先,我们需要定义一个计数器来控制LED灯的点亮顺序。这个计数器可以使用一个寄存器来存储当前的计数值。每次计数器改变时,我们就可以根据当前的计数值来决定哪个LED需要点亮。 接着,我们需要定义LED灯的控制信号。这个控制信号可以使用一个寄存器来存储,其中每一位对应一个LED灯的状态。当某一位为1时,表示对应的LED灯需要点亮,当某一位为0时,表示对应的LED灯需要熄灭。 最后,我们可以将计数器和LED控制信号连接起来,通过递增计数值的方式来改变LED灯的显示效果。我们可以使用一个时钟信号来控制计数器的递增频率。每当计数器的值发生变化时,我们就可以根据计数器的值来更新LED控制信号,以实现LED灯的流水效果。 需要注意的是,Verilog语言是一种硬件描述语言,用于描述电路的行为与结构。因此,在实际实现流水灯时,我们需要将Verilog代码综合为对应的硬件电路,并将其加载至FPGA或其他可编程逻辑器件中进行验证和使用。 综上所述,使用Verilog语言可以实现流水灯的功能,通过定义计数器和LED控制信号,并将它们连接在一起,可以实现一组LED灯按照特定顺序逐个点亮的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值