【发布时间】:2016-09-15 16:42:29
【问题描述】:
`时间刻度 1ns / 1ps
module StateMachine(
input [1:0] OP,
input [1:0] RESULT_COM,
input clk,
input rst,
output reg [1:0] CONTROL_AS=0,
output reg RESET_C,
output reg CONTROL_C,
output reg [1:0] state=0
);
parameter toLOWER=2'b01,toUPPER=2'b10,IDLE=0;
reg [1:0] n_state = IDLE;
//reg [1:0] state = IDLE;
reg [1:0] p_state = IDLE;
reg [1:0] prevOP = 2'b00;
reg [1:0] p_state_copy = 2'b00;
reg [15:0] count = 0;
always @ (posedge clk)
begin
if(rst == 1)
RESET_C = 1;
else
RESET_C = 0;
if(OP == 2'b01)
n_state = toLOWER;
else
if(OP == 2'b10)
n_state = toUPPER;
else
n_state = IDLE;
if(prevOP == OP)
p_state = state;
if((OP != prevOP && OP[0] != OP[1]) || (rst == 1 && (OP != 2'b00 && OP != 2'b11)))
CONTROL_C = 1;
else
CONTROL_C = 0;
if(state != n_state)
prevOP = OP;
state = n_state;
end
always @ (n_state)
begin
p_state_copy = p_state;
end
always @ (p_state)
begin
case(p_state)
toLOWER:
begin
if(RESULT_COM == 2'b10)
CONTROL_AS <= 2'b10;
else
CONTROL_AS <= 2'b00;
end
toUPPER:
begin
if(RESULT_COM == 2'b01)
CONTROL_AS <= 2'b01;
else
CONTROL_AS <= 2'b00;
end
IDLE:
begin
if(p_state_copy == toUPPER && RESULT_COM == 2'b01)
CONTROL_AS <= 2'b01;
else if(p_state_copy == toLOWER && RESULT_COM == 2'b10)
CONTROL_AS <= 2'b10;
else if(p_state_copy == toUPPER && RESULT_COM == 2'b10)
CONTROL_AS <= 2'b0;
else if(p_state_copy == toLOWER && RESULT_COM == 2'b01)
CONTROL_AS <= 2'b0;
else if(p_state_copy == toUPPER && RESULT_COM == 2'b0)
CONTROL_AS <= 2'b0;
//(p_state_copy == toLOWER && RESULT_COM == 2'b0)
else CONTROL_AS <= 2'b0;
end
endcase
end
endmodule
它是一个字母转换器。 OP 是 2 位输入。 11 和 00 表示什么都不做。 01 从 ROM 加载下一个字母(使用计数器更新地址)并转换为小写。 10 加载下一个字母并转换为小写。如果字母不是大写或小写,或者是小写但 OP 想要将其转换为小写等,则不会转换字母。如果没有输入(00 或 11)或始终断言有效输入(01 或 10) ,然后输出仍然存在。
我使用 p_state_copy 来保存先前的状态,当下一个 clk 上升沿到来时,它与状态有部分重叠。因此它可以检查之前的状态是否为 IDDLE(输入 00 或 11)。 RESULT_COM 是比较器的结果,用于检查字母状态。图中,RESULT 中的隐藏部分为 0,因为 reset 被断言。enter image description here
我可以模拟、综合和实现它。但我不能在板上运行它。我可以知道问题是什么吗?谢谢。
【问题讨论】:
标签: verilog