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

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

cb39282b8fb147aaa3a300f70d43c278.png

一、前言


本系列旨在提供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,移动到了输入序列的高位处了。

image.png

这个移位为什么关键呢?


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


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

image.png


用第四行的状态变化再次帮助读者理解移位的奥妙,假如当前状态的余数是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


六、结果分析


bb3f58f7ecde465189d5821620b7d2f6.png

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

相关文章
|
6月前
|
C语言
c语言编程练习题:7-52 求简单交错序列前N项和
c语言编程练习题:7-52 求简单交错序列前N项和
60 0
|
6月前
【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟
【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟
46 0
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
|
6月前
|
C语言
c语言编程练习题:7-32 求交错序列前N项和
c语言编程练习题:7-32 求交错序列前N项和
131 0
【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
【数字IC手撕代码】Verilog序列检测器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog序列检测器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog序列检测器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
|
数据安全/隐私保护
【数字IC手撕代码】Verilog伪随机数生成器|线性反馈移位寄存器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog伪随机数生成器|线性反馈移位寄存器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog伪随机数生成器|线性反馈移位寄存器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog 2^N的格雷码二进制转换|题目|原理|设计|仿真
【数字IC手撕代码】Verilog 2^N的格雷码二进制转换|题目|原理|设计|仿真
【数字IC手撕代码】Verilog 2^N的格雷码二进制转换|题目|原理|设计|仿真
|
人工智能
【数字IC手撕代码】Verilog全加器半加器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog全加器半加器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog全加器半加器|题目|原理|设计|仿真