第一次verilog实验——序列检测器的实现

  第一次用verilog上机建模,深刻体会到看书所掌握不到的体会。有时候看书无法细心观察到的东西,在敲实验代码的时候,或许能够体现出来。现将第一次的体会记录如下。

还是先将verilog代码写下

 1 /************************************************************************
 2 模块作者:灰色的鱼
 3 编写时间:13:52 2013/2/13
 4 模块功能:对串行输入的数据流进行检测。只要发现10010序列,就立即输出高电平。
 5 *************************************************************************/
 6 module seqdet(x,z,clk,rst_n);
 7 input clk,rst_n;
 8 input x;
 9 output z;
10 
11 reg z;
12 reg [2:0] pstate,nstate;
13 
14 parameter s1=3'd0,
15           s2=3'd1,
16           s3=3'd2,
17           s4=3'd3,
18           s5=3'd4,
19           s6=3'd5;
20           
21 always @(posedge clk or negedge rst_n)
22 begin
23     if(!rst_n)
24         pstate<=s1;
25     else
26         pstate<=nstate;
27 end
28 
29 always @(pstate or x)
30 begin
31     case(pstate)
32         s1:
33             if(x==1)
34                 nstate=s2;
35             else
36                 nstate=s1;
37         s2:
38             nstate=x?s2:s3;
39         s3:
40             nstate=x?s2:s4;
41         s4:
42             nstate=x?s5:s1;
43         s5:
44             nstate=x?s2:s6;
45         s6:
46             nstate=x?s2:s4;
47         default:
48             nstate=s1;
49         endcase
50 end
51 
52 always @(pstate or x or rst_n)
53 begin
54     if(!rst_n==1)
55         z=1'b0;
56     else if(pstate==s5 && x==0)
57                 z=1'b1;
58          else
59             z=1'b0;
60 end
61 
62 endmodule

然后是testbench的代码:

 1 `timescale 1 ns/ 1 ps
 2 module seqdet_vlg_tst();
 3 
 4 reg clk;
 5 reg rst_n;
 6 wire x;                                             
 7 wire z;
 8 
 9 reg[19:0] data;
10 
11 assign x=data[19];
12                           
13 seqdet i1 (
14   
15     .clk(clk),
16     .rst_n(rst_n),
17     .x(x),
18     .z(z)
19 );
20 
21 initial                                                
22 begin                                                  
23                         
24     clk=0;
25     rst_n=0;
26     #500 rst_n=1; 
27     data=20'b1100_1001_0000_1001_0100;                                                                                              
28     #(100*100) $stop;                     
29 end 
30                                                    
31 always                                                                                                                                        
32     #50 clk=~clk; 
33                                                                                                                                                    
34 always @(posedge clk)
35 begin
36     #2 data={data[18:0],data[19]};
37 end 
38                                                
39 endmodule

用Modelsim进行综合前仿真,波形如下:(波形从上到下依次是clk,rst_n,x,z),x用于序列输入,z为检测到"10010"序列之后的输出。

从第一次实验中得到了几点经验,当然在以后的学习之中还需好好注意:

  1. 写testbench时候,`timescale输入问题,t前面的符号是键盘左上角‘1’左边那个键。而3'd0中的符号是引号那个键。这在看书的时候,不细心发现,还不容易察觉。重点是作者也没强调。
  2. 软件问题。话了挺长时间弄软件(指的是Modelsim),加上本身对自己写的代码不是特别自信,所以到了后来才发现软件有问题。按照网络上各种方法医治,都无果。没有办法了,自豪使用免费版本的Modelsim(不过,学习的话真的够用了)。
  3. Verilog的相关语法:

    A. 关于阻塞赋值与非阻塞赋值的用法区别。

    B. assign语句赋值号左边只能是wire类型(只在wire与reg型之中做讨论)。而always快语句中,被赋值的只能是reg类型。

  4.在Quartus II中进行中文注释时,往往不能直接输入。最好的方法是先在记事本里将注释写好,然后copy到Quartus II里去。

  5.对数字的写法不要忘记是<位数>’<进制><数字>。

转载于:https://www.cnblogs.com/yulongchen/archive/2013/02/13/2911046.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、实验目的: 1、深入了解与掌握同步时序逻辑电路的设计过程; 2、了解74LS74、74LS08、74LS32及74LS04芯片的功能; 3、能够根据电路图连接好实物图,并实现其功能。学会设计过程中的检验与完善。 二、实验内容描述: 题目:“1 1 1”序列检测器。 原始条件:使用D触发器( 74 LS 74 )、“与”门 ( 74 LS 08 )、“或”门( 74 LS 32 )、非门 ( 74 LS 04 ),设计“1 1 1”序列检测器。 集成电路引脚图: D触发器( 74 LS 74 ) “与”门 ( 74 LS 08 ) “或........ 三、实验设计过程: 第1步,画出原始状态图和状态表。 根据任务书要求,设计的序列检测器有一个外部输入x和一个外部输出Z。输入和输出的逻辑关系为:当外部输入x第一个为“1”,外部输出Z为“0”;当外部输入x第二个为“1”,外部输出Z为“0”;当外部输入x第三个为“1”,外部输出Z才为“1”。假定有一个外部输入x序列以及外部输出Z为: 输入x: 0 1 0 1 1 1 0 1 1 1 1 0 1 输出Z: 0 0 0 0 0 1 0 0 0 1 1 0 0 要判别序列检测器是否连续接收了“111”,电路必须用不同的状态记载外部输入x的值。假设电路的初始状态为A,x输入第一个“1”,检测器状态由A装换到B,用状态B记载检测器接受了111序列的第一个“1”,这时外部输出Z=0;x输入第二个“1”,检测器状态由B装换到C,用状态C记载检测器接受了111序列的第二个“1”,外部输出Z=0;x输入第三个“1”,检测器状态由C装换到D,外部输出Z=1。然后再根据外部输入及其他情况时的状态转移,写出相应的输出。以上分析了序列检测器工作,由此可画出图7-1所示的原始状态图。根据原始状态图可列出原始状态表,如表7-2所示。 现态 次态/输出 x = 0 x = 1 A A / 0 B / 0 B A / 0 C / 0 C A / 0 D / 1 D A / 0 D / 1 (表 7-2 原始状态表) (图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值