第六章- Verilog HDL 高级程序设计举例【Verilog】
创始人
2024-03-15 14:33:59
0

第六章 Verilog HDL 高级程序设计举例【Verilog】

  • 前言
  • 推荐
  • 第六章 Verilog HDL 高级程序设计举例
    • 状态机
    • 用状态机设计1101序列检测器
      • 需要定义几个状态?
      • 代码设计——端口信号声明
      • 状态寄存器
      • 次态生成逻辑设计(C1模块)
      • 输出逻辑设计(C2模块)
      • 完整代码
      • 测试结果
    • 用状态机设计1101序列检测器
      • 不考虑重复序列的状态转移图???
      • 用米里状态机设计1101序列检测器
      • 完整代码
      • 测试结果
    • 交通灯
      • 输出
      • 交通灯的状态转移图
      • 代码设计?
      • 程序设计-----输入输出信号声明
      • 状态寄存器和状态转移逻辑设计
      • 输出逻辑设计
      • 完整代码
      • 测试结果
  • 最后

前言

2022/12/3 14:41

以下内容源自Verilog
仅供学习交流使用

推荐

Verilog

第六章 Verilog HDL 高级程序设计举例

状态机

2段式
在这里插入图片描述
3段式
在这里插入图片描述
Mealy状态机和Moore状态机
在这里插入图片描述

用状态机设计1101序列检测器

需要定义几个状态?

在这里插入图片描述

代码设计——端口信号声明

module seadeta_moore (input wire clk,input wire clr,input wire din,output reg dout);reg [2:0] present_state, next_state;parameter s0=3'b000,s1=3 'b001,s2=3 'b010,s3=3'b011,s4=3'b100;
endmodule

状态寄存器

  • 确定初始状态
  • 每一个clk的上升沿,修改状态寄存器的值
	always @(posedge clk or posedge clr)beginif(clr==1) present_state<=s0;else present_state<=next_state;end

次态生成逻辑设计(C1模块)

  • 根据输入和当前状态,决定转移的下一个状态
	always @(*)begincase (present_state)s0: if (din==1)next_state=s1;else next_state=s0;s1: if(din==1) next_state=s2;else next_state=s0;s2: if (din==0) next_state=s3;else next_state=s2;s3: if(din==1) next_state =s4;else next_state= s0;s4: if(din==0) next_state = s0;else next_state= s2;default next_state= s0;endcaseend

输出逻辑设计(C2模块)

  • 根据当前的状态决定当前的输出
	always@(*)beginif(present_state==s4) dout=1;else dout =0;end

完整代码

//moore型
//考虑重复序列
module seadeta_moore (input wire clk,input wire clr,input wire din,output reg dout);//代码设计--端口信号声明reg [2:0] present_state, next_state;parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100;//状态寄存器//确定初始状态//每一个clk的上升沿,修改状态寄存器的值always @(posedge clk or posedge clr)beginif(clr==1) present_state<=s0;else present_state<=next_state;end//次态生成逻辑设计(C1模块)//根据输入和当前状态,决定转移的下一个状态always @(*)begincase (present_state)s0: if (din==1)next_state=s1;else next_state=s0;s1: if(din==1) next_state=s2;else next_state=s0;s2: if (din==0) next_state=s3;else next_state=s2;s3: if(din==1) next_state =s4;else next_state= s0;s4: if(din==0) next_state = s0;else next_state= s2;default next_state= s0;endcaseend//输出逻辑设计(C2模块)//根据当前的状态决定当前的输出always@(*)beginif(present_state==s4) dout=1;else dout =0;end
endmodule

测试结果

测试

module seadeta_tb;reg  clk;reg  clr;reg  din;wire dout;seadeta_moore m1(clk,clr,din,dout);always#5 clk=~clk;initialbeginclk=0;clr=1;#10 clr=0;din=0;#10 din=1;#10 din=1;#10 din=0;#10 din=1;#10 din=1;#10 din=0;#10 din=1;#10 din=0;#10 din=1;#10 din=1;#10 din=0;#10 din=1;endendmodule

