【数字IC手撕代码】Verilog模三检测器(判断输入序列能否被三整除)|题目|原理|设计|仿真

芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球
四社区联合力荐!近500篇数字IC精品文章收录
【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍

在这里插入图片描述

一、前言

本系列旨在提供100%准确的数字IC设计/验证手撕代码环节的题目,原理,RTL设计,Testbench和参考仿真波形,每篇文章的内容都经过仿真核对。快速导航链接如下:

1.奇数分频
2.偶数分频
3.半整数分批
4.小数/分数分频
5.序列检测器
6.模三检测器
7.饮料机
8.异步复位,同步释放
9.边沿检测(上升沿,下降沿,双边沿)
10.全加器,半加器
11.格雷码转二进制
12.单bit跨时钟域(打两拍,边沿同步,脉冲同步)
13.奇偶校验
14.伪随机数生成器[线性反馈移位寄存器]
15.同步FIFO
16.无毛刺时钟切换电路

应当说,手撕代码环节是面试流程中既重要又简单的一个环节,跟软件类的岗位相比起来,数字IC的手撕代码题目固定,数量有限,属于整个面试中必得分的一个环节,在这个系列以外,笔者同样推荐数字IC求职者使用“HdlBits”进行代码的训练
链接如下
HDLBits — Verilog Practice

二、模三检测器题目

1.使用verilog代码,设计电路,判断输入序列能否被三整除,能的时候输出1,不能的时候输出0

三、模三检测器的原理

模三检测器的实质是一个判断输入序列的序列检测器
我们可以通过如下的推导过程来进行理解

一个输入被三除,对于余数来说只存在三种可能,分别为0,1,2(被整除,余数为1,余数为2),那么假如0,1,2对应于三种状态,加上IDLE的默认状态,我们需要四个状态,来表示模三检测器的状态机。

但是这里存在一个关键点

即输入序列是一边移位,一边输入,即假如第一位输入1,第二位输入0,在输入第二位的时候,当前输入序列表示为10,即先输入的1,移动到了输入序列的高位处了。

在这里插入图片描述
这个移位为什么关键呢?

因为这个“第一位输入的1”假如在低位处,模三检测器的余数判断为1,但是假如到了高位,这个模三检测器的余数判断为2,这对于我们能否正确理解状态机的状态跳转有很大的帮助

具体的状态机转换是什么样子的呢?

当前态余数输入次态余数输出
0110
0001
1020
1101
2010
2120

第四行的状态变化再次帮助读者理解移位的奥妙,假如当前状态的余数是1,输入的同时,原序列左移,相当于余数翻倍变为2
此时假如data输入0,余数为2,data输入1,余数是0,可以整除。
这里的“当前态”即状态机中的“state”,“次态”即状态机的“next_state”,可以发现,模三检测器的本质,是一个结合了当前状态和输入序列,来判断输出的mealy型状态机

四、RTL设计

module mod3_check(clk,rst_n,data,test);

input clk;
input rst_n;
input data;
output test;

parameter IDLE =2'b00,
s1 =2'b01,
s2 =2'b10,
s3 = 2'b11;

reg [1:0] state,nstate;

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
state<=IDLE;
else
state<=nstate;
end


always@(*)
begin
case(state)
IDLE: nstate = data?s1:s3;
s1: nstate = data?s3:s2;
s2: nstate = data?s2:s1;
s3: nstate = data?s1:s3;
default nstate = IDLE;
endcase
end

assign test = state==s3?1:0;

endmodule

五、Testbench设计

`timescale 1ns/1ps
module mod3_check_tb();
reg clk;
reg rst_n;
reg data;
wire test;

mod3_check u1(.clk(clk),.rst_n(rst_n),.data(data),.test(test));

always #5 clk = ~clk;
always #9.99 data = $random;
initial
begin
clk = 0;
rst_n = 1;
data = 0;
#14
rst_n = 0;
#37
rst_n = 1;
end

endmodule

六、结果分析

在这里插入图片描述

当clk上升沿到来时,首先采到了两个1,test结果输出为1,各状态之间的跳转正常,仿真正确。

  • 14
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
以下是Verilog HDL实现“1001”序列检测器代码: ``` module sequence_detector( input clk, input reset, input data, output reg detect ); reg [3:0] state; parameter S0 = 2'b00; parameter S1 = 2'b01; parameter S2 = 2'b10; parameter S3 = 2'b11; always @(posedge clk, posedge reset) begin if (reset) begin state <= S0; detect <= 0; end else begin case (state) S0: begin if (data) begin state <= S1; end else begin state <= S0; end end S1: begin if (data) begin state <= S1; end else begin state <= S2; end end S2: begin if (data) begin state <= S3; end else begin state <= S0; end end S3: begin if (data) begin detect <= 1; state <= S1; end else begin state <= S0; end end endcase end end endmodule ``` 在这个序列检测器中,我们使用一个4位状态机来检测序列“1001”。如果检测序列,输出信号“detect”将被置为1。 以下是仿真文件的代码: ``` `timescale 1ns / 1ns module sequence_detector_tb; reg clk; reg reset; reg data; wire detect; sequence_detector dut( .clk(clk), .reset(reset), .data(data), .detect(detect) ); initial begin clk = 0; reset = 1; data = 0; #10 reset = 0; end always #5 clk = ~clk; initial begin $dumpfile("sequence_detector.vcd"); $dumpvars(0, sequence_detector_tb); end initial begin // Test case 1: No sequence detected #100 data = 1; #20 data = 1; #20 data = 0; #20 data = 0; #20 data = 1; #20 data = 0; #20 data = 1; #20 data = 0; #20 data = 1; // Test case 2: Sequence detected #100 data = 1; #20 data = 0; #20 data = 0; #20 data = 1; #20 data = 0; #20 data = 1; #20 data = 0; #20 data = 1; $finish; end endmodule ``` 在仿真文件中,我们通过改变输入数据“data”来输入序列。在测试用例1中,我们拟了没有检测序列“1001”的情况;在测试用例2中,我们拟了检测序列“1001”的情况。我们可以通过查看仿真波形来验证序列检测器的正确性。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张江打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值