|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
我们的实验报告要求写一个串行检测器 当检测到1111四个1或者超过4个1以上的数列时就输出1 否则就输出0
图像中行为级4个1开始输出1 而门级三个1就开始输出1了 而且门级有延时 大概是7.85ns
因为我的确是初学者 所以很多东西真的不懂 还有望各位高手细心指点 小弟心存感激
(如果有人指点 需要的我我可以上传report)
- 2,verilog代码
- module Check1111(data,clk,clear,result);
-
- input data,clk,clear; //输入信号data,时钟clk,复位信号clear
- output result; //输出信号result
- reg x,result; //变量寄存器x,输出变量寄存器result
- reg [1:0] state; //二位状态寄存器
- reg [1:0] next_state; //二位下一刻状态寄存器
-
- parameter S0=2'b00, //为状态机的四个状态编码
- S1=2'b01,
- S2=2'b10,
- S3=2'b11;
-
- always@(posedge clk or posedge clear)
- if(clear)
- state <= S0; //复位信号到来 状态赋值到SO初始状态
- else
- state <= next_state; //时钟信号到来 将下一刻的状态赋值到当前状态
-
- always@(state or data) //状态或数据流变化时
-
- x = data; //将data赋值到寄存器x
-
- always@(state or x) //状态或寄存器x变化时
- begin
-
- case(state)
- S0 : if(x==1)
- begin //若x检测到1,跳到状态S1,result输出0
- next_state = S1;
- result=0;
- end
-
- else
- begin //若x检测到0,跳到状态S0,result输出0
- next_state = S0;
- result=0;
- end
-
- S1 : if(x==1)
- begin //若x检测到1,跳到状态S2,result输出0
- next_state = S2;
- result=0;
- end
-
- else
- begin
- next_state = S0; //若x检测到0,跳到状态S0,result输出0
- result=0;
- end
-
- S2 : if(x==1)
- begin //若x检测到1,跳到状态S3,result输出0
- next_state = S3;
- result=0;
- end
-
- else
- begin //若x检测到0,跳到状态S0,result输出0
- next_state = S0;
- result=0;
- end
-
- S3 : if(x==1)
- begin //若x检测到1,跳到状态S3,result输出1
- next_state = S3;
- result=1;
- end
-
- else
- begin //若x检测到0,跳到状态S0,result输出0
- next_state = S0;
- result=0;
- end
- default : next_state = S0; //默认的状态为S0
- endcase
- end
-
- endmodule
- 3,仿真代码
- `timescale 1ns / 1ps
- module test_for_check1111;
- // Inputs
- reg data;
- reg clk;
- reg clear;
- // Outputs
- wire result;
- // Instantiate the Unit Under Test (UUT)
- Check1111 uut (
- .data(data),
- .clk(clk),
- .clear(clear),
- .result(result)
- );
- initial
- begin
- // Initialize Inputs
- data = 0; //信号赋初值
- clk = 0;
- clear = 0;
-
- forever #100 clk = ~clk; //设置一个5M时钟
-
- end
-
- initial
- begin
- #50 clear = ~clear; //在开始的时候复位端有效一次使电路赋初值
- #50 clear = ~clear;
-
- @(posedge clk)data = 1; //在时钟上升沿到来的时候提供一段数据流
- @(posedge clk)data = 1;
- @(posedge clk)data = 1;
- @(posedge clk)data = 1;
- @(posedge clk)data = 1;
- @(posedge clk)data = 1;
- @(posedge clk)data = 1;
- @(posedge clk)data = 0;
- @(posedge clk)data = 1;
- @(posedge clk)data = 1;
- @(posedge clk)data = 1;
- @(posedge clk)data = 0;
-
- $stop;
- end
-
- endmodule
复制代码 |
|