verilog根据状态转移表实现电路BUAA集电

1、问题描述:

某同步时序电路转换表如下,请使用verilog实现此同步时序电路。

image.png

模块名称和端口要求:

module name: seq_circuit
input ports: A, clk, rst_n(异步复位)
output ports: Y

样例波形:

43a58eb65c2a2c12695fa42b11f57b2.png

 2、verilog程序如下:

module seq_circuit(
input A,
input clk,
input rst_n,
output reg Y
);

reg Q1=0;
reg Q0=0;

always@(posedge clk,negedge rst_n)begin
if(!rst_n)begin
Y<=0;
Q0<=0;
Q1<=0;
end
else if(A==0)
case({Q1,Q0})
2'b00:begin Y<=0;Q1<=0;Q0<=1;end
2'b01:begin Y<=0;Q1<=1;Q0<=0;end
2'b10:begin Y<=1;Q1<=1;Q0<=1;end
2'b11:begin Y<=0;Q1<=0;Q0<=0;end
endcase
else if(A==1)
case({Q1,Q0})
2'b00:begin Y<=1;Q0<=1;Q1<=1;end
2'b01:begin Y<=0;Q1<=0;Q0<=0;end
2'b10:begin Y<=0;Q1<=0;Q0<=1;end
2'b11:begin Y<=0;Q1<=1;Q0<=0;end
endcase
end

endmodule

Q1Q0的下一状态为11时,即输出的Y=1; 因此case语句并不是与题目描述一一对应。

3、testbench:

module tb_seq_circuit();

reg A;
reg clk;
reg rst_n;
wire Y;

seq_circuit U(A,clk,rst_n,Y);

initial begin
A=0;rst_n=0; clk=0;
#10 A=0;rst_n=0; clk=1;
#5 A=0;rst_n=0; clk=0;
#5 A=0;rst_n=1; clk=1;
#5 A=0;rst_n=1; clk=0;
#5 A=0;rst_n=1; clk=1;
#5 A=0;rst_n=1; clk=0;
#5 A=0;rst_n=1; clk=1;
#5 A=0;rst_n=1; clk=0;
#5 A=1;rst_n=1; clk=1;
#5 A=1;rst_n=1; clk=0;
#5 A=1;rst_n=1; clk=1;
#5 A=1;rst_n=1; clk=0;
#5 A=1;rst_n=1; clk=1;
#5 A=1;rst_n=1; clk=0;
#5 A=1;rst_n=1; clk=1;
end

initial begin
   $dumpfile("test.vcd");
   $dumpvars(0);
end
endmodule

波形图:

 4、总结:

熟悉case语句和简单的时序电路。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QEP(Quadrature Encoder Pulse)电路是用于读取旋转编码器的脉冲信号的电路,通常在电机控制系统中使用。下面是一个简单的Verilog代码示例,用于实现一个基本的QEP电路: ```verilog module qep ( input clk, input rst, input a, input b, output reg dir, output reg [7:0] count ); reg [1:0] state; always @(posedge clk, posedge rst) begin if (rst) begin state <= 2'b00; count <= 8'h00; dir <= 1'b0; end else begin case (state) 2'b00: begin if (a && !b) begin state <= 2'b01; end else if (!a && b) begin state <= 2'b10; end end 2'b01: begin if (!a && !b) begin count <= count + 8'h01; dir <= 1'b0; state <= 2'b00; end else if (a && b) begin state <= 2'b11; end end 2'b10: begin if (!a && !b) begin count <= count - 8'h01; dir <= 1'b1; state <= 2'b00; end else if (a && b) begin state <= 2'b11; end end 2'b11: begin if (a && !b) begin state <= 2'b01; end else if (!a && b) begin state <= 2'b10; end end endcase end end endmodule ``` 这个Verilog模块接受四个输入信号:时钟信号(clk)、复位信号(rst)、A相信号(a)和B相信号(b)。它还生成两个输出信号:方向信号(dir)和计数器值(count)。 该代码使用一个有限状态机来实现QEP电路状态机有四个状态,分别对应于A相和B相的四个可能的状态。 当A相和B相的状态变化时,状态机会根据当前状态和新状态来确定方向,并更新计数器值。最终,输出信号将被更新,以反映旋转方向和计数器值。 请注意,这只是一个基本的QEP电路实现,具体实现方法可能会因电机类型和系统要求而有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值