Jump to content

    

sazh

Свой
  • Content Count

    2416
  • Joined

  • Last visited

Community Reputation

0 Обычный

About sazh

  • Rank
    Гуру

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

4073 profile views
  1. Обычно рекомендации дают для разрабатываемой с нуля платы. Сами пины в схеме подключаете в соответствии с со своим проектом FPGA. Тогда для обеспечения большей стойкости к ESD на неиспользуемые пины например у Альтеры можно использовать опцию As output driving ground. Но вы используете отладочную плату и если Ваш проект окучивает только часть пинов отладочной платы, а остальные физически на плате входы, выходы, в Вашем проекте неиспользованные пины по идее должны иметь опцию типа As input tri-stated. А вообще когда в поверке источник питания был последний раз. Может выбросы по питанию.
  2. Конечно, это не работает, описание оставляет желать лучшего, но функционально все правильно. Что удивительно, вы попытались реализовать UART в стиле UART Электроника 60 (когда то была настольным компьтером). Минимум ресурсов. Остальное - дело наживное. Я влоб подправил. Чтоб работало. Но это, функционально - Ваше. Так что не хуже того, что сейчас в учебниках ваяют. uart.zip
  3. Сомнение гложет. У него только на реализации констант за пределы мелкой CPLD можно вылететь. А что это такое - генератор на аккумуляторе фазы в данном случае?
  4. Начните со своего проекта. Уверяю, у Вас получиться лучше, чем у Тарасова.
  5. Вы назвали его полным сумматором. Проект без расширения разрядной сетки. Не может он складывать и вычитать прекрасно во всем диапазоне входных кодов. Хоть числа со знаком, хоть числа без знака. Ему не хватает выходов переноса и переполнения. Только при расширении разрядной сетки можно говорить об правильных кодах как числа без знака unsigned, со знаком signed. Непонятно, чем Вам не нравиться a-b, a+b. Кстати прекрасную Вам книгу порекомендовали. Я полный сумматор себе так представил. add_sub.v
  6. Все должно работать. 1 создаете *.bsf символ из *.v верхнего уровня. 2 в проекте схематик создает папку project с этим символом, вытаскиваем из нее этот символ в схематик. 3. все множество файлов *.v прописываем в проекте assignments setting files. В RTL просмотрщике смотрим все вложения. В схематике виден только файл верхнего уровня. Нет надобности класть созданный символ в библиотеку.
  7. Так вроде бы в стандарте 2005 уже давно есть встроенная $clog2. Что касается QREG = DATA, тоже не есть хорошо. Что касается проекта uart, то вряд ли кто сделает изящнее, чем это исполнено в ДВК-2. Мне просто стало интересно. зачем Вам мах плюс и графический редактор?
  8. Не надо ничего конвертировать. Если мах+ поддерживает верилог 1999, он должен сгенерировать нетлист для функционального моделирования и дать возможность создать файл временной диаграммы. Дальше моделируете. Я так и не понял, есть ли у Вас проект в графическом редакторе, для которого Вы ищите почему то мах+ именно 9ой версии. Если графический проект есть, то можно забыть о мах+. Последний квартус, который поддерживает семейство флекс 10К - это 9.0 sp2. Можно перетащить в него графический проект и точно также моделировать проекты, независимо от того как они описаны. у него есть встроенное моделирование. Но если переходить на язык описание аппаратуры, желательно пользоваться сторонними пакетами для моделирования. Совместно с квартусом идет пакет Альтера моделсим. Написав тестбенч, можно упаковать его в квартусе в проект и запустить из квартуса моделирование в моделсиме и посмотреть результат. Но переходя на полное текстовое описание как проекта так и описание для него входных возмущений, Вы становитесь независимы от среды проектирования. `timescale 1 ns / 1 ps module dec12_tb; reg S = 1'b1; reg X = 1'b1; wire A0; wire A1; initial begin #10 {S, X} = {1'b0, 1'b1}; #50 #5 $display ("End"); $stop; end dec12 dec12_inst ( .S (S), .X (X), .A0 (A0), .A1 (A1) ); endmodule
  9. Не сможете Вы причесать проект, созданный в графическом редакторе разработчиками прошлого века. Для этого надо мыслить категориями 133 серии. Более того, даже если перенести графику с мах+ на какой нибудь квартус, работать этот проект полно функционально скорее всего не будет. Потому что эти разработки в большинстве своем не соответствуют "золотым" правилам работы с проектами плис, а соответствуют "золотым" правилам работы на "рассыпухе", проверенные на морозе и тепле. Поэтому и хранят раритетные проекты совместно с пакетом, в котором они разрабатывались. И корректируются, если надо, в этой среде проектирования. Перевести в лоб графику на язык описания аппаратуры - пустая затея. Надо все переписывать, не глядя в графику, только опираясь на ТЗ. А совпадение проверить просто. Моделированием в мах+ и моделированием в моделсиме. Времянки (функционально) совпадут. Единственная проблема при переходе на язык описания аппаратуры, которая может возникнуть, которую Вы не видите, это если контрольная сумма *.pof файла старого проекта прописана где нибудь в КД.
  10. Чтоб к смыслу привязаться, имеет значение, какое входное напряжение подается на АЦП, которое не имеет понятия о числах со знаком или без знака. На выходе его по простому - код. Например входной размах АЦП от 0В до 2В. Диапазон 2В. На выходе диапазон кодов от 0000_0000 до 1111_1111. Далее все по ходу пьесы на сумматор, который не имеет понятия о числах со знаком или без знака. Если взять какой нибудь базовый примитив сумматора, то можно заметить что разрядная сетка как по входу, так и по выходу одна и та же, но есть выход переноса. В реальной жизни перенос не используют, сразу расширяют разрядную сетку сумматора как по входу (добавляют в старший разряд 0 к значению кода на выходе АЦП), так и по выходу. В результате во всем диапазоне кодов с выхода АЦП что при сложении кодов, что при вычитании кодов получаете правильный код, называете его число без знака. Дальше как то обрабатываете этот код (если надо поработать с разрядной сеткой). Например входной размах от -1В до +1 В. Диапазон 2В. Этот размах приводят например к входному размаху АЦП (например от 0В до 2В, современные АЦП обычно запитываются от положительного напряжения). На выходе диапазон кодов от 0000_0000 до 1111_1111. Но Вам говорят, что -1В хочу видеть как код 1000_0000, а +1В как код 0111_1111. Напрашиваются числа со знаком. Поэтому диапазон кодов на выходе АЦП от 0000_0000 по 1111_1111 преобразуют в диапазон кодов от 1000_0000 по 0111_1111. В базовом примитиве сумматора, который не имеет понятия о числах со знаком или без знака задействуют выход переполнения. В реальной жизни расширяют разрядную сетку, (по входу размножают уже старший бит кодов от 1000_0000 по 0111_1111. В результате во всем диапазоне кодов с выхода АЦП что при сложении кодов, что при вычитании кодов получаете правильный код, называете его число со знаком. Дальше как то обрабатываете этот код (если надо поработать с разрядной сеткой). Игра ума. Как то так.
  11. Причем тут Си. Пошлите его по углу и по азимуту. Вам предложили инженерный подход. Без всяких калькуляторов. На базе полинома сваять сдвигающий регистр с нужными отводами по xor и отдать на откуп синтезатору байтовую реализацию входных данных. При этом ваш crc16 проект должен удовлетворять как передатчик (налету прогонять массив данных и подставлять в конце массива два байта crc), так и приемник (налету прогонять массив данных с двумя байтами crc, получая сигнатуру (которая известна и всегда одна и та же для конкретной реализации полинома). При этом после вычислений crc16 регистр должен устанавливаться за два такта в состояние ffff, чтоб не дергать его входным сигналом инициализации). //////////////////////////////////////////////////////////////////////////////////////// //G(x) = x16 + x15 + x2 + 1 //////////////////////////////////////////////////////////////////////////////////////// // Module Name = crc_16_8_usb // CRC Width = 16 // Data Width = 8 // CRC Init = ffff // RefIn = true // RefOut = true // Polynomial = 8005 // Check = B4C8 (8'h31, 8'h32....8'h39) // Check with magic world = B001 module crc_16_8_usb ( input [7:0] ibyte, input calc, input init, input clk, output [15:0] crc_rg, output [7:0] crc_check_rg, output [15:0] crc_check16 ); reg [15:0] crc_reg = 16'hffff; reg [7:0] crc_check_reg = 8'hff; wire [15:0] next_crc; ////////////////////////////////////////////////////////////////////////////// // CRC XOR equations ////////////////////////////////////////////////////////////////////////////// function [15:0] crc_16x1 (input [15:0] crc, input d); reg msb; begin msb = crc[15]; crc_16x1 = crc << 1; crc_16x1[0] = d ^ msb; crc_16x1[2] = d ^ msb ^ crc[1]; crc_16x1[15] = d ^ msb ^ crc[14]; end endfunction function [15:0] crc_16_8 (input [15:0] crc, input [7:0] data); integer i; begin crc_16_8 = crc; for (i = 0; i < 8; i= i + 1) // RefIn = true begin crc_16_8 = crc_16x1(crc_16_8, data); end end endfunction /////////////////////////////////////////////////////////////////////////////////// assign next_crc = crc_16_8(crc_reg, ibyte); always @ (posedge clk) begin if (init) begin crc_reg <= 16'hffff; crc_check_reg <= 8'hff; end else if (calc) begin crc_reg <= crc_16_8(crc_reg, ibyte); crc_check_reg <= ~{next_crc[8], next_crc[9], next_crc[10], next_crc[11], // RefOut = true next_crc[12], next_crc[13], next_crc[14], next_crc[15]}; end else begin crc_reg <= {crc_reg[7:0], 8'hff}; crc_check_reg <= ~{crc_reg[0], crc_reg[1], crc_reg[2], crc_reg[3], // RefOut = true crc_reg[4], crc_reg[5], crc_reg[6], crc_reg[7]}; end end assign crc_check_rg = crc_check_reg; ////////////////////////// genvar i; generate for (i = 0; i < 16; i = i + 1) begin : block assign crc_check16 = ~crc_reg[15-i]; // RefOut = true assign crc_rg = crc_reg[15-i]; end endgenerate /////////////////////// endmodule `timescale 1 ns / 1 ps module crc_16_8_usb_tb; parameter halfperiod_100 = 5.0; // 100 MHz reg [7:0] ibyte = 8'h00; reg calc = 1'b0; reg init = 1'b0; reg clk; wire [15:0] crc_rg; wire [7:0] crc_check_rg; wire [15:0] crc_check16; initial begin : clock_generator_100 clk = 1'b0; forever #(halfperiod_100) clk = ~clk; end initial begin repeat (4) @(posedge clk); init = 1'b1; repeat (4) @(posedge clk); init = 1'b0; repeat (4) @(posedge clk); {ibyte, calc} = {8'h31, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h32, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h33, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h34, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h35, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h36, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h37, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h38, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h39, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h00, 1'b0}; repeat (6) @(posedge clk);// Check : B4C8 {ibyte, calc} = {8'h31, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h32, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h33, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h34, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h35, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h36, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h37, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h38, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h39, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'hc8, 1'b1}; repeat (1) @(posedge clk);// Check : B4C8 {ibyte, calc} = {8'hb4, 1'b1}; repeat (1) @(posedge clk);// {ibyte, calc} = {8'h00, 1'b0}; repeat (6) @(posedge clk);// Check : 4FFE //magic world : B001 {ibyte, calc} = {8'h31, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h32, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h33, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h34, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h35, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h36, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h37, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h38, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'h39, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'hc8, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'hb4, 1'b1}; repeat (1) @(posedge clk); {ibyte, calc} = {8'hfe, 1'b1}; repeat (1) @(posedge clk);// Check : 4FFE {ibyte, calc} = {8'h4f, 1'b1}; repeat (1) @(posedge clk);// {ibyte, calc} = {8'h00, 1'b0}; repeat (6) @(posedge clk); // magic world : B001 #5 $display ("End"); $stop; end crc_16_8_usb crc_16_8_usb_inst ( .ibyte (ibyte), .calc (calc), .init (init), .clk (clk), .crc_rg (crc_rg), .crc_check_rg (crc_check_rg), .crc_check16 (crc_check16) ); endmodule
  12. Можно конечный вариант посмотреть. С тестбенчем на посылку c 8'h31 по 8'h39. ( не силен я в VHDL)
  13. А каком алгоритме идет речь? Чтоб всем понятно было. Например: пример спецификации популярного варианта алгоритма "CRC 16" CRC16 стандартный: 1-1000-0000-0000-0101 Name : "CRC 16" Width : 16 Poly : 8005 x^16 + x^15 + x^2 + 1 Init : 0000 RefIn : True RefOut : True XorOut : 0000 Check : BB3D ASCII строки "123456789" (шестнадцатеричные значение "31_32_… 39").
  14. Это стиль проектирования конца 80х, на микросхемах средней интеграции, потом перенос на плис в схемном редакторе. Короче, я хотел сказать, что работа по обеим фронтам в ПЛИС не есть хорошо. Тем паче, что вопрошающий все это промоделировал, я сделал вывод, что может реально по частотам что то не так. Что касается Альтера языка, полностью с Вами согласен. Не согласен про изучение за час, ибо у него нет возможности описать фронт клока и он поэтому опирается на базовые примитивы. Ближайшая альтернатива ему конечно Верилог.