if(led == led_max) led <= 0; if(longcnt == delay_max) begin longcnt <= 0; led <= led +1; end else begin longcnt <= longcnt+1; end end endmodule
С выше приведенного сайта переписал удачно семпл Verilog UART Model А что с этим делать? там столько лишних пинов, клоков... Счас расмариваю код, стока непонятного.
Спойлер
Код:
1 //---------- 2 // Design Name : uart 3 // File Name : uart.v 4 // Function : Simple UART 5 // Coder : Deepak Kumar Tala 6 //---------- 7 module uart ( 8 reset , 9 txclk , 10 ld_tx_data , 11 tx_data , 12 tx_enable , 13 tx_out , 14 tx_empty , 15 rxclk , 16 uld_rx_data , 17 rx_data , 18 rx_enable , 19 rx_in , 20 rx_empty 21 ); 22 // Port declarations 23 input reset ; 24 input txclk ; 25 input ld_tx_data ; 26 input [7:0] tx_data ; 27 input tx_enable ; 28 output tx_out ; 29 output tx_empty ; 30 input rxclk ; 31 input uld_rx_data ; 32 output [7:0] rx_data ; 33 input rx_enable ; 34 input rx_in ; 35 output rx_empty ; 36 37 // Internal Variables 38 reg [7:0] tx_reg ; 39 reg tx_empty ; 40 reg tx_over_run ; 41 reg [3:0] tx_cnt ; 42 reg tx_out ; 43 reg [7:0] rx_reg ; 44 reg [7:0] rx_data ; 45 reg [3:0] rx_sample_cnt ; 46 reg [3:0] rx_cnt ; 47 reg rx_frame_err ; 48 reg rx_over_run ; 49 reg rx_empty ; 50 reg rx_d1 ; 51 reg rx_d2 ; 52 reg rx_busy ; 53 54 // UART RX Logic 55 always @ (posedge rxclk or posedge reset) 56 if (reset) begin 57 rx_reg <= 0; 58 rx_data <= 0; 59 rx_sample_cnt <= 0; 60 rx_cnt <= 0; 61 rx_frame_err <= 0; 62 rx_over_run <= 0; 63 rx_empty <= 1; 64 rx_d1 <= 1; 65 rx_d2 <= 1; 66 rx_busy <= 0; 67 end else begin 68 // Synchronize the asynch signal 69 rx_d1 <= rx_in; 70 rx_d2 <= rx_d1; 71 // Uload the rx data 72 if (uld_rx_data) begin 73 rx_data <= rx_reg; 74 rx_empty <= 1; 75 end 76 // Receive data only when rx is enabled 77 if (rx_enable) begin 78 // Check if just received start of frame 79 if ( ! rx_busy && ! rx_d2) begin 80 rx_busy <= 1; 81 rx_sample_cnt <= 1; 82 rx_cnt <= 0; 83 end 84 // Start of frame detected, Proceed with rest of data 85 if (rx_busy) begin 86 rx_sample_cnt <= rx_sample_cnt + 1; 87 // Logic to sample at middle of data 88 if (rx_sample_cnt == 7) begin 89 if ((rx_d2 == 1) && (rx_cnt == 0)) begin 90 rx_busy <= 0; 91 end else begin 92 rx_cnt <= rx_cnt + 1; 93 // Start storing the rx data 94 if (rx_cnt > 0 && rx_cnt < 9) begin 95 rx_reg[rx_cnt - 1] <= rx_d2; 96 end 97 if (rx_cnt == 9) begin 98 rx_busy <= 0; 99 // Check if End of frame received correctly 100 if (rx_d2 == 0) begin 101 rx_frame_err <= 1; 102 end else begin 103 rx_empty <= 0; 104 rx_frame_err <= 0; 105 // Check if last rx data was not unloaded, 106 rx_over_run <= (rx_empty) ? 0 : 1; 107 end 108 end 109 end 110 end 111 end 112 end 113 if ( ! rx_enable) begin 114 rx_busy <= 0; 115 end 116 end 117 118 // UART TX Logic 119 always @ (posedge txclk or posedge reset) 120 if (reset) begin 121 tx_reg <= 0; 122 tx_empty <= 1; 123 tx_over_run <= 0; 124 tx_out <= 1; 125 tx_cnt <= 0; 126 end else begin 127 if (ld_tx_data) begin 128 if ( ! tx_empty) begin 129 tx_over_run <= 0; 130 end else begin 131 tx_reg <= tx_data; 132 tx_empty <= 0; 133 end 134 end 135 if (tx_enable && ! tx_empty) begin 136 tx_cnt <= tx_cnt + 1; 137 if (tx_cnt == 0) begin 138 tx_out <= 0; 139 end 140 if (tx_cnt > 0 && tx_cnt < 9) begin 141 tx_out <= tx_reg[tx_cnt -1]; 142 end 143 if (tx_cnt == 9) begin 144 tx_out <= 1; 145 tx_cnt <= 0; 146 tx_empty <= 1; 147 end 148 end 149 if ( ! tx_enable) begin 150 tx_cnt <= 0; 151 end 152 end 153 154 endmodule
А что здесь символы #5 означают? (Сам не разбирался с этим.)
Код:
#5 clk = ! clk;
Учтите, что у верилога есть синтезируемая часть и не синтезируемая (для тестов и отладки). Соответственно, не все директивы можно использовать для описания начинки ПЛИС.
Если не ошибаюсь, то процедурные действия должны для некоторых циклов укладываться в один такт. Если это не выполняется, то - ошибка синтеза. Хотя, могу ошибаться, не уверен.
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Все правильно, потому я и написал про тестбенч. То есть clk-виртуальный сигнал,а не реальный генератор внутри ПЛИС (как ,наверное считал Автор). #5 значит, например 5nS, если в начале модуля задан масштаб времени/точность: `timescale 1ns / 1ps. Т.е. в данном примере- инвертировать clk каждые 5nS. Насчет UARTa,вот http://www.fpga4fun.com/SerialInterface.html попроще и понятно, как его применить.
Доброй ночи. Введу кратко в курс дела: Делаю ремейк "народного цапа v2. " Теперь на борту есть два генератора 24.576 мгц и 22.5792 мгц. Плис умеет определять частотную сетку по пину L/R и отключает невостребованный генератор. Но вот незадача, если в квартусе обьеденить оба пина и подать как один пин_клок далее по схеме, то ругает меня по чем свет ночью стоит.
Написал на верилоге разделитель, так можно делать??? (ну дублировать одно и тоже, только с другой точки зрения)
Код:
module clock_spliter(
input in_24576, // вход частоты от первого генератора, input in_225792, // вход частоты от второго генератора, input en_24576, // включен - выключен первый генератор, input en_225792, // включен - выключен второй генератор,
Люди, как прошить FPGA альтеру? 1- Вот написал простенький проект на верилоге светодиодами помигать. указал какие пины что делаают, откомпилировал. 2- как и с CPLD подключил плату по жтаг, залил прошивку.... не работает. В момент прошивки загорается лампочка что идет запись, пишет что 100% залито, а не мигает ни чего. 2а - вычитал что перед прошивкой надо нажать nConfig, это обнулит прошивку и переведет кристалл в режим прошивания. неработает.
3- решил прошить SPI_FLASH микра 25P28V6P (в мануале она описана как M25P128) Ее нет в настройках квартуса, там только EPCS*** EPCQ*** и ничего не подходит.
Не подскажите, где я видел статью в картинках пошаговая инструкция как подготовить и залить прошивку в постоянную память для FPGA альтеру, с описанием всех этих тонкостей.
Последний раз редактировалось WolfTheGrey Пт сен 26, 2014 07:11:05, всего редактировалось 1 раз.
ПЛИС EP4CE40F23I7 Если по Jtag заливать прошивку, то после успешной прошивки лампочка программирования гаснет. А тестовые светодиоды не мигают. Ведь в демопрошивке (которая залита во флеш память) светодиоды то дрыгаются как китайская елочная гирлянда. Может набыдлокодил чего то не того? Спойлер
Тоже ошибок стало всего 13, а не 370. Всего добавил одно слово: always@(posedge clock)
Закончил скачивать семплы на доску, но чето проект на светодиодах не открывается. Не открываются страницы с проектом, а некоторые проекты совсем не открываются. Максимум что могу, загрузить по жтаг прошивку в ФПГА.
Все извилины утром напряг, чтоб ввести в проект кнопку reset. Получается что все кнопки надо дублировать регистрами?
Не подскажите, что за нелепый наезд со стороны компилятора? Вроде какбы подправляет масиврегиистров, по сути сумма масива неизменяется: Warning (10230): Verilog HDL assignment warning at timer.v(65): truncated value with size 32 to match size of target (8)
Спойлер
Код:
reg[7:0] ints_1; // 1 КГц. reg clk_1k; always @(posedge clk_500k) begin if(ints_1 == 249) begin ints_1 <=0; clk_1k <= ~clk_1k; end else ints_1 <= ints_1 + 1; end
Вот еще, нелепая поправка кода: Warning (10230): Verilog HDL assignment warning at timer.v(122): truncated value with size 10 to match size of target (9) Verilog HDL assignment warning at timer.v(123): truncated value with size 10 to match size of target (9) Verilog HDL assignment warning at timer.v(124): truncated value with size 10 to match size of target (9) Verilog HDL assignment warning at timer.v(125): truncated value with size 10 to match size of target (9) Спойлер
Это стандартные предупреждения о несоответствии размеров регистров. Вполне можно игнорировать. На всякий случай проверьте объявление для encoder_binaru.
Цитата:
Максимум что могу, загрузить по жтаг прошивку в ФПГА.
Квартус сильно не любит русских букв в путях. Переместите проект в каталог с латинским именем.
Квартус сильно не любит русских букв в путях. Переместите проект в каталог с латинским именем.
D:\altera\PROJEKT\ep4ce40 Скореее в настройках что то не то.
Опять какая то непонятная ошибка. Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[6]" at timer.v(140) Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[5]" at timer.v(140) Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[4]" at timer.v(140) Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[3]" at timer.v(140) Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[2]" at timer.v(140) Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[1]" at timer.v(140) Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[0]" at timer.v(140) Спойлер
Код:
// LCD_driver initial LCD_load = 1; always @(posedge clk_1k) //такт одна микросекунда begin if(LCD_massiv_count == 72) begin LCD_din <= LCD_massiv[LCD_massiv_count]; LCD_massiv_count <= LCD_massiv_count + 1; LCD_dclk <= 1; end end always @(negedge clk_1k) begin LCD_dclk <= 0; end // Error (10028): Can't resolve multiple constant drivers for net "LCD_dclk" at timer.v(150)
Драйвер 8 знакового LCD дисплея TIC8148 Там три контакта: LCD_load, - можно просто поставить 1, это чтоб символы отображались, не блолее. LCD_dclk, - тактовая частота. LCD_din - информация.
Вот по отдельности оба алвайс блока работающих на разных частотах компилируются спокойно.
clk_minuta <= clk_minuta + 1; pig <= ~pig; // мигающая точка. LCD_massiv[17] <= pig; LCD_massiv_count <= 0; // взвести работу LCD драйвера, вот эта строчка не дает коду откомпелироваться. end
// LCD_driver initial LCD_load = 1; always @(posedge clk_1k) //такт одна микросекунда begin if(LCD_massiv_count <= 72) begin LCD_din <= LCD_massiv[LCD_massiv_count]; LCD_massiv_count <= LCD_massiv_count + 1; LCD_dclk <= 1; end end always @(negedge clk_1k) begin LCD_dclk <= 0; end // Error (10028): Can't resolve multiple constant drivers for net "LCD_dclk" at timer.v(150)
Вы по фронту тактовой присваиваете LCD_dclk 1, а по спаду 0
Ну, с этим ладно, чего придумаю.Хотя непонятно в чем кофликт, если оба блока тактируются от одного сигнала. А вот как быть с спусковым крючком LCD_massiv_count <= 0; в одном алвайс блоке, чтоб заработал другой блок. По сути конфликта (внутри кристального короткого замыкания) не должно быть. Как же тогда пишутся сложнейшие схемы?, есть же способ как легально обойти этот запрет.
Написать новый модуль, куда передать нужные параметры, и запустить его из первого алвайс блока?
Не подскажете, что за харек: (выписал из книги, а компилироваться ни в какую не хочет) task pot(x,y); input x; output y; endtask
Потому что алвайс блок LCD_driver должен заработать по команде от алвайс блока где все эти числа собираются. Вот интересно always 1 LCD_massiv <= данные; LCD_massiv_count <=0;
always 2 if(LCD_massiv_count <= 72) так делать нельзя, конфликт блоков, а вот LCD_massiv, пришедшая с того же блока работает на ура.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения