找回密码
 立即注册

只需一步,快速开始

搜索

【复旦微FM33LG0系列开发板测评】PGL功能和简析

0
回复
1850
查看
[复制链接]

177

主题

354

帖子

3121

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3121
QQ
2021-12-31 17:13:33 显示全部楼层 |阅读模式
【复旦微FM33LG0系列开发板测评】PGL功能和简析

原帖地址:【复旦微FM33LG0系列开发板测评】PGL功能和简析 - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)

1、PGL功能

      复旦微FM33LG0相比其他系列独特的性能是PGL,这个功能在FM33LC系列上也没有出现。具体手册中的 解释如下

     可编程胶合逻辑(Programmable Glue Logic)是基于查找表(LUT)的简单可编程逻辑,其输入输 出可以连接到芯片引脚、内部信号,实现一些简单的胶合逻辑,在一些应用中可以帮助系统设计减 少PCB上的逻辑器件。 每个LUT包含4个输入,1个输出,1个真值表,可选的同步/滤波电路。用户通过对真值表编程,可 以获得期望的组合逻辑输出表达式。每个输入信号都可以被单独屏蔽。

PGL的基本特性如下:

⚫ 实现简单胶合逻辑,简化PCB设计

⚫ 4个4输入查找表

⚫ 可以通过真值表编程实现 AND,NAND,OR,NOR,XOR,NOT等逻辑表达式

⚫ 时序同步或滤波

⚫ 灵活的LUT输入选择:IO,内部信号,其他LUT输出

⚫ 输出可以被连接到IO或其他外设触发

具体逻辑图如下就一目了然,


那么实际上就是一个可以查表法实现的逻辑芯片,在NXP中是作为PLC的功能实现的。

总共包括了4个上面的单元,


不过这个PGL的引脚是不能自定义的,而是已经分配给了固定的引脚


2、PGL编程说明

    在编程的过程中,当使用LUT引脚输入时,需将对应引脚配置为GPIO输入,清除输入的MASK寄存器,并使能LUT。 当使用LUT引脚输出时,需将对应引脚配置为数字功能,并通过数字功能选择寄存器将引脚配置为 LUT输出,然后使能LUT。这功能通常是在GPL_init()的初始化函数中实现,如下范例代码

  1. void PGL_Init()
  2. {
  3.     FL_GPIO_InitTypeDef    GPIO_InitStruct = {0};
  4.     FL_PGL_LUT_InitTypeDef lutInit;

  5.     /*PC2、PC3为LUT0输入端口,配置成输入模式*/
  6.     GPIO_InitStruct.pin = FL_GPIO_PIN_2 | FL_GPIO_PIN_3;
  7.     GPIO_InitStruct.mode = FL_GPIO_MODE_INPUT;
  8.     GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
  9.     GPIO_InitStruct.pull = FL_DISABLE;
  10.     GPIO_InitStruct.remapPin = FL_DISABLE;
  11.     FL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  12.     /*PC0为LUT0输出端口,配置成数字模式*/
  13.     GPIO_InitStruct.pin = FL_GPIO_PIN_0;
  14.     GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
  15.     GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
  16.     GPIO_InitStruct.pull = FL_DISABLE;
  17.     GPIO_InitStruct.remapPin = FL_ENABLE;//数字功能复用
  18.     FL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  19.     /*PGL结构体配置*/
  20.     lutInit.edge                = FL_PGL_LUT_EDGE_NONE;
  21.     lutInit.outMode             = FL_PGL_LUT_OUTPUT_COMBINE_LOGIC;
  22.     lutInit.input3              = FL_PGL_LUT_INPUT_DISABLE;
  23.     lutInit.input2              = FL_PGL_LUT_INPUT_DISABLE;
  24.     lutInit.input1              = FL_PGL_LUT_INPUT_GROUP0;
  25.     lutInit.input0              = FL_PGL_LUT_INPUT_GROUP0;
  26.     FL_PGL_LUT_Init(PGL, FL_PGL_LUT0, &lutInit);

  27. }
复制代码

这个代码是初始化了第一单元LUT0的过程。

使用过程中是对真值表的写入和读取,通过输入状态组合查询LUT真值表中的数据,可以获得想要的组合逻辑功能。 每个LUT支持4输入,输入作为地址可以查询到16个输出,LUT本身就是一个4bit地址寻址的存储空 间。寄存器TRUTH[15:0]保存了16个输出数据,地址对应关系如下表所示。


在输入的部分是LUT 输入:

每个LUT有4个输入,每个输入都可以来自于引脚、芯片外设、或其他LUT输出。 通过INSEL寄存器,可以选择LUT输入信号源。

LUT 输出:

LUT的输出可以连接到引脚、或其他LUT输入。

这样的配置还是有一定的灵活性,4组LUT可以级联或者并联起来,实现更复杂的逻辑,或者扩大逻辑输入的位数。


3. 范例代码

在官网提供的代码中,有一个PGL的例程,非常简明地实现了上述过程。

在主程序中顺次启动时钟和硬件等,然后根据上面的方法,初始化PGL,

  1. int main(void)
  2. {
  3.     /* Reset of all peripherals, Initializes the Flash inte**ce and the Systick. */
  4.     /* SHOULD BE KEPT!!! */
  5.     MF_Clock_Init();

  6.     /* Configure the system clock */
  7.     /* SHOULD BE KEPT!!! */
  8.     MF_SystemClock_Config();

  9.     /* Initialize FL Driver Library */
  10.     /* SHOULD BE KEPT!!! */
  11.     FL_Init();

  12.     /* Initialize all configured peripherals */
  13.     /* SHOULD BE KEPT!!! */
  14.     MF_Config_Init();

  15.     UserInit();
  16.     Test_PGL();

  17.     while(1)
  18.     {
  19.         LED0_TOG();
  20.         FL_DelayMs(1000);
  21.     }
  22. }
复制代码

实现测试非常简单,直接对真值表置位,就可以启动PGL的功能,

  1. void Test_PGL()
  2. {
  3.     PGL_Init();
  4.     /*真值表配置*/
  5.     FL_PGL_WriteLUTTruthTable(PGL, FL_PGL_LUT0, 0x7);
  6.     /*LUT使能*/
  7.     FL_PGL_EnableLUT(PGL, FL_PGL_LUT0);
  8. }
复制代码

当PGL启动时,根据真值表访问输出,上述真值表置位0x7,换算成二进制是0111,因为只访问后PC2,PC3,作为LUT0-0和LUT0-1输入,那么实际就形成或的输出。

具体实现方式可参考下面的例子,


在KEIL中编译通过,就可以下载到开发板上执行。

更改真值表,就改变了逻辑设置。


相比而言,还是可以实现一些内部逻辑功能,节省一个逻辑元件。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

返回顶部