基于Verilog的跑马灯设计

这篇具有很好参考价值的文章主要介绍了基于Verilog的跑马灯设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、设计要求

设计一个能够有多种工作模式控制的8个灯亮灭的电路。
工作模式1:按照从左到右的方向,依次点亮每一盏灯,然后依次熄灭每一盏灯;
工作模式2:分成两组灯,前四个灯为1组,后四个为2组,1组灯按从左到右依次点亮,同时2组灯按从右到左依次点亮,然后两组灯按各自点亮的顺序依次熄灭;
工作模式3:用11110000作为一组灯的序列,按照该顺序完成8盏灯亮灭:即首先灯1亮,然后灯2亮,然后灯3亮,然后灯4亮,然后灯5不亮,然后灯6不亮,然后灯7不亮,然后灯8不亮,然后八个灯同时变成亮,亮,亮,亮,不亮,不亮,不亮,不亮,并保持下去。
工作模式4:自行设计一个模式控制8个灯亮灭。要求和前三个工作模式不同。

要求每种工作模式重复两次,并在2分钟内完成所有工作模式。

输入信号: 选择信号[1:0]S, 时钟信号clk, 复位信号reset
输出信号: 跑马灯亮灭信号[7:0]Y


二、设计思路

用选择信号S控制四种模式的运行,用复位信号reset保证每个新模式的运行从第一个状态开始

1. 总体框图

基于Verilog的跑马灯设计

2. 按功能模块的分模块结构图

运行模式1:
基于Verilog的跑马灯设计
运行模式2:
基于Verilog的跑马灯设计
运行模式3:
基于Verilog的跑马灯设计
运行模式4:
基于Verilog的跑马灯设计

3. 状态图

运行模式1:
基于Verilog的跑马灯设计
运行模式2
基于Verilog的跑马灯设计
运行模式3:
基于Verilog的跑马灯设计
运行模式4:
基于Verilog的跑马灯设计


三、代码实现

1. Verilog代码

module horse_race_lamp(input[1:0]S,
							  input clk,
							  input reset,
							  output reg[7:0]Y);
reg[33:0] cnt;
reg clk_div;
reg[3:0]state;
parameter 
S0=0,
			S1=1,
			S2=2,
			S3=3,
			S4=4,
			S5=5,
			S6=6,
			S7=7,
			S8=8,
			S9=9,
			S10=10,
			S11=11,
			S12=12,
			S13=13,
			S14=14,
			S15=15;
