TA的每日心情 | 无聊 4 天前 |
---|
签到天数: 530 天 连续签到: 2 天 [LV.9]测试副司令
|
1测试积点
本人使用quartusII编写111序列检测的模块,用modelsim进行仿真,得到了想要的激励,但是输出结果不对,输入存在连续的111的时候,输出还是为0,且一直为0,到底是哪里错了?
模块代码:
- //序列检测器,检测111,采用Mealy型FSM
- module seq_tec1(in, clk, rst, out);
- input in, clk, rst;
- output out;
- reg out;//输出必须有指定类型
-
- parameter [3:0] S0=4'b0001, S1=4'b0010,
- S2=4'b0100, S3=4'b1000; //状态编码,采用独热one hot码。
- //状态寄存器
- reg [3:0] S; //S当前状态
- reg [3:0] Snext; //Snext下一时刻状态
-
- //状态转移方程,根据状态转移表可写出状态转移关系
- always @(in or S)
- begin
- case(S)
- S0: Snext = (in==1'b1)? S1 : S0;
- S1: Snext = (in==1'b1)? S2 : S0;
- S2: Snext = (in==1'b1)? S3 : S0;
- S3: Snext = (in==1'b1)? S3 : S0;
- default: Snext = S0;
- endcase
- end
-
- //rst功能和clk功能
- always @(negedge rst or posedge clk)
- begin
- if(~rst)
- S <= S0;
- else
- S <= Snext;
- end
-
- //输出方程
- always @(negedge rst or posedge clk)
- begin
- if(~rst) //按下复位键
- out <= 1'b0;
- else
- case(S)
- S0 , S1: out <= 1'b0;
- S2 , S3: out <= (in == 1'b1) ? 1'b1 : 1'b0;
- default: out <= 1'b0;
- endcase
- end
-
- endmodule
复制代码 tb代码:
- `timescale 1 ps/ 1 ps
- module seq_tec1_vlg_tst();
- reg clk, rst;
- wire in, out;
- reg [23 : 0] data; //定义一个24位的寄存器用于存放待测数据码
-
- parameter PERIOD = 20;
- //==========模块例化====================//
- seq_tec1 i1 (
- .clk(clk),
- .in(in),
- .out(out),
- .rst(rst)
- );
- //==========产生初始信号=================//
- initial
- begin
- clk = 0; rst = 0;
- #5 rst = 1;
- #20 rst = 0;
- data = 24'b0011_1111_1111_0000_1001_0100;
- //#(PERIOD * 100) $stop; //执行100个时钟周期
- $display("Running testbench");
- end
- //==========产生时钟信号================//
- always #(PERIOD/2) clk = ~clk;
- //========循环移位产生输入数据============//
- always @(posedge clk)
- #5 data = {data[22 : 0], data[23]}; //循环左移
- assign in = data[23]; //将最高位输入到序列检测器中
- endmodule
复制代码 运行结果及
我想要达到的结果通过quartusII自带的VWF仿真得到的:
|
|