Verilog HDL:FSM有限状态机设计(2)

FSM Design T2

设计一个脉冲产生电路,当输入信号IN出现正向跳变沿时,输出一个脉冲,该脉冲为持续一个时钟周期的高电平信号。主要波形图如下所示。用Verilog完成设计。(输入信号至少包含reset和clock)注:输出信号名为PULSE,请同学们按照此命名编写Verilog代码。

T2

1. Analysis

根据题中要求需要设计一个边沿检测电路,即:输入信号IN出现正向跳变时,输出信号PLUSE产生一个高电平信号(持续1个时钟周期)。因此,本文需要设置两个reg类型的一位寄存器变量(IN_STATE_0、IN_STATE_1),以保存输入信号IN在当前CLK上升沿、上一个CLK上升沿的电平状态,这代表着实际电路中会存在2个异步复位的D触发器。然后,本文根据这两个寄存器变量保存的输入信号IN的电平,即可判断出输入信号IN是否发生过跳变。

2. Circuit Diagram

T2

3. Port List

Port NameAttributeWidthMeaning
clockinput1 bit时钟信号
resetinput1 bit复位信号
ininput1 bit输入信号IN
pluseoutput1 bit脉冲信号PLUSE

4. Verilog Code

`timescale 1ns/1ps

module exercise2 (CLK, RST, IN, PLUSE);

input wire CLK;
input wire RST;
input wire IN;
output wire PLUSE;

reg in_state_0;
reg in_state_1;

always @ (posedge CLK or negedge RST) begin
	if (!RST) begin
		in_state_0 <= 1'b0;
		in_state_1 <= 1'b0;
	end
	else begin
		in_state_0 <= IN;
		in_state_1 <= in_state_0;
	end
end

assign PLUSE = in_state_0 & (~ in_state_1);

endmodule

5. Testbench Code

`timescale 1ns/1ps

module exercise2_test_1;

reg RST;
reg CLK;
reg IN;
wire PLUSE;

parameter half_cycle = 5;

exercise2 exercise2_inst (
	.CLK(CLK),
	.RST(RST),
	.IN(IN),
	.PLUSE(PLUSE)
);

initial begin
	CLK = 0;
	forever begin
		CLK = # half_cycle ~ CLK;
	end
end

initial begin
	RST = 1;
	# (1 * half_cycle) RST = 0;
	# (2 * half_cycle) RST = 1;
end

initial begin
	IN = 0;
	# (3 * half_cycle) IN = 1;
	# (4 * half_cycle) IN = 1;
	# (5 * half_cycle) IN = 0;
	# (6 * half_cycle) IN = 1;
end

initial begin
	# (50 * half_cycle) $finish;
end

initial begin
	$fsdbDumpfile("./verdiFsdb/exercise2.fsdb");
	$fsdbDumpvars(0);
end

endmodule
`timescale 1ns/1ps

module exercise2_test_2;

reg RST;
reg CLK;
reg IN;
wire PLUSE;

parameter half_cycle = 5;

exercise2 exercise2_inst (
	.CLK(CLK),
	.RST(RST),
	.IN(IN),
	.PLUSE(PLUSE)
);

initial begin
	CLK = 0;
	forever begin
		CLK = # half_cycle ~ CLK;
	end
end

initial begin
	RST = 1;
	# (1 * half_cycle) RST = 0;
	# (2 * half_cycle) RST = 1;
end

initial begin
	IN = 0;
	# (5 * half_cycle) IN = 1;
	# (6 * half_cycle) IN = 0;
	# (7 * half_cycle) IN = 1;
	# (8 * half_cycle) IN = 0;
end

initial begin
	# (50 * half_cycle) $finish;
end

initial begin
	$fsdbDumpfile("./verdiFsdb/exercise2.fsdb");
	$fsdbDumpvars(0);
end

endmodule

6. Experiment(VCS+Verdi)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VerilogHDL有限状态机是通过组合逻辑和时序逻辑的混合方式来实现的,其中组合逻辑用于判断当前的状态和输入信号,并输出下一个状态的控制信号;时序逻辑用于同步控制信号和状态寄存器的状态,确保状态机在时钟上升沿时进行状态转移。 在VerilogHDL中,有限状态机通常由状态寄存器、组合逻辑和控制信号三部分组成。状态寄存器用于存储当前状态,控制信号用于控制状态转移,组合逻辑用于根据当前状态和输入信号生成控制信号。 VerilogHDL有限状态机的实现步骤如下: 1. 定义状态寄存器和状态编码:定义状态寄存器用于存储当前状态,每个状态都有一个唯一的状态编码。 2. 定义输入信号和输出信号:定义输入信号和输出信号,这些信号将用于控制状态转移和生成输出数据。 3. 定义状态转移条件和控制信号:定义状态转移条件和控制信号,这些条件和信号将用于确定下一个状态和控制输出数据。 4. 实现组合逻辑:根据当前状态和输入信号,实现组合逻辑来生成控制信号。 5. 实现时序逻辑:使用时钟信号同步控制信号和状态寄存器的状态,确保状态机在时钟上升沿时进行状态转移。 6. 测试和调试:对实现的有限状态机进行测试和调试,确保它能够正确地实现所需的功能。 总的来说,VerilogHDL有限状态机是一种非常强大的设计工具,能够帮助设计者实现高效、可靠的控制电路。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值