//******************分频模块************************//
/*
always@(posedge clk)//时钟周期:0.2*10^(-7)s,分频后的时钟周期:0.5s
begin
	if(cnt==34'd25_000_000)
			begin
				clk_div<=~clk_div;
				cnt<=0;
			end
	else
			cnt<=cnt+1;
end
*/
//*************************************************//
always@(posedge clk or posedge reset)
begin
	if(reset)
		begin
			Y[7:0]<=8'b0000_0000;
			state<=S0;
		end
	else
	case({S[1],S[0]})
	2'b00:
	begin
		case(state)
		S0:
			begin 
				Y[7:0]<=8'b1000_0000;
					state<=S1; 
			end 
		S1:
			begin 
				Y[7:0]<=8'b1100_0000;
					state<=S2; 
			end
		S2:
			begin 
				Y[7:0]<=8'b1110_0000;
					state<=S3; 
			end
		S3:
			begin 
				Y[7:0]<=8'b1111_0000;
					state<=S4; 
			end
		S4:
			begin 
				Y[7:0]<=8'b1111_1000;
					state<=S5; 
			end
		S5:
			begin 
				Y[7:0]<=8'b1111_1100;
					state<=S6; 
			end
		S6:
			begin 
				Y[7:0]<=8'b1111_1110;
					state<=S7; 
			end
		S7:
			begin 
				Y[7:0]<=8'b1111_1111;
					state<=S8; 
			end
		S8:
			begin 
				Y[7:0]<=8'b0111_1111;
					state<=S9; 
			end
		S9:
			begin 
				Y[7:0]<=8'b0011_1111;
					state<=S10; 
			end
		S10:
			begin 
				Y[7:0]<=8'b0001_1111;
					state<=S11; 
			end
		S11:
			begin 
				Y[7:0]<=8'b0000_1111;
					state<=S12; 
			end
		S12:
			begin 
				Y[7:0]<=8'b0000_0111;
					state<=S13; 
			end
		S13:
			begin 
				Y[7:0]<=8'b0000_0011;
					state<=S14; 
			end
		S14:
			begin 
				Y[7:0]<=8'b0000_0001;
					state<=S15; 
			end
		S15:
			begin 
				Y[7:0]<=8'b0000_0000;
					state<=S0; 
			end
		default
			begin
				Y[7:0]<=8'b0000_0000;
					state<=S0;
			end
		endcase
	end
	2'b01:
	begin
		case(state)
		S0:
			begin 
				Y[7:0]<=8'b1000_0001;
					state<=S1; 
			end 
		S1:
			begin 
				Y[7:0]<=8'b1100_0011;
					state<=S2; 
			end 
		S2:
			begin 
				Y[7:0]<=8'b1110_0111;
					state<=S3; 
			end 
		S3:
			begin 
				Y[7:0]<=8'b1111_1111;
					state<=S4; 
			end 
		S4:
			begin 
				Y[7:0]<=8'b0111_1110;
					state<=S5; 
			end 
		S5:
			begin 
				Y[7:0]<=8'b0011_1100;
					state<=S6; 
			end 
		S6:
			begin 
				Y[7:0]<=8'b0001_1000;
					state<=S7; 
			end 
		S7:
			begin 
				Y[7:0]<=8'b0000_0000;
					state<=S0; 
			end 
		default
			begin
				Y[7:0]<=8'b0000_0000;
					state<=S0;
			end
		endcase
	end
	2'b10:
	begin
		case(state)//11110000
		S0:
			begin 
				Y[7:0]<=8'b1000_0000;
					state<=S1; 
			end 
		S1:
			begin 
				Y[7:0]<=8'b0100_0000;
					state<=S2; 
			end 
		S2:
			begin 
				Y[7:0]<=8'b0010_0000;
					state<=S3; 
			end 
		S3:
			begin 
				Y[7:0]<=8'b0001_0000;
					state<=S4; 
			end 
		S4:
			begin 
				Y[7:0]<=8'b0000_0000;
					state<=S5; 
			end 
		S5:
			begin 
				Y[7:0]<=8'b0000_0000;
					state<=S6; 
			end 
		S6:
			begin 
				Y[7:0]<=8'b0000_0000;
					state<=S7; 
			end 
		S7:
			begin 
				Y[7:0]<=8'b0000_0000;
					state<=S8; 
			end 
		S8:
			begin 
				Y[7:0]<=8'b1111_0000;
					state<=S0; 
			end
		default
			begin
				Y[7:0]<=8'b0000_0000;
					state<=S0;
			end
		endcase
	end
	2'b11:
	begin
		case(state)
		S0:
			begin
				Y[7:0]<=8'b0101_0101;
					state<=S1;
			end
		S1:
			begin
				Y[7:0]<=8'b1100_1100;
					state<=S2;
			end
		S2:
			begin
				Y[7:0]<=8'b1010_1010;
					state<=S3;
			end
		S3:
			begin
				Y[7:0]<=8'b0011_0011;
					state<=S0;
			end
		default
			begin
				Y[7:0]<=8'b0000_0000;
					state<=S0;
			end
		endcase
	end
	default
		Y[7:0]<=8'b0000_0000;
	endcase
end
endmodule

2. Testbench关键代码

initial                                                
begin                                                  
clk=1;
reset=1;
#5 reset=0;
{S[1],S[0]}=2'b00;
#400 reset=1;
#5 reset=0;
{S[1],S[0]}=2'b01;
#200 reset=1;
#5 reset=0;
{S[1],S[0]}=2'b10;
#200 reset=1;
#5 reset=0;
{S[1],S[0]}=2'b11;
#100 $stop;                       
$display("Running testbench");                       
end                                                    
always                                                                 
begin                                                  
#5 clk=~clk;                                         
end   

3. 程序的流程步骤

先将clk和reset初始化为1,5ps后,reset置零,选择信号为00,运行模式1。
400ps后,reset先变成1,5ps后再变成0,选择信号为01,运行模式2。
200ps后,reset先变成1,5ps后再变成0,选择信号为10,运行模式3。
200ps后,reset先变成1,5ps后再变成0,选择信号为11,运行模式4。
100ps后结束程序运行
其中时钟周期为10ps


四、仿真结果

运行模式1:
基于Verilog的跑马灯设计

