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

 
 
 
Reply to this topicStart new topic
> Переход на более высокую частоту клока
NSergeevich
сообщение Dec 3 2015, 14:05
Сообщение #1


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

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



Spartan 3E xc3s500e, Verilog

Мне spi(внешний с STM) передает пакет (в проект плиса) 24бита в 1-ом байте первый бит отвечает за чтение/запись ну и т.д. адрес/дата.

Код на Verilog принимает по MOSI и соответственно отдает на MISO, вся логика тактируется клоком 25mhz

Как бороться с тем, что когда я начинаю тактировань клоком в 50мгц начинают время от времени появляться ошибки на MISO, а когда перехожу на клок 100мгц ошибки на выходе данных возникают постоянно? С чем это связанно?
Go to the top of the page
 
+Quote Post
litv
сообщение Dec 3 2015, 14:16
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 6-10-04
Из: Воронеж
Пользователь №: 806



Это связано с Вами. Вопрос новичка ?
1)Нужно назначать временные констрейны в проекте и проверять их выполнение. Если не выполнятся - смотреть критические пути задержки сигнала.
2)Нужно проектировать с пониманием быстродействия лог. элементов.
3)Можно моделировать с учетом извлеченных после трассировки плис задержек.
4)Можно смотреть chipscopom внутренние узлы и понять какой элемент сбоит.

А что Вы сделали кроме veriloga ?
Go to the top of the page
 
+Quote Post
NSergeevich
сообщение Dec 3 2015, 14:26
Сообщение #3


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

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



Цитата(litv @ Dec 3 2015, 17:16) *
Это связано с Вами. Вопрос новичка ?
1)Нужно назначать временные констрейны в проекте и проверять их выполнение. Если не выполнятся - смотреть критические пути задержки сигнала.
2)Нужно проектировать с пониманием быстродействия лог. элементов.
3)Можно моделировать с учетом извлеченных после трассировки плис задержек.
4)Можно смотреть chipscopom внутренние узлы и понять какой элемент сбоит.

А что Вы сделали кроме veriloga ?



Я вообще отлаживаюсь осциллографом, но с чипскопом тоже знаком.
Вот с временными констрейнами совсем не знаком. Всм где их назначать


Сообщение отредактировал NSergeevich - Dec 3 2015, 14:26
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Dec 3 2015, 14:30
Сообщение #4


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



Нужно делать констрейны.

Нужно учитывать время, которое проходит от пина плисины до регистра, оно может быть и десяток наносекунд и больше. В итоге за период в 25 МГц - 40 нс - сигнал успевает дойти и качественно защелкнуться, а на 50 МГц - 20 нс - нет.


В проекте одном помогло поставить выходные регистры в IOB, поближе к пинам. Тогда и время от пина до IOB смешное - порядка наносекунды.
Но копать нужно в сторону Static timing analysis и setup/hold входных регистров.


--------------------
Go to the top of the page
 
+Quote Post
iosifk
сообщение Dec 3 2015, 14:40
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(NSergeevich @ Dec 3 2015, 17:05) *
Как бороться с тем, что когда я начинаю тактировань клоком в 50мгц начинают время от времени появляться ошибки на MISO, а когда перехожу на клок 100мгц ошибки на выходе данных возникают постоянно? С чем это связанно?


CDC ??? Оно сделано? Частота выше, метастабильность чаще...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
NSergeevich
сообщение Dec 9 2015, 12:18
Сообщение #6


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

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



Почему этот код использует BRAM-ы ?

Код
localparam DATA_WIDHT = 8;    //width of data bus
localparam ADDR_WIDTH = 15; //width of address bus
localparam MAX_RAM_ADDR = 1 << ADDR_WIDTH;

// main clock
input clk;

// side a
input [ADDR_WIDTH-1:0] addr_a;
input [DATA_WIDHT-1:0] data_a;
input ce_a;
input we_a;
input oe_a;
output reg[DATA_WIDHT-1:0] q_a;

// side b
input [ADDR_WIDTH-1:0] addr_b;
output reg [DATA_WIDHT-1:0] q_b;

//memory description
reg [DATA_WIDHT-1:0] mem [0:MAX_RAM_ADDR-1];

// side a read/write
always @ (posedge clk)
begin
    if (we_a) begin
        mem[addr_a] <= data_a;
    end else    begin
        q_a <= mem[addr_a];
    end
end

// side b read only
always @ (posedge clk)
begin
    q_b <= mem[addr_b];
end

endmodule


А этот BRAM-ы игнорирует и делает на рассыпухе ?

