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

 
 
> Переход на более высокую частоту клока
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
 
Start new topic
Ответов
NSergeevich
сообщение Dec 9 2015, 12:18
Сообщение #2


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

Группа: Участник
Сообщений: 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
Maverick
сообщение Dec 10 2015, 05:58
Сообщение #3


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

Группа: Модераторы
Сообщений: 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



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

 


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


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