Verilog设计“111”检测器与“01110”检测器并测试所有情况
Verilog实现“111”检测器与“01110”检测器的设计
使用Quartus+modelsim完成本次设计
文章目录
- Verilog实现“111”检测器与“01110”检测器的设计
- 1. "111"检测器
- 分析
- 代码实现
- Testbench
- 结果
- 2. "01110"检测器
- 分析
- 代码实现
- Testbench
- 结果
1. "111"检测器
分析
分析题目,得到其有限状态机为下图:
代码实现
module detector111(input X,input rst,input clk,output OUT
);reg [1:0]state;reg [1:0]next_state;parameter S0=2'd0,S1=2'd1,S2=2'd2,S3=2'd3;assign OUT = (state==S3)?1:0; //define OUT=1 when S3 statealways @ (posedge clk or posedge rst) if (rst)state <= S0;elsestate <= next_state;always@(*)case(state)S0:if(X) next_state <= S1;else next_state <= S0;S1:if(X) next_state <= S2;else next_state <= S0;S2:if(X) next_state <= S3;else next_state <= S0;S3:if(X) next_state <= S3;else next_state <= S0;default: next_state <= S0;endcaseendmodule
Testbench
`timescale 1 ns/ 1 ns
module detector111_vlg_tst();
reg X;
reg clk;
reg rst;
wire OUT;detector111 i1 (.OUT(OUT),.X(X),.clk(clk),.rst(rst)
);always #10 clk = ~clk;initial begin rst = 1;clk = 0;#10 rst = 0; #20 X = 1;#20 X = 0;#20 X = 1;#20 X = 1;#20 X = 1;#20 X = 1;#20 X = 0;#20 X = 1;#20 X = 0;#20 X = 1;#20 X = 1;#20 X = 1;#20 X = 1;#20 $stop;end initial $monitor($time,"X=%b,OUT=%b",X,OUT);
endmodule
结果
Modelsim结果如下图所示,分析可知实现了题目要求。
逻辑综合出来的电路如下图所示:即只有S3状态才会输出OUT=1。
其中的state的状态机如下图所示(RLT viewer中所示),可见其与分析中绘制的状态机一致。
2. "01110"检测器
分析
题目中关键点为一下几点:
- 检测01110,且他们不重叠。意思为要求检测到一个01110,然后从一个新的开始检测。
- 同时输入AB,那么考虑A和B哪个是01110的开始标志
- Z输出的是一个时钟周期宽度的高电平脉冲,所以要在always里进行赋值
根据题目绘制状态机如下图所示,其中S0表示01110中的0,以此类推,特别注意S1表示第一位是1即没有意义。其中输出为1即检测出01110的状态用红色标出
如果要测试所有情况,那么就是讲detector01110模块中的所有case模块都遍历到,及遍历以下所有情况,需要修改的只有testbench。而如果遍历所有情况,通过分析知道,每次AB的状态为2bit数,可以理解为4种前进的方向,然后一共5个状态,那么要遍历的次数为4^5=1024种情况,遍历即可。
case(state)S0:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S0;4'b11:state<=S011;endcaseS01:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S0;4'b11:state<=S0111;endcase S011:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S1;4'b11:state<=S1;endcase S0111:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S0;4'b11:state<=S1;endcaseS1:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S0;4'b11:state<=S1;endcase
代码实现
module detector01110(input clk,input clr,input A,input B,output reg Z
);reg [3:0]state;parameter S0 = 4'b0,S01 = 4'b01,S011 = 4'b011,S0111 = 4'b0111,S1 = 4'b10;//S1 is random because S01 has already existedalways@(posedge clk or negedge clr)beginif(!clr) begin state <= S0;Z<=0; end //for {A,B}=4'b00;else beginZ = (state==S011&{A,B}==4'b10 | state==S0111&A==4'b0)?1:0;case(state)S0:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S0;4'b11:state<=S011;endcaseS01:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S0;4'b11:state<=S0111;endcase S011:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S1;4'b11:state<=S1;endcase S0111:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S0;4'b11:state<=S1;endcaseS1:case({A,B})4'b00:state<=S0;4'b01:state<=S01;4'b10:state<=S0;4'b11:state<=S1;endcase endcase end end
endmodule
Testbench
`timescale 1 ns/ 1 ns
module detector01110_vlg_tst();
reg A;
reg B;
reg clk;
reg clr;
// wires
wire Z;detector01110 ins1 (
// port map - connection between master ports and signals/registers .A(A),.B(B),.Z(Z),.clk(clk),.clr(clr)
);always #10 clk = ~clk;integer i0;integer i1;integer i2;integer i3;integer i4;//5 layers circulation//4^5=1024initial begin clr = 0;clk = 0;{A,B} = 4'b00;#15 clr = 1; for(i0=0;i0<4;i0=i0+1)begin#20 {A,B} = i0;for(i1=0;i1<4;i1=i1+1)begin#20 {A,B} = i1;for(i2=0;i2<4;i2=i2+1)begin #20 {A,B} = i2;for(i3=0;i3<4;i3=i3+1)begin#20 {A,B} = i3;for(i4=0;i4<4;i4=i4+1)#20 {A,B} = i4;end end end end #50 $stop;end initial $monitor($time,"Z=%b",Z);
endmodule
结果
Modelsim仿真结果如下所示,经分析与预期一致
逻辑综合后的结果如下图所示:
state里的状态机如下图所示,符合预期:
Verilog设计“111”检测器与“01110”检测器并测试所有情况相关推荐
- 基于色度或其他彩色属性设计一个简单的肤色检测器
要求:肤色检测 基于色度或其它彩色属性设计一个简单的肤色检测器. 用手机自拍一张人脸图像. 剪切照片或另外用画笔工具拾取那些可能是肤色的像素(人脸部位). 对这些肤色像素计算彩色分布,如彩色直方图.( ...
- Verilog设计实例(8)按键防抖设计之软件防抖
博文目录 写在前面 正文 背景介绍及回顾 单个按键 单按键的其他设计版本 多个按键 写在最后 参考资料 交个朋友 写在前面 个人微信公众号: FPGA LAB 个人博客首页 注:学习交流使用! 正文 ...
- 维特比译码器的Verilog设计(一)----维特比译码原理
维特比译码器的Verilog设计(一)----维特比译码原理 关于维特比译码 1.编码过程中的状态转移和网格图表示 2.最大似然译码思路 3.硬判决与软判决路径度量 4.译码过程 5.总结 近期由于需 ...
- Verilog设计实例(3)基于Verilog的单端口同步读写RAM设计
文章目录 写在前面 正文 电路设计 行为仿真 交个朋友 写在前面 为什么要写单端口同步读写RAM呢? 没有那么多为什么?就是因为简单.基础,能清晰说明单端口RAM的原理,顺手给出设计,也能说明你的设计 ...
- Verilog设计实例(2)一步一步实现一个多功能通用计数器
博文目录 写在前面 正文 普通的二进制计数器 电路设计 行为仿真 普通的格雷码计数器 电路设计 行为仿真 LFSR 电路设计 行为仿真 多功能计数器 电路设计 行为仿真 生成语句实现方式 电路设计 行 ...
- FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU
FPGA学习之路--基于Verilog设计单总线8位ALU 定义 ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件, ...
- 堆栈verilog设计实现及仿真
堆栈顶层模块设计代码如下: 使用verilog设计实现堆栈的写入和读出功能 工程及仿真如下: 代码设计如下: module stack(input wire clk, reset, push, pop ...
- (101)FPGA面试题-Verilog设计偶校验位
1.1 FPGA面试题-Verilog设计偶校验位 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog设计偶校验位: 5)结束语. 1.1.2 ...
- (96)FPGA面试题-Verilog设计半加器
1.1 FPGA面试题-Verilog设计半加器 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog设计半加器: 5)结束语. 1.1.2 本 ...
最新文章
- c语言输出几个空格,新人提问:如何将输出时每行最后一个空格删除
- 用Kotlin开发android平台语音识别,语义理解应用(olamisdk)
- 用指针来表示二维数组的方法
- (Metro学习三)图片uri保存到本地图片库
- pycharm中出现pytest_在 pycharm 里通过 pytest 运行用例,控制台没有输出日志信息
- C++:18---函数模板(template)
- 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
- CTS(1)---谷歌CTS测试简介
- 做程序员要有“疯子精神”,中国开源开放的科创人才要如何培养?
- 干货整理!10个Python图像处理工具,入门必看,提效大法 | 资源
- C# WinForm开发系列 - Regular Expression
- python histogram函数_python (ploit2)(histogram)
- cocos creator实现读取白鹭movieClip组件(尝试)
- 成都拓嘉辰丰电商:如何处理拼多多物流服务异常
- 【叮咚买菜】叮咚抢菜使用教程
- 中国房地产泡沫规模巨大将载入历史 面临崩溃风险
- ENVI高光谱分析操作步骤
- excal怎么设置模板阈值
- python编程入门视频教程-PYTHON编程从0到1(视频教学版)
- 华师大 OJ 2822
热门文章
- windows vscode安装boost后undefined reference to `ontop_fcontext‘
- 小区物业信息管理系统c语言,小区信息管理系统.doc
- a标签target=”_blank”的安全问题及解决办法
- Java 正则表达式工具类大全
- iOS各种调试技巧豪华套餐
- ubuntu 3D 快捷键
- 发泄键盘?养生鼠标?这届程序员这么过双12!
- 《超越平凡的平面设计: 版式设计原理与应用》—字母部件
- loadimage没有与参数列表匹配的重载函数 解决方案
- java安装及运行环境配置