所以我正在为计算机工程课程完成实验课程。我有一份作业,我正在努力得到所有的帮助,至于教授,我必须等到几天才能和他们交谈。所以我看到我是否能得到她的帮助。
我的问题是,我的有限状态机无法按照实验室分配的要求进行操作。状态机应该有3个状态;空闲,s1,s2。空闲应该在波形中显示全零,状态1将显示LFSR中随机生成的4位数,状态2将在汉明(7,4)完成后显示4位数的结果。时钟更改为1HZ时钟,使用clk分区。
代码如下:
CLOCK_1HZ
module clock_1hz (clk, reset, clk2);
input clk, reset;
output clk2;
reg temp;
reg [25:0] cnt;
always @(posedge clk or posedge reset)
begin
if (reset)
begin
cnt = {25{1'b0}};
end
else
begin
if (cnt == 26'b10111110101111000001111111)
begin
cnt = {25{1'b0}};
temp = 1'b1;
end
else if (cnt < 26'b01011111010111100000111111)
begin
cnt = cnt + 1;
temp = 1'b1;
end
else
begin
cnt = cnt + 1;
temp = 1'b0;
end
end
end
assign clk2 = temp;
endmodule
LFSR
module lfsr (out, clk, rst);
output [4:1] out;
input clk, rst;
reg [4:1] w;
always @(posedge clk or posedge rst)
begin
if (rst)
begin
w = 4'b1011;
end
else
w = {w[3],w[2],w[1]^w[4], w[4]};
end
assign out=w;
endmodule
HAMMING
module hamming(din, dout);
output [6:0] dout;
input [3:0] din;
assign dout[6] = din[3];
assign dout[5] = din[2];
assign dout[4] = din[1];
assign dout[3] = din[1] ^ din[2] ^ din[3];
assign dout[2] = din[0];
assign dout[1] = din[0] ^ din[2] ^ din[3];
assign dout[0] = din[0] ^ din[1] ^ din[3];
endmodule
所有这些代码都能正常工作并计算正确的HAMMING,并且时钟分配与LFSR配合良好,并且当它作为层次结构设计组合时可以工作。
当我为此代码制作FSM时,它可以计算汉明数,但在指示时不会改变状态。
以下是有限状态机的代码,然后是 波形输出 。
module fsm ( clk , reset , sw1 , sw2 , sw3 , lights );
input clk, reset, sw1, sw2, sw3;
output reg [6:0] lights;
reg[2:0] state;
wire clkhz;
wire [3:0] lfsr_out;
wire [6:0] hout;
parameter S0 = 3'b000, S1 =3'b001, S2 = 3'b010; // states
clock_1hz u1(.clk(clk),
.reset(reset),
.clk2(clkhz));
lfsr u2(.rst(reset),
.clk(clkhz),
.out(lfsr_out));
hamming u3(.din(lfsr_out),
.dout(hout));
always @(posedge clk or posedge reset)
begin
if (reset == 1)
begin
state <= S0;
end
else
case(state)
S0: if(sw1 == 1)
begin
state <= S0;
end
S1: if(sw2 == 1)
begin
state <= S1;
end
S2: if(sw3 == 1)
begin
state <= S2;
end
default state <= S0;
endcase
end
always @(*)
begin
case(state)
S0: lights = 7'b0000000; //led are all off
S1: lights = lfsr_out; //4bit lfsr shown on led
S2: lights = hout; // display hamming code result
default lights = 7'b0000000; //led are all off
endcase
end
endmodule
有限状态机的波形:
答案 0 :(得分:0)
我不认为这是你需要的状态机。从你的要求描述,也许你只需要记住按下的当前开关?如果是这种情况,您可以采取以下措施:
always @(posedge clk or posedge reset)
if (reset == 1)
state <= S0;
else
if (sw1)
state <= S0;
else if (sw2)
state <= S1;
else if (sw3)
state <= S2;
现在state
正在记住按下的当前开关。根据您对要求的描述,这样做似乎并不依赖于在此之前哪个开关被按下了哪个开关,因此看起来您不需要状态机 - 行为不依赖于国家。
(您也不需要所有begin
和end
s。如果分支中只有一个语句,则不需要它们。)