СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №2/2012
ПРОГРАММИРОВАНИЕ реходит в состояние DDR_WB_READ. Как упоминалось выше, считанные из памяти данные хранятся во внутрен нем 128 битном буфере, при этом ад рес начала буфера запоминается в 28 битном регистре – указателе: burst_adr <= wb_adr_i[31:4]; Соответственно, при поступлении запроса на чтение, сначала проверя ется наличие необходимых данных во внутреннем буфере. Если сигнал data_avail равен лог. 1, значит, буфер уже содержит необходимые данные: if (wb_adr_i[31:4] == burst_adr) data_avail <= 1'b1; При этом конечный автомат перехо дит в состояниеDDR_WB_READ_H(Read Hit). Данные считываютсяиз внутренне го буфера, и цикл чтения памяти DDR3 SDRAMнеосуществляется. Из состояния DDR_WB_READ_Hвозможнонесколько выходов. Призавершениициклачтения шиныWishbone (сигнал wb_cyc_i пере ходит в лог. 0) автомат переходит в со стояние ожиданияDDR_WB_IDLE. Если же требуетсяпрочитатьбольше данных, чем содержится в буфере, автомат из состоянияDDR_WB_READ_Hпереходит в состояние DDR_WB_READ_M (Read Miss) и генерируется запрос основному конечному автомату контроллерапамя тиddr_fsmначтение одногопакета дан ных в 128 бит. Затем конечный автомат контроллера шины Wishbone ожидает завершения цикла чтения и установле ния линии data_avail в лог. 1. После это го автомат снова возвращается в состо яниеDDR_WB_READ_Hи считывает не обходимые данные из внутреннего буфера. Переходы из состояния DDR_WB_ READ_H в DDR_WB_READ_M продол жаются до тех пор, пока не будут счита ны все данные, запрашиваемые через шинуWishbone. Например, при чтении шестнадцати 32 битных слов таких пе реходов будет четыре – за один пере ход считывается четыре 32 битных слова. После завершения цикла чтения автомат переходит в режим ожидания. Если при чтении данные отсутствуют в буфере изначально, то автомат сразу переходит в состояние DDR_WB_ READ_M. Затем цикл продолжается так же, как было описано выше. Логика перехода автомата в состоя ние записи данных DDR_WB_WRITE аналогична – проверяются контроль ные сигналы шины Wishbone wb_we_i, wb_cyc_i и wb_stb_i. Однако дополни тельно проверяется сигнал готовности буфера buf_rdy. Поэтому новые данные для записи не могут быть приняты до тех пор, пока текущие не будут записа ны в память. Размерность буфера запи си, так же как и буфера чтения, равна длине пакета памяти (burst length) 8 × 16 бит, или четыре 32 битных слова. При записи более четырёх 32 битных слов за один цикл шины Wishbone ав томат периодически переходит из со стояния DDR_WB_WRITE в состояние DDR_WB_WR_WAIT и обратно до тех пор, пока все данныене будут записаны. Поскольку длина пакета записи па мяти DDR3_SDRAM фиксирована и равна 16 байтам, а шинаWishbone поз воляет адресовать отдельные байты данных, необходим дополнительный механизм, обеспечивающий запись только необходимых данных в пре делах всего пакета. Например, требу ется записать только один байт по адресу 32’h80000000, а все оставшие ся данные (пакет данных будет содер жать байты по адресам 32’h80000000 – 32’h8000000F) оставить без изменения. Для этой цели в памяти DDR3 SDRAM служат линии маскировки. Для 16 битнойшины данных памяти определено две линии маскировки – для верхнего байта и для нижнего бай та. При лог. 0 на соответствующей ли нии в момент записи байт записывает ся в память, а при значении лог. 1 ли нии маскировки – не записывается, маскируется. Поэтому при записи дан ных во внутренний буфер, помимо за полнения 128 битного буфера данных, также заполняется 16 битный регистр маскировки. Передначаломцикла записивнутрен него буфера регистр маскировки уста навливается равным16’hFFFF, апомере записи данных соответствующие биты регистрамаскировкиобнуляютсянаос новании состояния линий шиныWish bone wb_sel_i и wb_adr_i[3:2]. Линии wb_adr_i[3:2] адресуют 32 битные слова в пределах внутреннего буфера, а че тыре линии wb_sel_i адресуют байты в пределах 32 битного слова. Если не обходимо записать один байт по ад ресу 32’h80000000, в момент записи этого байта во внутренний буфер wb_adr_i[3:2] будет равно 2’b00, а wb_sel_i – 4’b0001. В целом механизм формированиямаскирующегорегистра на языке Verilog выглядит следующим образом: case (wb_adr_i[3:2]) 2'b00: mask_reg <= mask_reg & {12'hFFF,~(wb_sel_i)}; 2'b01: mask_reg <= mask_reg & {8'hFF,~(wb_sel_i),4'hF}; 2'b10: mask_reg <= mask_reg & {4'hF,~(wb_sel_i),8'hFF}; 2'b11: mask_reg <= mask_reg & {~(wb_sel_i),12'hFFF}; endcase Согласно [1], во время записи пакета данных младшие 3 бита адреса столбца должны содержать достоверные дан ные, но эти данные игнорируются. Та ким образом, пакет записываемых дан ных всегда выравнивается по границе 16 байт. При чтении процедура более сложная и зависит от младших битов. Однакопривышеописанномалгоритме чтения данных требуется фиксирован ная позиция данных во внутреннем бу фере, –байт, прочитанныйпонулевому адресу, должен храниться в буфере так же по нулевому адресу, и т.д. Поэтому приформировании адреса столбца для операцийчтенияизаписимладшие три бита всегда заменяются нулями в моду ле трансляции адреса ddr_adrc: assign c_adr_o = {adr_i[10:4],3'b000}; Эти младшие биты адреса учитыва ются только при чтении данных из внутренних буферов контроллера уст ройствами на шине Wishbone. Рассмотрим более подробно работу блока управления вводом/выводом, выполняющего функции распределе ния тактовых сигналов и буферизации входных и выходных данных. Б ЛОК УПРАВЛЕНИЯ ВВОДОМ / ВЫВОДОМ Все ранее рассмотренные блоки на языке Verilog содержали универсаль ный код, не зависящий от типа исполь зуемой ПЛИС. Блок управления вво дом/выводом содержит примитивы, специфичныедляПЛИСXilinxSpartan6. Рассмотрим более подробно архитек туру ввода/вывода семейства Spartan 6. ВПЛИС Spartan 6 для высокоскорост ного обмена данными можно исполь зовать два типа примитивов: ILOGIC2/ OLOGIC2 и ISERDES2/OSERDES2. Каж дый из этих типов может быть встроен в исходный код на языке Verilog двумя способами: при помощи автоматизи рованного генератора IP модулей (wi zard) или при помощи готовыхшабло 71 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 2 2012 © СТА-ПРЕСС
RkJQdWJsaXNoZXIy MTQ4NjUy