Код
localparam MEMORY_ADDR_WIDTH = 10; //width of address in bits > 8 bits but < 16 bits
localparam MEMORY_ADDR_MAX = 1 << MEMORY_ADDR_WIDTH;
//memory description
reg [7:0] memory_r[MEMORY_ADDR_MAX-1:0]; //memory array
reg [MEMORY_ADDR_WIDTH-1:0] memory_addr_r; //current memory addr

reg [7:0] MISO_8b_r;
assign MISO_8b[7:0] = MISO_8b_r[7:0];

reg [1:0] done_r;
always @(negedge CLK) done_r[1:0] <= {done_r[0:0], DONE_8b};
wire done_risingedge = (done_r[1:0] == 2'b01);

//reg [1:0] msg_end_r;
//always @(posedge CLK) msg_end_r[1:0] <= {msg_end_r[0], MESSAGE_END};
//wire msg_end_risingedge = (msg_end_r[1:0] == 2'b01);

reg [MEMORY_ADDR_MAX-1:0] byte_count_r;
reg [0:0] rw_state; //0 - read, 1 - write

always @(posedge CLK)
begin
    if (done_risingedge)
    begin
        if (FIRST_BYTE)
        begin
            byte_count_r <= 0;
            memory_addr_r[(MEMORY_ADDR_WIDTH-1):8] <= MOSI_8b[(MEMORY_ADDR_WIDTH-9):0];
            rw_state <= MOSI_8b[7];
        end
        else
        begin
            if (byte_count_r == 0)
            begin
                memory_addr_r[7:0] <= MOSI_8b[7:0];
                byte_count_r <= byte_count_r + 1;
              
                if (rw_state == 0) //read_state
                    MISO_8b_r[7:0] <=
                        memory_r[{memory_addr_r[(MEMORY_ADDR_WIDTH-1):8],
                                  MOSI_8b[7:0]}];
            end
            else
            begin
                if (rw_state == 0) //read state
                begin
                    MISO_8b_r[7:0] <= memory_r[memory_addr_r + byte_count_r];
                end
                else //(rw_state == 1) - write state
                begin
                    memory_r[memory_addr_r + byte_count_r - 1] <= MOSI_8b[7:0];
                end
                
                byte_count_r <= byte_count_r + 1;
            end
         end
        
    end
    
/*    
    if (msg_end_risingedge)
    begin
        reg_array[reg_idx][7:0] <= reg_val[7:0];
    end
*/    
end

assign done_RE = done_risingedge;


endmodule
Go to the top of the page
 
+Quote Post
des00
сообщение Dec 10 2015, 03:32
Сообщение #7


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(NSergeevich @ Dec 9 2015, 19:18) *
А этот BRAM-ы игнорирует и делает на рассыпухе ?

слишком сложное управление памятью для ее распознавания как блочной памяти


--------------------
Go to the top of the page
 
+Quote Post
Maverick
сообщение Dec 10 2015, 05:58
Сообщение #8


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(NSergeevich @ Dec 9 2015, 14:18) *

как вариант можете вынести в отдельный модуль описание памяти и оставить управление работой памятью для случая "А этот BRAM-ы игнорирует и делает на рассыпухе ?"


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
NSergeevich
сообщение Dec 10 2015, 10:12
Сообщение #9


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

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



Я думаю у меня сплошная рассинхронщина набегает из-за того, что проект собрался не на BRAM-ах
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Dec 10 2015, 11:39
Сообщение #10


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

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(NSergeevich @ Dec 10 2015, 13:12) *
Я думаю у меня сплошная рассинхронщина набегает из-за того, что проект собрался не на BRAM-ах

Вы знакомы с понятием временных ограничений? Если нет, то начните с этого, хотя это уже Вам советовали пару недель назад.
Для начала пропишите ограничения в ucf файле на все входные частоты (здесь для 50МГц)
Код
NET "rx_clk_in" TNM_NET = "rx_clk_in";
TIMESPEC TS_rx_clk_in = PERIOD "rx_clk_in" 20.000 ns HIGH 50%;

Потом сделайте все переходы по данным с одной частоты на другую (CDC). После компиляции можно посмотреть, все ли частоты прописаны во временных ограничениях (tools->constraint editor для ISE) и есть ли временные ошибки (static timing для ISE).
Go to the top of the page
 
+Quote Post
Corner
сообщение Dec 24 2015, 16:53
Сообщение #11


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

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Цитата(des00 @ Dec 10 2015, 06:32) *
слишком сложное управление памятью для ее распознавания как блочной памяти

Эти конструкции как BRAM не соберутся. Синтезатор не сможет посадить входы на мультиплексор, а портов у BRAM не хватит.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 5th July 2025 - 04:22
Рейтинг@Mail.ru


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