verilog设计一个串行数据检测器
- 格式:docx
- 大小:64.70 KB
- 文档页数:4
基于verilog的序列检测器设计作者:周小仨来源:《软件工程师》2015年第03期摘要:随着科技的飞速发展,传统的电子技术逐渐被现代电子技术取代,以FPGA/CPLD 为硬件,以verilog语言为软件的EDA技术应用越来越广泛,本文旨在以一个具体的序列检测器的设计为例,将以硬件描述语言来设计芯片的流程呈现给大家。
关键词:verilog;序列检测器;状态;EDA中图分类号:TP273 文献标识码:A1 引言(Introduction)在数字信号的传输和数字系统产品的设计和测试过程中,往往需要用到一组特定的串行数字信号,我们把产生序列信号的模块电路称作序列信号发生器,如要求产生一串序列“10001110”为例来给大家展示EDA设计有限状态机的过程[1]。
本电路由计数器与数据选择器两部分构成,结构框图如图1所示,该锁存输出的功能是为了消除电路产生的毛刺。
图1 结构框图Fig.1 Structure diagram2 序列检测器的基本工作过程(The basic workingprocess serial detector)有限状态机一般用来检测一组或多组由二进制码组成的脉冲序列信号,广泛应用于在数字系统中。
当该特定序列检测器连续接收到一组二进制码,如果这组二进制码与检测器中预先设置的码能匹配成功,就输出1,否则输出0。
因为该检测的关键在必须连续接受正确码,中间只要出错以为,就必须重新进行检测,所以要求该检测器记住前一次的正确码及正确序列,直到在连续的检测中所有的串行二进制码都能连续匹配成功。
检测二进制码中,只要有任何一位没匹配成功都回到初始状态重新开始匹配[2]。
方框图如图2所示。
图2 状态流程图Fig.2 State flow diagram3 状态机的基本设计思想(The basic design idea ofstate machine)在数字系统中,当状态连续变化,我们可以采用状态机的设计思想来提高设计效率,还可以增加程序的可读性,从而降低错误的概率。
设计练习进阶前言:在前面九章学习的基础上,通过本章的练习,一定能逐步掌握Verilog HDL设计的要点。
我们可以先理解样板模块中每一条语句的作用,然后对样板模块进行综合前和综合后仿真,再独立完成每一阶段规定的练习。
当十个阶段的练习做完后,便可以开始设计一些简单的逻辑电路和系统。
很快我们就能过渡到设计相当复杂的数字逻辑系统。
当然,复杂的数字逻辑系统的设计和验证,不但需要系统结构的知识和经验的积累,还需要了解更多的语法现象和掌握高级的Verilog HDL系统任务,以及与C语言模块接口的方法(即PLI),这些已超出的本书的范围。
有兴趣的同学可以阅读Verilog语法参考资料和有关文献,自己学习,我们将在下一本书中介绍Verilog较高级的用法。
练习一.简单的组合逻辑设计目的: 掌握基本组合逻辑电路的实现方法。
这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
在Verilog HDL中,描述组合逻辑时常使用assign 结构。
注意equal=(a==b)1:0,这是一种在组合逻辑实现分支判断时常使用的格式。
模块源代码:" qual(equal),.a(a),.b(b)); 简单时序逻辑电路的设计目的:掌握基本时序逻辑电路的实现。
在Verilog HDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。
在可综合的Verilog HDL模型,我们通常使用always块和@(posedge clk)或@(negedge clk)的结构来表述时序逻辑。
下面是一个1/2分频器的可综合模型。
eset(reset),.clk_in(clk),.clk_out(clk_out));endmodule仿真波形:练习:依然作clk_in的二分频clk_out,要求输出与上例的输出正好反相。
编写测试模块,给出仿真波形。
练习三. 利用条件语句实现较复杂的时序逻辑电路目的:掌握条件语句在Verilog HDL中的使用。
实验报告用状态机实现序列检测器实验一、实验目的1.用Verilog HDL描述有限状态机电路。
2.IPCORE的概念与设计。
二、实验内容1.应用有限状态机的设计思路,检测从FPGA片上ROM读出的串行数据是否是特定的数据。
2.每个人需要检测的数据是所用的电脑编号+200后转换的8位二进制数。
三、实验要求1.拟用按键、拨动开关实现系统的时钟,复位信号的输入。
2.一个7段数码显示译码器作为检测结果的输出显示,如果串行序列为”100101”,显示A,否则显示b(系统需要设计一个7段数码显示译码器模块)仍使用消抖模块,对由按键输入的时钟进行消抖处理。
3.读取的串行数据为rom中固化的一个宽度为1bit,深度为16bits的数据。
四、设计思路软件的设计框图如下,该实验可以分为几个模块,rom数据读出模块,串行检测模块,数码管显示模块,顶层模块。
输入的clk为按键消抖后输出的数据,按下一次检测一次,在时钟的上升沿读出数据,时钟的下降沿检测数据,串行模块输出的4bits的数据,直接送给数码管译码模块,译码输出。
五、设计原理1.ROM IP核的生成首先在ISE自己的工程中新建一个块内存,Block Memory Generator,配置深度为16,宽度为1bit,选择生成的类型为单端ROM,然后选择一个已经编写好的memory初始化文件。
Memory初始化文件,编写coe文件:这里我要写入的是226,所以二进制是11100010,写入的内容如下,:memory_initialization_radix=10;memory_initialization_vector=1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0;保存并选择载入。
2.读取rom中的数据根据时钟上升沿读取数据,所以可以写出rom读的代码,代码如下:module read_rom(clk,da,rst);input clk;input rst;output da;reg[3:0] counter;always@(posedge clk or posedge rst) beginif(rst)counter<=1'b0;else counter<=counter+1'b1;enddata_rom u1(.clka(clk), // input clka.addra(counter), // input [3 : 0] addra.douta(da) // output [0 : 0] douta);编写仿真激励文件,得到如下波形,分析可以知道,时钟上升沿数据被读取,读取的数据与我们在配置文件中写入的相同。
实验三用状态机实现序列检测器的设计一、实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。
二、原理说明:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出a,否则输出b。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
例3-1描述的电路完成对序列数"11100101"的。
当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“a”,否则仍然输出“b”。
【例3-1】//顶层文件:module XULIEQI(clk,reset,din18,LED7S);input clk;input reset;input [17:0] din18;output [6:0] LED7S;wire [3:0] AB;wire [17:0] din18;xulie u1 (clk, din18, reset, din);schk u2 (din,clk,reset,AB);decl7s u3 (AB,LED7S);endmodule//串行检测:module schk(DIN,CLK,CLR,AB);input DIN,CLK,CLR;output[3:0] AB;reg [3:0] AB;reg [7:0] Q;parameteridle = 8'b00000000,a = 8'b00000001,b = 8'b00000010,c = 8'b00000100,d = 8'b00001000,e = 8'b00010000,f = 8'b00100000,g = 8'b01000000,h = 8'b10000000;parameter data=8'b11100101;always @(posedge CLK or negedge CLR) if(!CLR)beginQ <= idle;endelsebegincase(Q)idle:beginif(DIN==data[7]) Q<=a;else Q<=idle;enda:beginif(DIN== data[6]) Q<=b;else Q<=idle;endb:beginif(DIN== data[5]) Q<=c;else Q<=idle;endc:beginif(DIN== data[4]) Q<=d;else Q<=c;endd:beginif(DIN== data[3]) Q<=e;else Q<=a;ende:beginif(DIN== data[2]) Q<=f;else Q<=idle;endf:beginif(DIN== data[1]) Q<=g;else Q<=b;endg:beginif(DIN== data[0]) Q<=h;else Q<=idle;endh:beginif(DIN== data[7]) Q<=a;else Q<=idle;enddefault :Q<=idle;endcaseendalways @(Q)beginif(Q==h) AB <= 4'b1010 ;else AB <= 4'b1011 ;endendmodule//前端预置8位数据输入:module xulie(clk, din18, reset, din);input clk;input[17:0] din18;input reset;output din;reg din;parameters0 = 5'b00000,s1 = 5'b00001,s2 = 5'b00010,s3 = 5'b00011,s4 = 5'b00100,s5 = 5'b00101,s6 = 5'b00110,s7 = 5'b00111,s8 = 5'b01000,s9 = 5'b01001,s10 = 5'b01010,s11 = 5'b01011,s12 = 5'b01100,s13 = 5'b01101,s14 = 5'b01110,s15 = 5'b01111,s16 = 5'b10000,s17 = 5'b10001;reg[4:0] cur_state,next_state;always @ (posedge clk or negedge reset) if(!reset)cur_state <= s17;elsecur_state <= next_state;always @ (cur_state or din18 or din ) begincase (cur_state)s17 : begindin <= din18[17];next_state <= s16;ends16 : begindin <= din18[16];next_state <= s15;ends15 : begindin <= din18[15];next_state <= s14;s14 : begindin <= din18[14];next_state <= s13;ends13 : begindin <= din18[13];next_state <= s12;ends12 : begindin <= din18[12];next_state <= s11;ends11 : begindin <= din18[11];next_state <= s10;ends10 : begindin <= din18[10];next_state <= s9;ends9 : begindin <= din18[9];next_state <= s8;ends8 : begindin <= din18[8];next_state <= s7;ends7 : begindin <= din18[7];next_state <= s6;ends6 : begindin <= din18[6];next_state <= s5;ends5 : begindin <= din18[5];next_state <= s4;ends4 : begindin <= din18[4];next_state <= s3;s3 : begindin <= din18[3];next_state <= s2;ends2 : begindin <= din18[2];next_state <= s1;ends1 : begindin <= din18[1];next_state <= s0;ends0: begindin <= din18[0];next_state <= s17;enddefault : begindin <= 1'b0;next_state <= s0;endendcaseendendmodule提示:1.若对于D <= "11100101 ",电路需记忆:初始状态、1、11、111 、1110 、11100、111001、1110010、11100101 共9种状态。
序列检测器verilog课程设计一、课程目标知识目标:1. 掌握Verilog硬件描述语言的基本语法和结构;2. 理解序列检测器的基本原理和工作流程;3. 学会使用Verilog设计并实现序列检测器。
技能目标:1. 能够运用Verilog语言编写简单的数字电路模块;2. 能够对序列检测器进行模块划分,并进行代码编写和仿真;3. 能够分析并解决序列检测器设计过程中遇到的问题。
情感态度价值观目标:1. 培养学生对数字电路设计的兴趣和热情,提高其主动学习的积极性;2. 培养学生的团队协作意识,使其学会在团队中发挥自己的作用;3. 培养学生严谨的学术态度,注重实验数据和结果的分析。
分析课程性质、学生特点和教学要求:本课程为电子与计算机工程专业高年级学生的专业课程,旨在培养学生的硬件设计能力。
学生已具备一定的数字电路基础和Verilog编程能力。
课程要求学生能够独立完成序列检测器的设计和仿真,并在实践中提高自身的问题分析和解决能力。
课程目标分解为以下具体学习成果:1. 能够熟练使用Verilog编写基本的数字电路模块;2. 能够理解和分析序列检测器的工作原理;3. 能够独立完成序列检测器的模块划分、代码编写和功能仿真;4. 能够针对设计过程中遇到的问题进行有效分析和解决;5. 能够在团队项目中发挥自己的优势,为团队贡献力量;6. 能够严谨对待学术问题,注重实验数据和结果的准确性。
二、教学内容1. Verilog基础知识回顾:变量定义、数据类型、运算符、控制语句等;2. 序列检测器原理讲解:序列检测器的功能、应用场景、工作原理及状态机设计方法;3. Verilog模块编写:根据序列检测器原理,编写Verilog代码,包括模块声明、端口定义、逻辑描述等;4. 序列检测器模块划分:对序列检测器进行模块划分,实现模块化设计;5. 代码仿真与调试:使用ModelSim等仿真工具,对Verilog代码进行功能仿真,分析并解决可能出现的问题;6. 实验与分析:结合实际电路,搭建序列检测器,进行验证实验,分析实验结果;7. 团队项目实践:分组进行序列检测器设计,培养学生的团队协作能力和实际操作能力;8. 课程总结与拓展:对本章节内容进行总结,拓展学习其他类型的数字电路设计方法。
西北工业大学《串行数据检测器》实验报告学院:软件与微电子学院学号:2008303538 姓名:陈昊专业:微电子学实验时间:2010年11月实验地点:实验室及宿舍指导教师:曾惠敏西北工业大学2010 年11 月*/module mux_8(addr, in1, in2, in3, in4, in5,in6,in7,in8,mout,ncs); input [2:0] addr; //输入的地址端,3位选择开关input [3:0] in1,in2,in3,in4,in5,in6,in7,in8; //8路数据端输入input ncs; //使能信号output [3:0] mout; //一路输出reg [3:0] mout; //输出声明为寄存器类型always @(addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8 or ncs) //8路输入或者选择开关或者使能信号发生变化则条件触发beginif(!ncs) //低电平使能case(addr)3'b000: mout = in1; //选择开关的3位对应000时,输出等于in1输入;3'b001: mout = in2; //选择开关的3位对应001时,输出等于in1输入;3'b010: mout = in3; //选择开关的3位对应010时,输出等于in1输入;3'b011: mout = in4; //选择开关的3位对应011时,输出等于in1输入;3'b100: mout = in5; //选择开关的3位对应100时,输出等于in1输入;3'b101: mout = in6; //选择开关的3位对应101时,输出等于in1输入;3'b110: mout = in7; //选择开关的3位对应110时,输出等于in1输入;3'b111: mout = in8; //选择开关的3位对应111时,输出等于in1输入;endcaseelsemout = 0; //使能信号高电平时输出一直为0;endendmodule2.编写测试模块test_mux_8.v如下/*** @File test_mux_8.v* @Synopsis 这是8路数据选择器mux_8的测试模块* @Author 陈昊, @* @Version 1* @Date 2010-11-05*//* Copyright(0) 2010-* By 陈昊* All right reserved*/`timescale 1ns/1nsmodule test_mux_8;wire[3:0] mout; //声明输出为线网型,4位reg [3:0] in1,in2,in3,in4,in5,in6,in7,in8; //声明8路输入信号reg [2:0] addr; //3位的选择开关,寄存型类型reg ncs; //1位的寄存器型使能信号//-------------------------------------------------------------产生测试信号------------------------------------------------------ initialbeginncs=0; //在初始化模块里将使能信号置为0,让选择器正常工作in8={$random}%16; //使用系统任务$random产生一个0至15之间的数in1={$random}%16; //并赋予输入in2={$random}%16;in3={$random}%16;in4={$random}%16;in5={$random}%16;in6={$random}%16;in7={$random}%16;addr=3'b000; //让选择开关的3位初始对应为000.repeat(5) //重复下面的语句块5次,赋5次值 begin#10 in8={$random}%16;in1={$random}%16;in2={$random}%16;in3={$random}%16;in4={$random}%16;in5={$random}%16;in6={$random}%16;in7={$random}%16;addr=addr+1; //每执行一次后改变一次选择开关的值,加1end#10 $stop;end//-------------------------------------------------------------------------------------------------------------------------------2.选择Altera STRATIX器件库利用Synplify Pro综合产生的RTL级电路如下五、分析与讨论。
上海电力大学《FPGA应用开发》实验报告实验题目:串行数据序列检测器专业:电子科学与技术班级2017142 学号20171719 姓名李国福时间2019.12.16一、实验目的(1)掌握根据设计要求编写源代码。
(2)掌握根据仿真要求编写测试代码。
(3)掌握在Quartus II中调用ModelSim进行仿真。
二、实验任务及要求1.设计要求检测输入的串行数据序列,当检测到输入序列为LED 灯一直熄灭。
完成源代码和测试代码编写,并进行软件仿真和2.设计提示(1)引脚分布图或者基本框图如图 4-70 所示。
图 4-70 串行数据序列检测器引脚分布图(2)输入/输出引脚列表如表 4-15 如所示。
表 4-15 串行数据序列检测器输入/输出引脚列表输入信号序号信号名称位宽端口类型备注1 clk 1 I 系统时钟2 rst 1 I 复位信号3 load 1 I 加载并行数据信号4 in 4 I 并行输入的 4 位序列输出信号1 led 1 O 检测到序列为1011(3)输入/输出的关系Input:clk,rst,load,inOutput:ledIn(3:0)为一个并行输入的 4 位序列,当 load 信号有效时,并行输入被存入移位寄存器 shift_register,接着产生串行序列输出serial_out, 检测到序列 1011 时 led 点亮。
三、实验内容及步骤输入序列 1011 测试能否正确检测,同时验证输入控制键 load 是否工作。
附:仿真波形图与说明如图 4-71 所示。
四、实验总结由于采用并行数据输入,若 load 信号采用按键,加载数据时为避免加入多个输入的并行数据,可以将系统时钟 clk 进行分频得到一个合适的时钟 q(例如周期为 0.1s)。