结果
在这里插入图片描述

用状态机设计1101序列检测器

序列检测器就是将一个指定的序列从数字码流中检测出来。
当输入端出现序列1101时,输出为1,否则输出为0。在此不考虑重复序列,即出现指定序列后就重新开始序列检测,不再考虑以前的数据。

不考虑重复序列的状态转移图???

在这里插入图片描述

用米里状态机设计1101序列检测器

  • 需要定义4个状态。
  • 状态转移图

在这里插入图片描述

完整代码

//mealy型
//不考虑重复序列
module seadeta_mealy(input wire clk,input wire clr,input wire din,output reg dout);reg [2:0] present_state, next_state;parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011;//时序逻辑always @(posedge clk or posedge clr)beginif(clr==1) present_state<=s0;else present_state<=next_state;end//组合逻辑always @(*)begincase (present_state)s0: if (din==1)begin next_state=s1; dout=0; endelse begin next_state=s0; dout=0; ends1: if(din==1) begin next_state=s2; dout=0; endelse begin next_state=s0; dout=0; ends2: if (din==0) begin next_state=s3; dout=0; endelse begin next_state=s2; dout=0; ends3: if(din==1) begin next_state =s0; dout=1; endelse begin next_state= s0; dout=0; enddefault begin next_state= s0; dout=0; endendcaseendendmodule

测试结果

测试

module seadeta_tb;reg  clk;reg  clr;reg  din;wire dout;//seadeta_moore m1(clk,clr,din,dout);seadeta_mealy m2(clk,clr,din,dout);always#5 clk=~clk;initialbeginclk=0;clr=1;#10 clr=0;din=0;#10 din=1;#10 din=1;#10 din=0;#10 din=1;#10 din=1;#10 din=0;#10 din=1;#10 din=0;#10 din=1;#10 din=1;#10 din=0;#10 din=1;endendmodule

结果
在这里插入图片描述

交通灯

输出

在这里插入图片描述

交通灯的状态转移图

在这里插入图片描述

代码设计?

  • 用6个彩色LED等代表一组交通信号灯,为输出
  • 行为描述:根据当前的状态点亮熄灭对应的LED灯,计数结束就状态转移

在这里插入图片描述

程序设计-----输入输出信号声明

module traffic(input wire clk,input wire clr,output reg [5:0]lights);reg [2:0]state;reg [3:0]count;parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101;parameter sec5=5,sec1=1;
endmodule

状态寄存器和状态转移逻辑设计

	always @(posedge clk or posedge clr)beginif(clr==1)beginstate<=s0;count<=0;endelsecase (state)s0:	if(count

输出逻辑设计

	always @(*)begincase (state)s0: lights=6'b100001;s1: lights=6'b100010;s2: lights=6'b100100;s3: lights=6'b001100;s4: lights=6'b010100;s5: lights=6'b100100;default lights=6'b100001;endcaseend

在这里插入图片描述

完整代码

module traffic(input wire clk,input wire clr,output reg [5:0]lights);//程序设计-----输入输出信号声明reg [2:0]state;reg [3:0]count;//此位宽由sec5,sec1决定parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101;parameter sec5=5,sec1=1;//此单位为时钟周期//状态寄存器和状态转移逻辑设计always @(posedge clk or posedge clr)beginif(clr==1)beginstate<=s0;count<=0;endelsecase(state)s0:	if(count

测试结果

测试

module traffic_tb;reg clk;reg clr;wire [5:0]lights;traffic u1(clk,clr,lights);always #5 clk=~clk;initialbeginclk=0;clr=1;#10clr=0;endendmodule

结果
在这里插入图片描述

最后

2022/12/3 16:21

这篇博客能写好的原因是:站在巨人的肩膀上

这篇博客要写好的目的是:做别人的肩膀

开源:为爱发电

学习:为我而行

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...