首页 > 其他分享 >Modelsim仿真实现Verilog HDL序列检测器

Modelsim仿真实现Verilog HDL序列检测器

时间:2024-08-01 15:52:52浏览次数:10  
标签:idel s1 Modelsim localparam state Verilog 1100 HDL data

检测接收到的数字序列中出现“10011”的次数。

例如输入序列为40位:

1100_1001_1100_1001_0100_1100_1011_0010_1100_1011

从最高位开始检测,出现了2次:

1100_1001_1100_1001_0100_1100_1011_0010_1100_1011

所以,序列检测器的计数结果应该是2。

状态机如下:

当前状态current_state

下一个状态next_state

下一个数字输入0

下一个数字输入1

idel

idel

s1

s1

s10

s1

s10

s100

s1

s100

idel

s1001

s1001

s10

s10011

s10011

idel

s1

其他变量:

1

clk

时钟,上升沿有效,初始0,周期4ns,每2ns反相一次

2

rst_p

复位,高电平有效,上升沿有效,

3

din

1位,数字序列输入,与data[39]相等(相连)

4

[2:0] current_state

3位,用于表示当前状态和下一个状态。

iedl用000表示

s1用001表示

s10用010表示

s100用011表示

s1001用100表示

s10011用101表示

5

[2:0] next_state

6

y

检测到10011时置为高电平,作为标识

7

[3:0] y_cnt

4位,统计10011出现的个数

8

[39:0] data

40位,每个时钟周期移位一次,将最高位的数字移到最低位。

data={data[38:0],data[39]}

主程序:

module sequence_detector(input wire clk, rst_p, din,
			output wire y, output reg [3:0]y_cnt);
reg [2:0] current_state, next_state;
localparam idel = 3'b000; 
localparam s1 = 3'b001;
localparam s10 = 3'b010;
localparam s100 = 3'b011;
localparam s1001 = 3'b100;
localparam s10011 = 3'b101;
always @(*) begin
	if(rst_p) begin
		next_state <= idel;
	end
	else begin
		case (current_state)
		idel:   next_state <= din?s1:idel;
		s1:     next_state <= din?s1:s10;
		s10:    next_state <= din?s1:s100;
		s100:   next_state <= din?s1001:idel;
		s1001:  next_state <= din?s10011:s10;
		s10011: next_state <= din?s1:idel;
		default: next_state <= idel;
		endcase
	end
end
always @(posedge clk or posedge rst_p) begin
	if(rst_p) begin
		current_state <= idel;
	end
	else begin
		current_state <= next_state;
	end
end
assign y = (current_state == s10011);
always @(posedge clk or posedge rst_p) begin
	if(rst_p) begin
		y_cnt <= 0;
	end
	else begin
		if(y) begin
			y_cnt <= y_cnt + 1;
		end
	end
end
endmodule

测试程序:

`timescale 1ns/1ns
module sequence_detector_tb();
reg clk, rst_p;
wire din, y;
wire [3:0] y_cnt;
reg [39:0] data;
initial begin
	clk <= 0;
	rst_p <= 1;
	#10;
	rst_p <= 0;
	data <= 40'b1100_1001_1100_1001_0100_1100_1011_0010_1100_1011;
	#160 $stop;
end
always #2 clk <= ~clk;
always @(posedge clk)
	data <= {data[38:0], data[39]};
assign din = data[39];
sequence_detector u1(clk, rst_p, din, y, y_cnt);
endmodule

检测到40位数字序列中出现了2次“10011”,仿真结果:

标签:idel,s1,Modelsim,localparam,state,Verilog,1100,HDL,data
From: https://blog.csdn.net/m0_69064909/article/details/140849796

相关文章

  • SpinalHDL之仿真(三)
    本文作为SpinalHDL学习笔记第三十一篇,介绍SpinalHDL仿真过程中访问信号相关内容。目录:1.读写信号2.访问组件层次结构内部的信号3.仿真中内存的加载和存储1.读写信号顶层模块的每个接口信号都可以从Scala程序中读写:语法描述Bool.toBoolean将硬件Bo......
  • SpinalHDL之仿真(二)
    本文作为SpinalHDL学习笔记第三十篇,介绍SpinalHDL启动仿真器相关内容。目录:1.简介2.配置3.在同一硬件上运行多个测试4.从线程中抛出仿真成功或失败结果5.在失败之前捕获给定时间窗内的波形1.简介下面是一个硬件定义+测试平台的示例:importspinal.core._//Iden......
  • Verilog连续赋值、过程赋值、过程连续赋值总结
    最近总是遇到systemverilog的赋值问题,查看了一下手册发现SV的赋值方式总的还是继承了verilog的赋值方式,而且verilog赋值方面的资料比较多,所以就写了先写一篇关于verilog的赋值总结。连续赋值连续赋值就是一旦赋值,输出将随输入改变而变化,一旦修改输入则立刻体现在输出上。input......
  • Modelsim仿真实现Verilog HDL频率检测器
     检测输入信号的频率,输出8位数码显示,十进制。可以用于八段式数码管显示屏。1clk产生1Hz的方波,这是个很低的频率,被检测的频率都比这个高,因此,1个周期(即1s)内,可以有很多很多个signal的上升沿,只需要统计signal上升沿的数量,就可以算出signal的频率。在clk第1个上升沿发生后,令......
  • Verilog编程学习之—呼吸灯
    Verilog编程-呼吸灯1.设计目标用FPGA产生占空比变化的PWM波,控制LED灯由暗变亮的变化。2.设计思路设置PWM波的步长为2us,周期为2ms,每个周期内LED亮的时间由0增加至999,再从999减少至0,依次循环,就可以看到LED灯由暗变亮再由亮变暗的循环过程。可以设置一个占空比寄存器duty_r和一个......
  • SpinalHDL之IO口
    本文作为SpinalHDL学习笔记第二十五篇,介绍SpinalHDLIO口相关API。SpinalHDL学习笔记总纲链接如下:SpinalHDL学习笔记_spinalhdlblackbox-CSDN博客 目录:1.可读开漏IO(ReadableOpenDrain)2.三态1.可读开漏IO(ReadableOpenDrain)ReadableOpenDrain线束定义如下:......
  • HDLBits答案(1)_移位寄存器+更多电路
    前言    由于开发板教学内容部分,代码涉及到状态机内容,HDLBits题库只刷到了计数器,因此后续3至4天决定继续刷题,刷完状态机和全部HDLBits题库。今天刷完移位寄存器+更多电路,以下是书写的代码。题库Question1:构建一个4位移位寄存器(右移),具有异步复位、同步加载和使能......
  • Modelsim仿真时报错Error (vlog-7) Failed to open design unit file XXXXX in read m
    根据之前遇到的问题Vivado关联Modelsim仿真时一直卡在Executinganalysisandcompilationstep…的解决我在TclConsole窗口查看出现的Error信息。出现报错:Error:(vlog-7)Failedtoopendesignunitfile“XXXXX”inreadmode查阅网上解决办法VivadoError:(vlog-......
  • Verilog HDL 的简单组合逻辑设计代码学习记录
    1.比较数据a和b,若两个数据相同则输出1,否则输出0(a、b均为单比特)看需求就简单设置输入a,b,输出o。modulecompare(a,b,o);inputa;inputb;outputo;//先来第一种写法,使用?:,这里是默认全是wire类型assigno=(a==b)?1'b1:1'b0;//第二种写法,使用ifelserego;alwa......
  • [米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-03安路TD结合modelsim仿真
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑!1概述FPGA开发中对设计的代码功能......