Да, точно. По памяти писал и сам запуталсяangry_troll wrote:Да вроде должно...

Moderator: Shaos
Да, точно. По памяти писал и сам запуталсяangry_troll wrote:Да вроде должно...
Данные защелкиваются по завершению (спаду) T3. На этот момент данные должны присутствовать минимум 30 ns, после - еще минимум 10 ns.Tronix wrote: В какой момент комп защелкивает данные после операции чтения?
Взглянул. Не понял ровным счетом ничего. Но красивоangry_troll wrote:стоит хотя бы чуть взглянуть на 'technology map'.
Мне не кажется. Я уверен что это самый кривой дизайн, который только возможен. Индусы нервно курят в сторонке.angry_troll wrote:Мне дизайн кажется немножечко кривым, вложенные ифы дают разлапистую логику, которая и может жрать ячейки в цплд.
Это очевидная вешь, выделить сдвигатель в отдельный блок. Но у меня не получается. Как только делаю два allways (Clk), сразу начинает ругаться что нельзя совместно использовать одни и те же регистры в двух блоках. А как их не использовать, когда там всюду нужны хотя бы внутренний регистр данных? Да и остальные внутренние регистры то же.angry_troll wrote:Я бы написал это всё -- разделённым на блоки, например блок сдвига,
Да я посмотрел описание в квартусе, про Slow slew rate, увидел что оно влияет на только на output, ну и подумал что мне это не надо. Клок на SPI хороший, нажористый, MISO тоже ничего так с виду. Но врублю конечно, не сложно. Вот только на производительности это не скажется? Про auto turbo bit=off не читал пока...angry_troll wrote:Ну и наконец ещё раз напомню (вот я зануда ) про slow slew rate и auto turbo bit=off (для епмок).
Без слоу слю рейт фронты очень резкие и от них может звенеть всё по пути
Почему-то тоже так кажется. Большой опыт наступления на грабли, наверное -)newold86 wrote:Я (просто интуитивно, без объективных причин) уверен, что дело не в метастабильностях и формах сигналов, или в недостатке быстродействия из-за вложенности, а в принципиальной ошибке дизайна в каком-то месте.
Code: Select all
// Reading from data port (preliminary)
if (~nCS & ~nRD & ~Adr & ~BEGRD & ~BEGWR)
begin
BEGRD = 1'b1; // Set preliminary read flag
if (BUSY)
// If SPI busy set IO CH RDY low
MRDY = 1'b1;
else
begin
MRDY = 1'b1; // set IO CH RDY low
Data[7:0] = 8'b11111111; // 0xFF to data register
BUSY = 1'b1; // Set start flag for SPI state machine
end
Code: Select all
assign Dat[7:0] = (~nCS & ~nRD) ?
(Adr) ? {~nINS,BUSY,4'h0,Ctrl[1:0]} : Data[7:0]
: 8'hZZ;
Code: Select all
// Final reading from data port (nRD goes high)
if (BEGRD & nRD)
begin
BEGRD = 1'b0; // Clear preliminary read flag
// all other job done by combinatorics logic
end
Все так начиналиTronix wrote:Мне не кажется. Я уверен что это самый кривой дизайн, который только возможен. Индусы нервно курят в сторонке.
Лёгкий апгрейд на epm3064 не думал сделать? Вроде по пинам 1к1 (ну или чуть больше IO у 3064, остальные такие же).Но по другому не знаю как. Начинаешь писать "правильно" - тут же заканчиваются 32 ячейки.
Ну так логично же, одним регистром рули в одном always. Если рулишь в разных, то даже чисто с т.з. семантики верилога, разные блоки always могут исполняться в произвольном порядке (это актуально при моделировании в моделсимах разных). А с т.з. синтеза -- просто запрещено. Пиши по-другомуЭто очевидная вешь, выделить сдвигатель в отдельный блок. Но у меня не получается. Как только делаю два allways (Clk), сразу начинает ругаться что нельзя совместно использовать одни и те же регистры в двух блоках. А как их не использовать, когда там всюду нужны хотя бы внутренний регистр данных? Да и остальные внутренние регистры то же.
Поверь, это опыт (slow slew rate)Да я посмотрел описание в квартусе, про Slow slew rate, увидел что оно влияет на только на output, ну и подумал что мне это не надо. Клок на SPI хороший, нажористый, MISO тоже ничего так с виду. Но врублю конечно, не сложно. Вот только на производительности это не скажется? Про auto turbo bit=off не читал пока...
Да думал... Но а) в чип и дипе нету. На барахолках тоже. Из китая ее тащить? Не известно еще, может бу залоченная придет (или с назначенными выводами JTAG), а как разлочить без программатора от альтеры за десятьмильонов уе так до конца и не выяснили вроде на форуме zx.pk. б) Хочется все-таки уложиться, задача то простейшая...angry_troll wrote:Лёгкий апгрейд на epm3064 не думал сделать?
Code: Select all
always @(posedge Clk) begin
Сложно засимулировать реальное поведение шины, особенно когда не видишь его (а я пока не все вижу со своими 8-ми каналами).newold86 wrote:Неплохо бы погонять это в ModelSim - скорее всего, все станет понятно.
да хоть бы и залоченная - с продавца потребуешь возврат или минусов ему наставишь в отзывы. Вроде не 100 баксов стоитTronix wrote:Из китая ее тащить? Не известно еще, может бу залоченная придет (или с назначенными выводами JTAG), а как разлочить без программатора от альтеры за десятьмильонов уе так до конца и не выяснили вроде на форуме zx.pk. б) Хочется все-таки уложиться, задача то простейшая...
ни в коем случае! если клок - то только он, если асинхр сброс еще - то добавляется к клоку. если замена assign или латч - то always @*Список чувствительности... А если RD поднимется на negedge Clk то получается в холостую один такт пройдет.. Может основные сигналы (CS, WR, RD) тоже в список чувствительности включить.... Хотя влиять не должно на логику, но кто знает...Code: Select all
always @(posedge Clk) begin
Ох нифига, я сразу-то и не заметил.Tronix wrote: Кстати клок то щаз не синхронизирован с системным. Сейчас тактуется от OSC 14,3 MHz, а он не синхронен никак с CLK.
Code: Select all
assign rd = (addr==чему нужно) & (~rd) & (~cs) и что ещё там
assign wr = так же
Code: Select all
always @(negedge wr)
write_buffer <= databus
Code: Select all
assign wait = (rd | wr) && access_in_progress
Code: Select all
always @(negedge wr, negedge rst_access_n)
if(!rst_access_n)
access_in_progress <= 0;
else
access_in_progress <= 1;
Code: Select all
always @(posedge clk)
begin
sync1 <= access_in_progress
sync2 <= sync1
edge <= sync2
end
assign start_access = edge==1'b0 && sync2==1'b1;