Перейти к содержанию
    

Я бы Вам рекомендовал почитать что-нибудь от Sunburst Design - у этих ребят много рассуждений по поводу реализации конечного автомата на Verilog и SV, конечно если с английским хорошо. У Iosifk на сайте есть краткий курс , там тоже описаны FSM'ки. Да собственно по первому же запросу в Google на тему "fsm verilog" вывалился пример от Altera.

Я думаю лучше самому понять как это работает, потому что конечный автомат - есть очень важный момент в цифровой схемотехнике. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы Вам рекомендовал почитать что-нибудь от Sunburst Design - у этих ребят много рассуждений по поводу реализации конечного автомата на Verilog и SV, конечно если с английским хорошо. У Iosifk на сайте есть краткий курс , там тоже описаны FSM'ки. Да собственно по первому же запросу в Google на тему "fsm verilog" вывалился пример от Altera.

Я думаю лучше самому понять как это работает, потому что конечный автомат - есть очень важный момент в цифровой схемотехнике. :)

 

Будьте добры не отсылайте меня в школу. У меня много литературы по верилогу, в том числе и о конечных автоматах.

Мне интеречно где может быть у меня ошибка...

Часть кода:

parameter S1 = 1'b0;
parameter S2 = 1'b1;


parameter [7:0] DA1[0:0] = {8'b1111000};
parameter [7:0] DA2[0:4] = {8'b100100,8'b10101111,8'b111100,8'b1101110,8'b10101000};//{7'b1111000,6'b100100,8'b10101111,6'b111100,7'b1101110,8'b10101000};
parameter [7:0] SA[0:5] = {8'b11010,8'b11011,8'b11100,8'b11101,8'b11110,8'b11111};//{5'b11010,5'b11011,5'b11100,5'b11101,5'b11110,5'b11111};
parameter [7:0] L_T[0:1] = {8'b1000,8'b0};
parameter [7:0] DATA[0:47] = 

{

8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010

};

parameter [7:0] frame[0:60] = {DA2[0:4], SA[0:5], L_T[0:1], DATA[0:47]};  

always @(posedge handshake)
begin
    got_handshake <= 1;
end
    
    

always @(*)
begin 
   if (counter_next > 1024)
       begin
                counter_next <= 0;
      end
    else
      counter_next <= counter + 1'b1;
end

reg [0:0] state, next_state;
always@(*)
begin
      if (rst) begin
         out <= 0;
         out2 <= 0;
         counter <= 0;
            state <= S1;
      end
      else
          case (state)
            S1 : begin
                  out <= DA1[counter];
                        out2 <= 1'h1;
                        next_state = got_handshake ? S2 : S1;  
                        counter <= counter_next;
                 end              
                S2 : begin
                  out <= frame[counter];
                        out2 <= 1'h1;
                        next_state = S1; 
                        counter <= 0;
                      end
          endcase                      
end

 

Почемуто автомат не переходит во 2-е состояние (S2), судя по всему handshke не приходит. А должен так как первый byte на MAC приходит.

Изменено пользователем NSergeevich

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас тут асинхронщина какая-то:

always@(*)

Так точно работать не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выложите весь исходник.

Вот так:

always @(posedge handshake)
begin
    got_handshake <= 1;
end

точно нельзя делать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    13:41:36 03/26/2015 
// Design Name: 
// Module Name:    tx_data 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module tdata(
input clk,
input rst,
output [7:0]data,
input handshake,
output data_valid
    );
reg [31:0]counter;

reg [31:0]counter_next;
reg [7:0]out;
reg out2;
reg got_handshake;


parameter S1 = 1'b0;
parameter S2 = 1'b1;


parameter [7:0] DA1[0:0] = {8'b1111000};
parameter [7:0] DA2[0:4] = {8'b100100,8'b10101111,8'b111100,8'b1101110,8'b10101000};
parameter [7:0] SA[0:5] = {8'b11010,8'b11011,8'b11100,8'b11101,8'b11110,8'b11111};
parameter [7:0] DATA[0:47] = 

{

8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010,
8'b10101010,8'b10101010,8'b10101010

};

parameter [7:0] frame[0:60] = {DA2[0:4], SA[0:5], L_T[0:1], DATA[0:47]};  

always @(handshake)
begin
    got_handshake <= 1;
end
    
always @(posedge clk)
begin 
   if (counter_next > 1024)
       begin
                counter_next <= 0;
      end
  
  else
      counter_next <= counter + 1'b1;
end

reg [0:0] state, next_state;
always@(*)
begin
      if (rst) begin
         out <= 0;
         out2 <= 0;
         counter <= 0;
            state <= S1;
      end
      else
          case (state)
            S1 : begin
                  out <= DA1[counter];
                        out2 <= 1'h1;
                        next_state = (got_handshake == 1) ? S2 : S1;  
                        counter <= counter_next;
                 end              
                S2 : begin
                  out <= frame[counter];
                        out2 <= 1'h1;
                        next_state = S1; 
                        counter <= 0;
                      end
          endcase                      
end

assign data = out;      
assign data_valid = out2;

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

always @(posedge handshake)
begin
    got_handshake <= 1;
end

 

Не уверен, что сигнал с названием handshake является тактовым. Вы в клоковое дерево вашей ПЛИС пытаетесь завести сигнал handshake так делать нельзя. Такое ощущение, что здесь вы хотите синтезировать защелку по сигналу handshake, так и синтезируйте, если очень конечно нужно:

always @(*)
if(handshake)
  got_handshake = 1;

 

always @(*)
begin 
   if (counter_next > 1024)
       begin
                counter_next <= 0;
      end
    else
      counter_next <= counter + 1'b1;
end

reg [0:0] state, next_state;
always@(*)
begin
      if (rst) begin
         out <= 0;
         out2 <= 0;
         counter <= 0;
            state <= S1;
      end
      else
          case (state)
            S1 : begin
                  out <= DA1[counter];
                        out2 <= 1'h1;
                        next_state = got_handshake ? S2 : S1;  
                        counter <= counter_next;
                 end              
                S2 : begin
                  out <= frame[counter];
                        out2 <= 1'h1;
                        next_state = S1; 
                        counter <= 0;
                      end
          endcase                      
end

очень странно, что вы пытаетесь сделать автомат и счетчик асинхронными, у Вас отсутствует кварц на плате ? :) Такой автомат работать не будет. Посмотрели бы пример от Altera хотяб:

always @(posedge clk or posedge reset)
     begin
          if (reset)
               state = zero;
          else
               case (state)
                    zero:
                         state = one;
                    one:
                         if (in)
                              state = zero;
                         else
                              state = two;
                    two:
                         state = three;
                    three:
                         state = zero;
               endcase
     end

Откуда видно, что автомат из состояния в состояние переходит по переднему фронту clk, ну еще и асинхронно сбрасывается по reset.

 

Я так думал что когда описываешь комбинаторную логику пользуешься блокирующим присваиванием (=). И собственно использовать оба типа присваивания в одном always блоке , тоже не особо приветствуется:

 S2 : begin
                  out <= frame[counter];
                  out2 <= 1'h1;
                  next_state = S1; 
                  counter <= 0;
         end

Я так полагаю Вы не особо тщательно смотрели ваши книги по верилогу :) Для начала бы Вам разобраться в синтезе комбинаторной и последовательной логики (combinational and sequential logic) ну и с блокирующим и неблокирующим присвоением соответственно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кому интересно, почитайте очень интересную статью на тему always @

 

Always.pdf

 

Ну и какой момент показался Вам самым интересным в этой статье ? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...