当前位置: 首页 > article >正文

fpga-编程线性序列机和状态机

一、线性序列机和有限状态机和(状态机-编程思想)的原理

序列机是什么:用计数器对时钟个数计数,根据相应时钟周期下的单个周期时间和计数个数可以确定某个时刻的时间,确定时间后再需要时间点转换电平!

采用的是线性序列机其原理就是设计者必须清楚每一个时钟节拍,都有哪些东西发生变化;举个例子:这个东西就好比我们的课表一样,我们第一节上语文课,第二节上数学课,第三节上英语课,它是按照时钟节拍一拍一拍的按照事先已经知道要发生的步骤做着每件事情。

而状态机则不同它的灵活性比较高可以随意的从一个状态跳到另一个状态。状态机里面case(state),而序列机里面则是case(count),count表示的是时钟节拍数。

线性序列机:是时间顺序的事件,根据时间先后顺序进行工作。每次执行一个工作,都只能按照时间顺序从头到尾。

状态机:根据程序内的状态,进行工作。例

如:a=1时,做A事情然后a=3;a=3时做B事情然后a=1。

示例

1TLC5620驱动模块(DAC):

module TLC5620_ctrl(clk50M,rst_n,ctrlword,updatareq,updatadone,TLC5620_CLK,TLC5620_DATA,TLC5620_LOAD,TLC5620_LDAC
);input clk50M;input rst_n;input [10:0] ctrlword;input updatareq;output reg updatadone;output reg TLC5620_CLK;output reg TLC5620_DATA;output reg TLC5620_LOAD;output reg TLC5620_LDAC;reg [9:0] counter;/*************************产生计数器************************/always @ (posedge clk50M or negedge rst_n) beginif(!rst_n)counter<=10'd0;else if(updatareq==1|(counter!=10'd0)) beginif(counter==10'd820)counter<=10'd0;elsecounter<=counter+1'b1;endelse counter<=10'd0;end /**********************************************************//*********************线性序列机写接口时序*******************/always @ (posedge clk50M or negedge rst_n) beginif(!rst_n) beginupdatadone<=1'b0;TLC5620_CLK<=1'b0;TLC5620_DATA<=1'b0;TLC5620_LOAD<=1'b0;TLC5620_LDAC<=1'b0;updatadone<=1'b0;endelse begincase(counter)0:beginTLC5620_CLK<=1'b0;TLC5620_DATA<=1'b0;TLC5620_LOAD<=1'b1;TLC5620_LDAC<=1'b0;updatadone<=1'b0;end10:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[10];				end40:TLC5620_CLK<=1'b0;70:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[9];				end100:TLC5620_CLK<=1'b0;130:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[8];				end160:TLC5620_CLK<=1'b0;190:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[7];				end220:TLC5620_CLK<=1'b0;250:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[6];				end280:TLC5620_CLK<=1'b0;310:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[5];				end340:TLC5620_CLK<=1'b0;370:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[4];				end400:TLC5620_CLK<=1'b0;430:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[3];				end460:TLC5620_CLK<=1'b0;490:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[2];				end520:TLC5620_CLK<=1'b0;550:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[1];				end580:TLC5620_CLK<=1'b0;610:beginTLC5620_CLK<=1'b1;TLC5620_DATA<=ctrlword[0];				end640:TLC5620_CLK<=1'b0;670:TLC5620_LOAD<=1'b0;800:TLC5620_LOAD<=1'b1;820:updatadone<=1'b1;default:;endcaseendendendmodule

2串口发送设计

module uart_tx (input			uart_clk,    input			rst_n,  input			tf_empty,//判断才做是否完成input	[7:0]	tf_data,output reg		tf_rdreq,output reg		txd
);reg [7:0] cnt;//节拍计数
reg [7:0] temp_data;//FIFO读数据后进行寄存//LSM_1
always @(posedge uart_clk or negedge rst_n) beginif(rst_n == 1'b0) cnt <= 8'd192;else if (cnt >= 8'd192 && tf_empty == 1'b0) cnt <= 8'd0;eles if(cnt < 8'd192)cnt <= cnt + 1'd1;
end//LSM_2
always @(posedge uart_clk or negedge rst_n) beginif(rst_n == 1'b0) begintxd <= 1'b1;tf_rdreq <= 1'b0;temp_data <= 8'd0;end else case (cnt)0 : begintf_rdreq  <= 1'b0;txd       <= 1'b0;end1 : temp_data <= tf_data;1*16 : txd    <= temp_data[0];2*16 : txd    <= temp_data[1];3*16 : txd    <= temp_data[2];4*16 : txd    <= temp_data[3];5*16 : txd    <= temp_data[4];6*16 : txd    <= temp_data[5];7*16 : txd    <= temp_data[6];8*16 : txd    <= temp_data[7];9*16 : txd    <= 1'b1;endcaseendendmodule

状态机

 

http://www.lryc.cn/news/2387725.html

相关文章:

  • 力扣面试150题--完全二叉树的节点个数
  • Qt 多线程环境下的全局变量管理与密码安全
  • 内网映射有什么作用,如何实现内网的网络地址映射到公网连接?
  • BLIP3-o:一系列完全开源的统一多模态模型——架构、训练与数据集
  • DNS解析流程入门篇
  • spring4第2课-ioc控制反转-依赖注入,是为了解决耦合问题
  • 大模型系列22-MCP
  • 【监控】Prometheus+Grafana 构建可视化监控
  • vscode里几种程序调试配置
  • RAGFlow源码安装操作过程
  • Unity使用XCharts动态配置数据——折线图(LineChart)
  • 【HITCSAPP 哈工大计算机系统期末大作业】 程序人生-Hello’s P2P
  • DAY9 热力图和箱线图的绘制
  • 如何查看 GitLab 内置的 PostgreSQL 版本?
  • VR 技术与病毒分离鉴定:一场奇妙的邂逅​
  • 解释一下NGINX的反向代理和正向代理的区别?
  • 数学笔记一:标量、向量和矩阵基本概念辨析
  • vue3获取两个日期之间的所有时间
  • Python 实现简易版的文件管理(结合网络编程)
  • 元组可以比较大小吗?一次返回多个值?编程语言的元组?声明变量一定需要指定类型吗?
  • PXC集群
  • 线程安全问题的成因
  • 零基础远程连接课题组Linux服务器,安装anaconda,配置python环境(换源),在服务器上运行python代码【3/3 适合小白,步骤详细!!!】
  • 字节跳动BAGEL-7B-MoT模型开源:多模态AI技术的新范式与行业涟漪
  • Ubuntu静态IP配置信息查看命令
  • unity实现wasd键控制汽车漫游
  • Python优雅执行SSH命令:10种方法+虚拟环境深度实践
  • Linux TCP与Socket与IO多路复用(Epoll)
  • LINUX安装运行jeelowcode后端项目(命令行)
  • 嵌入式高级工程师面试全解:从 malloc 到 kernel panic 的系统知识梳理