在时钟分频实验中我们练习了如何处理时钟,接下来我们要学习如何利用时钟来完成时序逻辑。
本文引用地址:硬件说明
实现是很常见的一个实验,虽然逻辑比较简单,但是里面也包含了实现时序逻辑的基本思想。要用实现有很多种方法,在这里我们会用两种不同的方法实现。
1,模块化设计:在之前的实验中我们做了3-8译码器和时钟分频,如果把这两个结合起来,我们就能搭建一个自动操作的流水LED显示。框图如下:
2,循环赋值:这是一种很简洁的实现效果逻辑,就是定义一个8位的变量,在每个时钟上升沿将最低位赋值给最高位,其他位右移一位,这就实现了循环赋值。这8位输出到LED就能实现流水灯。
Verilog代码
模块化设计是用硬件描述语言进行数字电路设计的精髓,代码可重复利用。而且模块化的设计使得程序的结构也很清晰。这里我们首先看看流水灯的模块化设计。利用了之前的3-8译码器和分频器,你需要把这两个程序也拷贝到一个工程。
// ******************************************************************** // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // ******************************************************************** // File name : flashled.v // Module name : flashled // Author : STEP // Description : segment initial // Web : www.stepfpga.com // // -------------------------------------------------------------------- // Code Revision History : // -------------------------------------------------------------------- // Version: |Mod. Date: |Changes Made: // V1.0 |2017/03/02 |Initial ver // -------------------------------------------------------------------- // Module Function:流水灯的模块化设计 module flashled (clk,rst,led); input clk,rst; output [7:0] led; reg [2:0] cnt ; //定义了一个3位的计数器,输出可以作为3-8译码器的输入 wire clk1h; //定义一个中间变量,表示分频得到的时钟,用作计数器的触发 //例化module decode38,相当于调用 decode38 u1 ( .sw(cnt), //例化的输入端口连接到cnt,输出端口连接到led .led(led) ); //例化分频器模块,产生一个1Hz时钟信号 divide #(.WIDTH(32),.N(12000000)) u2 ( //传递参数 .clk(clk), .rst_n(rst), //例化的端口信号都连接到定义好的信号 .clkout(clk1h) ); //1Hz时钟上升沿触发计数器,循环计数 always @(posedge clk1h or negedge rst) if (!rst) cnt <= 0; else cnt <= cnt +1; endmodule
模块化设计结构清晰,verilog语言是很灵活的。对于流水灯还有一种很简洁的实现方法。
// ******************************************************************** // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // ******************************************************************** // File name : flashled.v // Module name : flashled // Author : STEP // Description : segment initial // Web : www.stepfpga.com // // -------------------------------------------------------------------- // Code Revision History : // -------------------------------------------------------------------- // Version: |Mod. Date: |Changes Made: // V1.0 |2017/03/02 |Initial ver // -------------------------------------------------------------------- // Module Function:流水灯的模块化设计 module flashled (clk,rst,led); input clk,rst; output [7:0] led; wire clk1h; //定义一个中间变量,表示分频得到的时钟,用作计数器的触发 //例化分频器模块,产生一个1Hz时钟信号 divide #(.WIDTH(32),.N(12000000)) u2 ( //传递参数 .clk(clk), .rst_n(rst), //例化的端口信号都连接到定义好的信号 .clkout(clk1h) ); //1Hz时钟上升沿触发循环赋值 reg [7:0] led; always@(posedge clk1h or negedge rst) begin if(!rst) led <= 8'b11111110; // <=为非阻塞赋值 else led <= {led[0],led[7:1]}; //当时钟上升沿来一次,执行一次赋值,赋值内容是led[0]与led[7:1]重新拼接成8位赋给led,相当于循环右移 end endmodule
引脚分配
按照下面表格定义输入输出信号
信号 | 引脚 | 信号 | 引脚 |
---|---|---|---|
clk | C1 | led[3] | M11 |
rst | L14 | led[4] | P11 |
led[0] | N13 | led[5] | N10 |
led[1] | M12 | led[6] | N9 |
led[2] | P12 | led[7] | p9 |
配置好以后编译下载程序。可以调整例化分频器时传递的参数来调整流水灯的速度。
小结
掌握了verilog里面例化module的用法,采用模块化设计程序。模块化设计是非常重要的设计思想。在下一节我们会学习按键的另外用法按键消抖。
文章来源于:电子产品世界 原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关文章
用51单片机控制的LED流水灯设计(2022-12-26)
,“流水”花样只能实现单一的“从左到右”流方式。运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水花样无限,只要更改流水花样数据表的流水数据就可以随意添加或改变流水......
用单片机控制的LED流水灯设计(2022-12-21)
;子程序返回
END ;程序结束
3.3查表法
上面的两个程序都是比较简单的流水灯程序,“流水”花样只能实现单一的“从左到右”流方式。运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水......
如何基于Keil、STM32用C++编写流水灯程序?(2023-10-20)
如何基于Keil、STM32用C++编写流水灯程序?;通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发单片机呢?
答案肯定是可以的,下面......
基于Keil、STM32,用C++编写流水灯程序(2023-04-06)
基于Keil、STM32,用C++编写流水灯程序;通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发单片机呢?答案是肯定可以的,下面讲讲基于Keil......
嵌入式开发 | 单片机能用C++开发吗?(2023-04-06)
(); Delay(50); }}
编译出来的代码量相对更大:
然后,如果有开发板,直接下载即可运行LED闪烁的现象。
说明:
使用C++写单片机流水灯程序,实现的方法有很多,比如还有一些更高级的继承、多态......
单片机控制花样流水灯原理图及程序(2023-06-06)
就是主函数,包括流水灯的反复循环和j流水灯的方向
6、检查没有错误,编译一下。就可以进行仿真了
单片机32位LED花样流水灯程序及原理图
原理图
LED心形排布图:
程序......
51单片机流水灯电路图大全(2023-10-10)
只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低......
单片机 学习笔记(二)——简单小程序(2024-08-19)
(--i);
}
流水灯程序:
#include
int main()
{
p1 = 0xfe;
while(1)
{
p1 = _crol_(p1, 1......
用汇编语言写个流水灯程序(2023-01-13)
用汇编语言写个流水灯程序;;************* 功能说明 **************
;程序使用P4.7 P4.6 P1.6 P1.7 来演示流水灯,输出低驱动。
Fosc_KHZ EQU......
51单片机(入门保姆级教程)——LED闪烁及流水灯(2023-01-06)
一位
{
LED=_cror_(LED,1);
delay(50000); //延时
}
}
(3)相关知识点
移位函数(最快实现流水灯程序)
需要添加#include库函......