【复旦微FM33LG0系列开发板测评】PGL功能和简析
本帖最后由 北方 于 2021-11-29 16:56 编辑<p><strong>1、PGL功能</strong></p>
<p> 复旦微FM33LG0相比其他系列独特的性能是PGL,这个功能在FM33LC系列上也没有出现。具体手册中的 解释如下</p>
<p> 可编程胶合逻辑(Programmable Glue Logic)是基于查找表(LUT)的简单可编程逻辑,其输入输 出可以连接到芯片引脚、内部信号,实现一些简单的胶合逻辑,在一些应用中可以帮助系统设计减 少PCB上的逻辑器件。 每个LUT包含4个输入,1个输出,1个真值表,可选的同步/滤波电路。用户通过对真值表编程,可 以获得期望的组合逻辑输出表达式。每个输入信号都可以被单独屏蔽。</p>
<p>PGL的基本特性如下:</p>
<p>⚫ 实现简单胶合逻辑,简化PCB设计</p>
<p>⚫ 4个4输入查找表</p>
<p>⚫ 可以通过真值表编程实现 AND,NAND,OR,NOR,XOR,NOT等逻辑表达式</p>
<p>⚫ 时序同步或滤波</p>
<p>⚫ 灵活的LUT输入选择:IO,内部信号,其他LUT输出</p>
<p>⚫ 输出可以被连接到IO或其他外设触发</p>
<p>具体逻辑图如下就一目了然,</p>
<p></p>
<p>那么实际上就是一个可以查表法实现的逻辑芯片,在NXP中是作为PLC的功能实现的。</p>
<p>总共包括了4个上面的单元,</p>
<p></p>
<p>不过这个PGL的引脚是不能自定义的,而是已经分配给了固定的引脚</p>
<p></p>
<p><strong>2、PGL编程说明</strong></p>
<p> 在编程的过程中,当使用LUT引脚输入时,需将对应引脚配置为GPIO输入,清除输入的MASK寄存器,并使能LUT。 当使用LUT引脚输出时,需将对应引脚配置为数字功能,并通过数字功能选择寄存器将引脚配置为 LUT输出,然后使能LUT。这功能通常是在GPL_init()的初始化函数中实现,如下范例代码</p>
<pre>
<code>void PGL_Init()
{
FL_GPIO_InitTypeDef GPIO_InitStruct = {0};
FL_PGL_LUT_InitTypeDef lutInit;
/*PC2、PC3为LUT0输入端口,配置成输入模式*/
GPIO_InitStruct.pin = FL_GPIO_PIN_2 | FL_GPIO_PIN_3;
GPIO_InitStruct.mode = FL_GPIO_MODE_INPUT;
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_DISABLE;
GPIO_InitStruct.remapPin = FL_DISABLE;
FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*PC0为LUT0输出端口,配置成数字模式*/
GPIO_InitStruct.pin = FL_GPIO_PIN_0;
GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_DISABLE;
GPIO_InitStruct.remapPin = FL_ENABLE;//数字功能复用
FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*PGL结构体配置*/
lutInit.edge = FL_PGL_LUT_EDGE_NONE;
lutInit.outMode = FL_PGL_LUT_OUTPUT_COMBINE_LOGIC;
lutInit.input3 = FL_PGL_LUT_INPUT_DISABLE;
lutInit.input2 = FL_PGL_LUT_INPUT_DISABLE;
lutInit.input1 = FL_PGL_LUT_INPUT_GROUP0;
lutInit.input0 = FL_PGL_LUT_INPUT_GROUP0;
FL_PGL_LUT_Init(PGL, FL_PGL_LUT0, &lutInit);
}</code></pre>
<p>这个代码是初始化了第一单元LUT0的过程。</p>
<p>使用过程中是对真值表的写入和读取,通过输入状态组合查询LUT真值表中的数据,可以获得想要的组合逻辑功能。 每个LUT支持4输入,输入作为地址可以查询到16个输出,LUT本身就是一个4bit地址寻址的存储空 间。寄存器TRUTH保存了16个输出数据,地址对应关系如下表所示。</p>
<p></p>
<p>在输入的部分是LUT 输入:</p>
<p>每个LUT有4个输入,每个输入都可以来自于引脚、芯片外设、或其他LUT输出。 通过INSEL寄存器,可以选择LUT输入信号源。</p>
<p>LUT 输出:</p>
<p>LUT的输出可以连接到引脚、或其他LUT输入。</p>
<p>这样的配置还是有一定的灵活性,4组LUT可以级联或者并联起来,实现更复杂的逻辑,或者扩大逻辑输入的位数。</p>
<p> </p>
<p><strong>3. 范例代码</strong></p>
<p>在官网提供的代码中,有一个PGL的例程,非常简明地实现了上述过程。</p>
<p>在主程序中顺次启动时钟和硬件等,然后根据上面的方法,初始化PGL,</p>
<pre>
<code>int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
/* SHOULD BE KEPT!!! */
MF_Clock_Init();
/* Configure the system clock */
/* SHOULD BE KEPT!!! */
MF_SystemClock_Config();
/* Initialize FL Driver Library */
/* SHOULD BE KEPT!!! */
FL_Init();
/* Initialize all configured peripherals */
/* SHOULD BE KEPT!!! */
MF_Config_Init();
UserInit();
Test_PGL();
while(1)
{
LED0_TOG();
FL_DelayMs(1000);
}
}</code></pre>
<p>实现测试非常简单,直接对真值表置位,就可以启动PGL的功能,</p>
<pre>
<code>void Test_PGL()
{
PGL_Init();
/*真值表配置*/
FL_PGL_WriteLUTTruthTable(PGL, FL_PGL_LUT0, 0x7);
/*LUT使能*/
FL_PGL_EnableLUT(PGL, FL_PGL_LUT0);
}</code></pre>
<p>当PGL启动时,根据真值表访问输出,上述真值表置位0x7,换算成二进制是0111,因为只访问后PC2,PC3,作为LUT0-0和LUT0-1输入,那么实际就形成或的输出。</p>
<p>具体实现方式可参考下面的例子,</p>
<p></p>
<p>在KEIL中编译通过,就可以下载到开发板上执行。</p>
<p>更改真值表,就改变了逻辑设置。</p>
<p></p>
<p>相比而言,还是可以实现一些内部逻辑功能,节省一个逻辑元件。</p>
页:
[1]