реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> xilinx tri mode ethernet mac, Работа корки сгенерированной в xilinx-е
egorman44
сообщение Jun 3 2015, 11:55
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 141
Регистрация: 22-11-12
Из: Нижний Новгород
Пользователь №: 74 507



Я бы Вам рекомендовал почитать что-нибудь от Sunburst Design - у этих ребят много рассуждений по поводу реализации конечного автомата на Verilog и SV, конечно если с английским хорошо. У Iosifk на сайте есть краткий курс , там тоже описаны FSM'ки. Да собственно по первому же запросу в Google на тему "fsm verilog" вывалился пример от Altera.
Я думаю лучше самому понять как это работает, потому что конечный автомат - есть очень важный момент в цифровой схемотехнике. sm.gif
Go to the top of the page
 
+Quote Post
NSergeevich
сообщение Jun 3 2015, 15:03
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 102
Регистрация: 21-01-15
Пользователь №: 84 716



Цитата(egorman44 @ Jun 3 2015, 14:55) *
Я бы Вам рекомендовал почитать что-нибудь от Sunburst Design - у этих ребят много рассуждений по поводу реализации конечного автомата на Verilog и SV, конечно если с английским хорошо. У Iosifk на сайте есть краткий курс , там тоже описаны FSM'ки. Да собственно по первому же запросу в Google на тему "fsm verilog" вывалился пример от Altera.
Я думаю лучше самому понять как это работает, потому что конечный автомат - есть очень важный момент в цифровой схемотехнике. sm.gif


Будьте добры не отсылайте меня в школу. У меня много литературы по верилогу, в том числе и о конечных автоматах.
Мне интеречно где может быть у меня ошибка...
Часть кода:
Код
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 - Jun 3 2015, 15:05
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 3 2015, 15:48
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



У Вас тут асинхронщина какая-то:
Код
always@(*)

Так точно работать не будет.
Go to the top of the page
 
+Quote Post
Artemius_tv
сообщение Jun 3 2015, 16:44
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 1-04-15
Из: Тверь
Пользователь №: 86 019



Выложите весь исходник.
Вот так:
Цитата(NSergeevich @ Jun 3 2015, 18:03) *
Код
always @(posedge handshake)
begin
    got_handshake <= 1;
end

точно нельзя делать.
Go to the top of the page
 
+Quote Post
NSergeevich
сообщение Jun 4 2015, 06:22
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 102
Регистрация: 21-01-15
Пользователь №: 84 716



Код
`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
Go to the top of the page
 
+Quote Post
egorman44
сообщение Jun 4 2015, 07:05
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 141
Регистрация: 22-11-12
Из: Нижний Новгород
Пользователь №: 74 507



Код
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

очень странно, что вы пытаетесь сделать автомат и счетчик асинхронными, у Вас отсутствует кварц на плате ? sm.gif Такой автомат работать не будет. Посмотрели бы пример от 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

Я так полагаю Вы не особо тщательно смотрели ваши книги по верилогу sm.gif Для начала бы Вам разобраться в синтезе комбинаторной и последовательной логики (combinational and sequential logic) ну и с блокирующим и неблокирующим присвоением соответственно.
Go to the top of the page
 
+Quote Post
NSergeevich
сообщение Jun 4 2015, 11:26
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 102
Регистрация: 21-01-15
Пользователь №: 84 716



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

Прикрепленный файл  Always.pdf ( 134.69 килобайт ) Кол-во скачиваний: 229
Go to the top of the page
 
+Quote Post
egorman44
сообщение Jun 4 2015, 12:05
Сообщение #23


Частый гость
**

Группа: Свой
Сообщений: 141
Регистрация: 22-11-12
Из: Нижний Новгород
Пользователь №: 74 507



Цитата(NSergeevich @ Jun 4 2015, 14:26) *
Кому интересно, почитайте очень интересную статью на тему always @

Прикрепленный файл  Always.pdf ( 134.69 килобайт ) Кол-во скачиваний: 229


Ну и какой момент показался Вам самым интересным в этой статье ? sm.gif
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 00:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016