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

uragan90

Свой
  • Постов

    210
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о uragan90

  • Звание
    Местный
    Местный
  • День рождения 01.07.1979

Контакты

  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

3 532 просмотра профиля
  1. Продам осциллограф (3 в 1 осциллограф, мультиметр, генератор) АКИП-4313/6, новый, в кейсе. 2 щупа, полный комплект!!! Перешлю в любую точку России, посылкой или курьером за доплату! Цена: 15000руб. Обращаться на почту [email protected]
  2. Начертал схемку которая решает практически половину всего дела :laughing: Пока идёт запись sby мы можем записать в регистр запрос на чтение rqs и как только sby деактивируется, мы читаем байт и выставляем подтверждение ack, сбросив тем самым регистр чтения. При следующем запросе чтения мы сбросим подтверждение ack.
  3. Спасибо за поддержку! Вот такая схема вырисовывается, остаётся реализовать конечный автомат. 8 разрядные данные гружу в регистр 16 бит и сигнал sby который теперь фактически сформировался и снизил частоту со 100 до 50Мгц. Всем этим делом будет рулить конечный автомат, получать запросы на чтение и формировать подтверждение когда процесс записи деактивируется. Ну как думаете, получится иль нет? Текст счётчика адреса выглядит следующим образом: module ADDR_counter( input res, input clk, input wr, input rd, output full, output empty, output [ADDR-1:0] Addr_Sram ); parameter ADDR = 5; // Параметр разрядности Адреса SRAM //--- Счётчики адресов чтения и записи ------------------------------ assign Addr_Sram = (wr) ? write_addr[ADDR-1 : 0] : read_addr[ADDR-1 : 0]; reg [ADDR:0] read_addr=0; always @(posedge clk or posedge res) //По такту чтения begin if(res) begin read_addr <= 0; end else begin if (rd) read_addr <= read_addr + 1'b1; else read_addr <= read_addr; end end //--- reg [ADDR:0] write_addr=0; always @(posedge clk or posedge res) //По такту записи begin if(res) begin write_addr <= 0; end else begin if (wr) write_addr <= write_addr + 1'b1; else write_addr <= write_addr; end end //--- Абработка флагов заполненности ФИФО ------------------------------ assign full = ((write_addr[ADDR-1:0] == read_addr[ADDR-1:0]) && (write_addr[ADDR] ^ read_addr[ADDR]))? 1'b1 : 1'b0; //Фифо полное assign empty = ((write_addr[ADDR-1:0] == read_addr[ADDR-1:0]) && (!(write_addr[ADDR] ^ read_addr[ADDR])))? 1'b1 : 1'b0; //Фифо пустое endmodule А вот схема fifo.pdf
  4. У меня не двух портовая память CY7C1041DV33 У неё нет такой возможности обращения к одним и тем же данным по разным портам
  5. Именно так я и делаю!!! На частоте 100 я собераю данные по 8 бит, в регистр 16 бит. И того частота делится надвое. получается 50 Mhz. Память у меня 16ти разрядная и тем самым частота записи снижается. Читать я буду на частоте 10Mhz вот такой расклад получается, но проблема то в том что у меня 2 клоковых домина пересекающийся между собой!
  6. Да вроде работает, но видно что что то не то. Сложность заключается в проблеме моделирования шин с 3мя состояниями. В железе видно что работает но не так как хотелось бы
  7. Так получается тут нужно реализовывать конечный автомат состояний? Проблема видимо в том что у меня два клоковых домина и я не соображу как мне преодалеть эту проблему. У меня есть основной клок в CPLD 100Mhz. Частота записи 50Mhz а частота чтения 10Mhz. Эти частоты я реализовал делителями. Была идея: Запись в абсолютном приоритете!! Если поступил запрос на чтение то мы ждём пока кончится запись и как только это произойдёт то мы прочитаем данные на выход и выставим флаг готовности данных, сбросив при этом флаги запроса. Но при таком раскладе у меня в RTL модели видны защёлки, а это явная ошибка проекта. Как же быть? Я просто чувствую что это вполне реализуемо, но нет идей и помощи более опытных товарищей. :laughing:
  8. Удалось реализовать такой модуль FIFO на внешней SRAM, но работает он как то не стабильно и через раз! Уважаемые спецы, помогите найти причины не стабильности. module FIFO_SRAM( input Reset, input Wclk, input Rclk, input Rd, input Wd, output full, output empty, input [DATA-1:0] Din, output reg [DATA-1:0] Dout, output [ADDR-1:0] Addr_Sram, inout [DATA-1:0] Data_Sram, output nCS, output nOE, output nWE ); parameter ADDR = 4; // Параметр разрядности Адреса SRAM parameter DATA = 4; // Параметр разрядности Данных SRAM //--- Счётчики адресов чтения и записи ------------------------------ assign Addr_Sram = (Wd) ? write_addr[ADDR-1 : 0] : read_addr[ADDR-1 : 0]; reg [ADDR:0] read_addr=0; always @(posedge Rclk) //По такту чтения begin if(Reset) begin read_addr <= 0; end else begin if (Rd) read_addr <= read_addr + 1'b1; else read_addr <= read_addr; end end //--- reg [ADDR:0] write_addr=0; always @(posedge Wclk) //По такту записи begin if(Reset) begin write_addr <= 0; end else begin if (Wd) write_addr <= write_addr + 1'b1; else write_addr <= write_addr; end end //--- Абработка флагов заполненности ФИФО ------------------------------ assign full = ((write_addr[ADDR-1:0] == read_addr[ADDR-1:0]) && (write_addr[ADDR] ^ read_addr[ADDR]))? 1'b1 : 1'b0; //Фифо полное assign empty = ((write_addr[ADDR-1:0] == read_addr[ADDR-1:0]) && (!(write_addr[ADDR] ^ read_addr[ADDR])))? 1'b1 : 1'b0; //Фифо пустое //--- Логика комутации данных ------------------------------ wire [DATA-1 : 0] bus_data_out; always@(posedge Wd or posedge Rd) begin Dout <= bus_data_out; //При любом запросе пишим на выход end assign bus_data_out = (Wd & empty)? Din : 'bz ; //Если запись и фифо пустое то со входа пишем на прямую в выходной регистр assign Data_Sram = (Wd & ~empty)? Din : 'bz ; //Если запись и в выходном регистре не пусто то заполняем SRAM assign bus_data_out = (~Wd & Rd)? Data_Sram : 'bz ; //Если нет записи, но есть чтение то из SRAM в выходной регистр assign nCS = ~(Wd | Rd); //Разрешение чипа SRAM assign nOE = ~(Rd); //Чтение чипа SRAM assign nWE = ~(Wd); //Запись чипа SRAM endmodule
  9. Оооо.. Точно!!!! Спасибо!!! Действительно в начале должны данные на выход захлопнутся, а уж потом сливаться в sram. Ведь если первым зашёл то первым и выйти должен по принципу фифо Вобщем суть такая данные у меня заливаются в плис по 8 бит шине, а sram 16бит это дало мне возможность написать модуль который забирает данные по 8 бит и складывает в регистр 16 бит для того чтоб залить их в sram и плюс время целых два такта на то чтоб можно было по одному из них записывать, а по другому считывать. Вот текст этой прослойки типа module translator( input wire clk, //клок input wire [7:0]sbyte, //вход 1байт input wire rdy, //загрузка байта output reg [15:0]word, //выход 2байта output reg wr //данные готовы ); reg cnt = 0; reg [15:0]buff0 = 0; always @(posedge rdy) begin if(!cnt) begin buff0[15:8] = sbyte[7:0]; end else begin buff0[7:0] = sbyte[7:0]; word = buff0; end cnt = cnt + 1'b1; end always @(posedge clk) begin wr = ~cnt && rdy; end endmodule
  10. Да! Одно портовая память срам! Хочу создать модуль контроллера срам, чтоб с ней работать как с фифо, но писать в неё по фронту сигнала WD который приходит из другого модуля, а по спаду WD сбрасывать в регистр и хранить там пока не перелью данные в мк и не произведу следующий запрос чтения. Вот начал писать модуль сий. Затык с этим самым "автоматом состояний" который должен активировать регистр rdy когда посылаем запрос и ожидаем данные, вот тут за спотыкался. module sram_control( input clk_pld, //основной такт плис input wd, //запись в sram, (высокий приоритет) input request, //запрос данных output reg ack, //подтверждение готовности данных output empty, //sram пустая (читать нельзя) output full, //sram полная (писать нельзя) output [17:0] addr, //адрес sram input [15:0] din, //вход данных для записи во внешнюю sram output reg [15:0] dout, //выход данных для чтения из sram inout [15:0] dinout //двунаправленный порт данных для подключения непосредственно к sram ); reg rdy = 0; reg [15:0] buff = 0; //буфер 3х состояний reg [18:0] count_w = 0; //регистр счётчика записи reg [18:0] count_r = 0; //регистр счётчика чтения //счётчик адреса записи always @(posedge clk) begin if(wd) count_w = count_w + 1; end //счётчик адреса чтения always @(posedge clk) begin if(rdу) count_r = count_r + 1; end //процес управляющий логикой чтения данных always @(posedge clk) begin if(request) begin //?????????????????????????????????? end end always @(posedge clk) begin if(wd) buff = din; else begin buff = 16'bz; if(rdу) dout = dinout; end end assign dinout = buff; assign addr = (!wd && rdу)? count_r : count_w; assign full = ((count_w[17:0] == count_r[17:0]) && (count_w[18] ^^ count_r[18]))? 1'b1 : 1'b0; assign empty = ((count_w[17:0] == count_r[17:0]) && (!(count_w[18] ^^ count_r[18])))? 1'b1 : 1'b0; endmodule
  11. Клока, клока... Я ж говорю что по импульсу от мк в плис плис должен зафиксировать факт прихода запроса на запись, дождатся этого самого вашего клока основного в плис и дождатся когда станет не активен сигнал записи из вне в срам и выгрузить байт из срам в регистр свой же и просигналить об этом мк что байт готов и находится в регистре вывода. При этом флаг запроса должен сбросится. Когда мы сново пошлём запрос байта для чтения этим самым сбросится флаг готовности байта. Это что так сложно привести к основному клоку плис? Я только этого и не пойму в чём тут проблема то? Это что так сложно реализовать. Схема выше опасаной логики дана в первом посте. И вопрос - будет ли работать?
  12. Ацп с мк никак не связаны! Плис управляет ацп по скрытому для мк алгаритму и записывает данные в срам нв хранение, мк же должно их оттуда забрать как только на это появится время. Места в срам полно, а ацп тактируется периодически по скрытому алгаритму. Просто хотел посоветоватся по возможности реализации псевдо фифо на связке срам+плис
  13. Да! Вы правы! Это то что я имел ввиду в общих чертах, с тем лишь отличием что плис сама загружает данные в срам и мк не как не воздействует на этот прцес! Мк лишь посылает запрос в плис на загрузку очередного байта в выходной spi буфер и как только это произойдёт то плис сигнализирует мк о готовности байта для передачи из плис в мк, а мк по spi выгружает байт к себе
  14. Не в коим разе не продаю ничего! Наоборот: Учусь, стараюсь сделать то что будет работать, и исключительно для познания, а не ради продаж!!! Собственно для этого я и обратился к вам за помощью. Дельного посоветовали мало, но и не оскорбили никак и на том спасибо!!!
×
×
  • Создать...