Николай Коровин (11.04.2017 17:12 - 17:37, просмотров: 5940)
Согласен с (→). Да будет отдельной темой вопрос, может ли диалект Си быть полноценным языком поведенческого описания логики. http://caxapa.ru/745670.html
Добавим стандартные целочисленные типы uXX и sXX для произвольной разрядности. u24, u3, s12.
volatile обозначает сигнал, который сам своё состояние хранить не умеет.
while (clk) обозначает конструкцию, завязанную на положительный фронт тактирования, while (!clk) — на отрицательный.
Добавим delay(x), обозначающий, что распространение сигнала между последней цепью выше него должно закончиться на x наносекунд раньше, чем между первой цепью ниже него.
Получается довольно складный синтаксис, вот гляньте:
volatile u1 Dir;
volatile u24 In1, In2, Out;
if (Dir) Out=In1; else Out=In2; //асинхронный 24-битный шинный мультиплексор
u8 Lock;
volatile u8 Sig;
volatile u1 C;
if (C) Lock = Sig; //восьмибитный latch
или посложнее вот
u12 Cnt, Max;
volatile u14 Out;
while (Clk)
{
if (Cnt == Max)
{
Out=BRAM[Index];
Index++;
Cnt=0;
} else Cnt++;
}
А вот как делать нельзя:
while (Clk)
{
Out=Index;
Index++;
Out2=Index; //Синтаксическая ошибка, Index уже переопределено.
}
А надо — вот так, ибо это всё-таки Си и последовательность имеет значение:
while (Clk)
{
Out=Index;
Out2=Index;
Index++;
}
Ибо если сделать вот так
while (Clk)
{
Out=Index;
delay (0);
Out2=Index;
Index++;
}
то сишная натура такого описания тут же покажет свои зубы.
А, и, конечно, тот загадочный синхронно-асинхронный latch.
volatile u1 inS1, inS2, inS3;
u1 outS4;
if (inS3)
{
outS4=inS1;
} else while (inS2) {
outS4=inS1;
}
Неопределённый для некоторых сочетаний сигнал — warning. Противоречивое определение — error. Входные сигналы — аргументы функции. Выходные — её значение, в общем случае имеет тип структуры. Ага, прямо struct {бла бла сигналы} имя функции (бла бла входные сигналы) {бла бла тело функции}. return меня смущает, но я ещё подумаю.
Чем такой «Си» не VHDL/Verilog?