|
xilinx tri mode ethernet mac, Работа корки сгенерированной в xilinx-е |
|
|
|
Jun 3 2015, 15:03
|
Частый гость
 
Группа: Участник
Сообщений: 102
Регистрация: 21-01-15
Пользователь №: 84 716

|
Цитата(egorman44 @ Jun 3 2015, 14:55)  Я бы Вам рекомендовал почитать что-нибудь от 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 - Jun 3 2015, 15:05
|
|
|
|
|
Jun 3 2015, 15:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
У Вас тут асинхронщина какая-то: Код always@(*) Так точно работать не будет.
|
|
|
|
|
Jun 3 2015, 16:44
|
Участник

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

|
Выложите весь исходник. Вот так: Цитата(NSergeevich @ Jun 3 2015, 18:03)  Код always @(posedge handshake) begin got_handshake <= 1; end точно нельзя делать.
|
|
|
|
|
Jun 4 2015, 06:22
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 4 2015, 07:05
|
Частый гость
 
Группа: Свой
Сообщений: 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 очень странно, что вы пытаетесь сделать автомат и счетчик асинхронными, у Вас отсутствует кварц на плате ?  Такой автомат работать не будет. Посмотрели бы пример от 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) ну и с блокирующим и неблокирующим присвоением соответственно.
|
|
|
|
|
Jun 4 2015, 12:05
|
Частый гость
 
Группа: Свой
Сообщений: 141
Регистрация: 22-11-12
Из: Нижний Новгород
Пользователь №: 74 507

|
Цитата(NSergeevich @ Jun 4 2015, 14:26)  Кому интересно, почитайте очень интересную статью на тему always @
Always.pdf ( 134.69 килобайт )
Кол-во скачиваний: 229Ну и какой момент показался Вам самым интересным в этой статье ?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|