lab1
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
отчет
по лабораторной работе №1
по дисциплине «Интерфейсы периферийных устройств»
Тема: SPI
Студенты гр. |
|
|
Преподаватель |
|
Дорохов А. В. |
Санкт-Петербург
202
Цель работы 2
Цель работы
Целью работы является проектирование интерфейса SPI.
Задание
Для данной работы используются следующие значения:
№ бригады |
Такт, МГц |
Режим |
Кол-во бит |
1 |
1 |
0 |
4 |
Так как на плате, представленной в лаборатории, тактовый сигнал в 40 МГц, то необходимо поделить его на 40, таким образом получается такт в 1 МГц.
Для данного задания используется одно устройство slave, передача происходит только от master к slave, поэтому можно опустить MISO, оставив только MOSI сигнал.
Выполнение работы
Для проектирования master устройства интерфейса SPI нам необходимо следующее:
сдвиговый регистр для передачи данных с параллельной загрузкой данных
делитель частоты (с 40 МГц до 2 МГц)
конечный автомат, для реализации некоторых функций мастера
Рисунок 1. Верхний уровень устройства
clk_divider
Реализует функции делителя частоты.
Рисунок 2. Делитель частоты
Сначала делим частоту на 10 при помощи счетчика. После этого делим получившуюся частоту еще в два раза при помощи T-триггера.
SPImaster
Реализует конечный автомат, описывающий поведение примитивной реализации интерфейса. Так же реализуется сдвиговый регистр с параллельной загрузкой.
Рисунок 3. Конечный автомат
Состояния:
(начальное) Init – ожидание перед очередной посылкой.
Shift – shift
Load – load
Done – конечное состояние
Исходный код модуля:
module SPImaster
(
input wire clk, // clock
input wire [3:0] data, // transmitted data
output reg sck, // serial clock
output wire mosi, // master output slave input
output wire ss // slave select
);
enum reg[1:0] {IDLE, DATA_R, DATA_W} state, next; // current and next states for FSM
reg [3:0] shift; // shift register
reg [2:0] cntr; // counter for num of writed data
// shift reg realisation
always @(posedge clk)
begin
if (state == DATA_W)
begin
shift = {shift[2:0], 1'b0};
cntr++;
end
else if (state == IDLE)
begin
shift = data;
cntr = '0;
end
else
begin
shift = shift;
cntr = cntr;
end
state = next;
end
// FSM next states block and output block
always @(state, shift)
begin
case (state)
IDLE:
begin
sck = 1'b0;
mosi = 1'b0;
ss = 1'b1;
next = DATA_R;
end
DATA_R:
begin
sck = 1'b1;
mosi = shift[3];
ss = 1'b0;
next = DATA_W;
end
DATA_W:
begin
sck = 1'b0;
mosi = shift[3];
ss = 1'b0;
next = (cntr == 3) ? IDLE : DATA_R;
end
endcase
end
endmodule
Вывод
В результате выполнения данной работы был спроектировано главное устройство, передающее данные по интерфейсу SPI.