经过复位后,S变为00。Y按照工作模式1每盏灯亮灭的顺序输出不同的值。

运行模式2:
基于Verilog的跑马灯设计

经过复位后,S变为01。Y按照工作模式2每盏灯亮灭的顺序输出不同的值。

运行模式3:
基于Verilog的跑马灯设计

经过复位后,S变为10,Y按照工作模式3每盏灯亮灭的顺序输出不同的值

运行模式4:
基于Verilog的跑马灯设计

经过复位后,S变为11,Y按照工作模式4每盏灯亮灭的顺序输出不同的值。文章来源地址https://www.toymoban.com/news/detail-480787.html

到了这里,关于基于Verilog的跑马灯设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 跑马灯实验

             1.熟悉龙芯实验开发板、熟悉 VIVADO 的编译环境及操作流程。         2.掌握 FPGA 编程入门知识、利用门级方法实现简单逻辑电路。         3.继续学习 Verilog HDL 语法、掌握跑马灯的设计、熟悉调试过程。          本次实验用 Verilog HDL 语言来描述 6 个不

    2024年02月04日
    浏览(29)
  • 3.跑马灯

    推挽模式输出:因为LED0和LED1阳极都是3.3V,需要将阴极设置为低电平才可以点亮LED; 操作io口时,必须引入源文件和头文件; 关于时钟的文件存放在rcc中; void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 作用:初始化一个或多个io口(同一组)的工作方式和速度, 该函数

    2024年02月10日
    浏览(34)
  • Android --- 跑马灯效果

    跑马灯效果主要使用的控件为TextView,其中涉及的几个标签如下所示: android:ellipsize If set, causes words that are longer than the view is wide to be ellipsized instead of broken in the middle. You will often also want to set scrollHorizontally or singleLine as well so that the text as a whole is also constrained to a single line in

    2023年04月08日
    浏览(65)
  • CSS按钮-跑马灯边框

    思路很简单,实现方法有很多很多。但是大体思路与实现方法都类似:渐变色 + 动画,主要区别在动画的具体实现

    2024年02月11日
    浏览(38)
  • Android 实现跑马灯效果

    Android中实现跑马灯效果有多种方式,本篇简单介绍下: 1: TextView属性实现 这里需要注意下: 需要限制textview的宽度,不能设置为wrap_content 启动跑马灯效果需要获取焦点requestFocus(). 2: 代码实现 3: 自定义 view实现 这里可以使用动画的效果实现. 4: 实现竖直效果的跑马灯

    2024年01月18日
    浏览(43)
  • CSS 之 跑马灯边框

    一、简介 ​ 之前有做过渐变色边框的样式,然后某天刷抖🎵,看到某个老师在讲跑马灯的样式效果,于是就自己尝试实现一下跑马灯样式的边框,虽然这种样式并不常见(基本没卵用),其使用场景我至今没想到,但是它足够花里胡哨,玩的就是花活。CSS才是前端最难精通

    2024年01月17日
    浏览(30)
  • 跑马灯实验(stm32)

    说明:以下内容参考正点原子的相关资料 这里使用的是位带操作来实现操作某个 IO 口的 1 个位 相应的库函数操作代码。 BSRR:端口位设置/清除寄存器 BRR:端口位清除寄存器 可以看到红绿灯交错闪烁

    2024年02月13日
    浏览(29)
  • Vue跑马灯简单案列

    套在自己的vue模板里面即可 content是显示的内容,shouldMove是否滚动(如果大于了文本框才滚动,否则禁止不懂),showResult是否显示滚动条 效果

    2024年02月22日
    浏览(31)
  • uni小程序 跑马灯效果

    写在前面 前几天帮一个朋友咋小程序上加一个类似于跑马灯的效果,本自己手写了一个。(代码和截图都在下方) 效果展示 等我截图~~~ 代码展示(布局代码) 主要就是图片css哪里加了一个“ flex-shrink: 0; ”,因为只是本地的一个功能,所以我就图片数据就写死了,需要的自

    2024年02月12日
    浏览(28)
  • 应广单片机实现跑马灯

            应广单片机处处体现其mini的特性,非常适合做各种方案开发,特别是点灯,什么跑马灯,氛围灯,遥控灯,感应灯,拍拍灯等,用应广都OK。        跑马灯是基础中的基础,我搭了一个框架,要进行扩展或是修改也很容易。不多说,上代码。 #include    \\\"extern.h\\\"

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包