2016-04-12 3 views
0

Итак, я работаю над назначением лаборатории для класса компьютерной техники. У меня есть задание, и я пытаюсь получить всю необходимую помощь, так как для профессора мне нужно подождать до нескольких дней, прежде чем я смогу поговорить с ними о помощи. Поэтому я вижу, могу ли я помочь ей.Хэмминг (7,4) Код - Конечный автомат

Моя проблема заключается в том, что мой конечный автомат не работает, как должно быть задано из задания лаборатории. Предполагается, что государственный аппарат имеет 3 состояния; idle, s1, s2. Ожидается, что Idle должен показать все нули в форме волны, состояние 1 покажет случайно генерируемое 4-битное число из LFSR, а состояние 2 покажет результат из 4-битного числа после того, как будет выполнено подавление (7,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 

ЛРСОС

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 

Хэмминга

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 для этого кода, он работает до его вычисления количества помех, но не меняет состояние, если указано.

  • Когда переключатель 1 комплект: состояние IDLE
  • Когда переключатель 2 набор: состояние 1, показывает 4-битовый LFSR номер
  • Когда переключатель 2 набора: состояние 2, показывает 7-битный Хэмминга результата

Ниже мой код конечного автомата и после этого является выходного сигнала.

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 

WAVEFORM КОНЕЧНЫХ ГОСУДАРСТВЕННОГО АППАРАТА:

Snapshot

+0

С данного кода, вы не можете изменить ' state'. Оператор case verilog не требует 'break;' как C/C++ или Java. – Greg

ответ

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 с, либо. Вам не нужно их, если есть только один оператор в отрасли.)

+0

Это помогло мне, и теперь это работает как шарм. спасибо – punjabi4life