⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arm+fpga.txt

📁 基于ARM平台的等精度数字显示频率计的设计,已通过测试
💻 TXT
字号:
#include "config.h"
#include "math.h"
#define PIN_21 0x200000
#define CLR    0xffffff
#define BEEPCON (1<<7)//0x00000080
#define sel0    (1<<8) //p3.8
#define sel1    (1<<9) //p3.9
#define sel2    (1<<10)//p3.10
#define clr     (1<<11)//p3.11
#define SPUL    (1<<12)//p3.12
#define CL      (1<<13)//p3.13 
#define START   (1<<14)//p3.14
#define EEND    (1<<15)//p3.15
#define YEJI 0xf0
#define E 0x200
#define RS 0x80 
#define RW 0x100
#define PSB 0x40000
#define RES 0x80000
#define PB  0xdffff
#define PD  0x10000
#define WY  0x3fc00
#define M   0x6d     //MHZ的简写//
#define K   0x6b     //KHZ的简写//
#define h   0x68     //HZ 的简写//
#define ns  0x6e     
#define us  0x75
#define  s  0x73
const uint8 qing[]={0x34,0x30,0x30,0x06,0x0c,0x34}      ;/*画图命令*/
const uint8 song[]={0x30,0x31,0x80,0x40,0x0c}           ;/*字库命令*/
void dely(uint32 dly) //延时函数。
{uint32 i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);}

void caizhi(uint32 x,uint8 c[])//将X的整数按位放入C[]中。
{uint32 u;
 uint32 ii;
 uint32 iii;
 for(ii=0;ii<8;ii++)
 {
  switch(ii)
 {case 0:
  {iii = 10000000;}break;
  case 1:
  {iii = 1000000;}break;
  case 2:
  {iii = 100000;}break;
  case 3:
  {iii = 10000;}break;
  case 4:
  {iii = 1000;}break;
  case 5:
  {iii = 100;}break;
  case 6:
  {iii = 10;} break;
  case 7:
  {iii = 1;}break;
  default:break;}   
 u = x/iii;
 c[ii] = u;
 u = x;
 u = u%iii;
 x = u;              
 }}
 

void delay(void)            //短延时函数。
{uint32 i;
 for(i=0;i<500;i++);}
 
void fasong(uint32 data)   //发送数据到LCD中。
{ uint32 da;
  uint32 ys;
  IO2DIR = PB;
  for(ys=100;ys>0;ys--);
  while(IO2PIN&PD!=0);
  IO2DIR = 0xfffff;
  da = data<<10;
  da = da&WY;
  IO2SET = RS;
  delay();
  IO2CLR = RW;
  delay();
  IO2CLR = WY;
  IO2SET = da;
  delay();
  IO2SET = E;
  delay();
  IO2CLR = E;}
  
void fasong1(uint32 zhidu)   //发送命令到LCD中。
{uint32 da1;
 IO2DIR = PB;
 delay();
 while(IO2PIN&PD!=0);
 IO2DIR = 0xfffff;
 da1 = zhidu<<10;
 da1 = da1&WY;
 IO2CLR = RS;
 delay();
 IO2CLR = RW;
 delay();
 IO2CLR = WY;
 IO2SET = da1;
 delay();
 IO2SET = E;
 delay();
 IO2CLR = E;
 }

void Uint(uint8 x,uint8 tit[])//发送单位//
{if(x==0){fasong(tit[0]);fasong(0x68);fasong(0x7a);}
 else {fasong(tit[1]);fasong(0x73);}}


void dao1(fp32 a[],uint8 tit[],uint8 tiit[])//发送频率,周期的数据//
{uint8 i;
 uint8 x;
 uint8 order;
 uint8 y[8];
 IO2DIR=0xfffff;          //设置P2口全为输出//
 IO2CLR =0xffffffff;      //清0P2全为0输出//   
IO2CLR = RES;              
 delay();
 IO2SET = RES;
 delay();
 IO2SET = PSB;
 delay();
 for(i=0;i<6;i++)         //发送画图命令//
{fasong1(qing[i]);         
 delay();}
 for(i=0;i<4;i++)     
 {fasong1(song[i]);
 delay();}
 fasong1(0x80);
 fasong(0x46);
 fasong(0x3a);
 fasong1(0x90);
 fasong(0x54);
 fasong(0x3a);
 
for(x=0;x<2;x++)
{caizhi(a[x],y);
if(x==0)fasong1(0x81);
else fasong1(0x91);

 
for(i=0;i<8;i++)
{switch(y[i])
{case 0:
 {fasong(0x30);}break;
 case 1:
 {fasong(0x31);}break;
 case 2:
 {fasong(0x32);}break;
 case 3:
 {fasong(0x33);}break;
 
 case 4:
 {fasong(0x34);}break;
 case 5:
 {fasong(0x35);}break;
 case 6:
 {fasong(0x36);}break;
 case 7:
 {fasong(0x37);}break;
 case 8:
 {fasong(0x38);}break;
 case 9:
 {fasong(0x39);}break;
 default:break;}
 if(x==0){if(tiit[0]==(i+1))fasong(0x2e);}
 else if(x==1){if(tiit[1]==(i+1))fasong(0x2e);}} 
 
 
 Uint(x,tit);}   
 fasong1(0x30);} 




 kc(fp32 x,uint8 pd,uint8 tit[],uint8 tiit[])  //单位转化函数//
{
   if(x<0.1){x=x*1000000000;tit[1]=ns;tiit[1]=2;} 
else if(x<1){x=x*100000000;if(pd==0) {tit[0]=h;tiit[0]=1;}
                      else {tit[1]=ns;tiit[1]=3;}}
                      
else if(x<10){x=x*10000000;if(pd==0) {tit[0]=h;tiit[0]=1;}
                      else {tit[1]=us;tiit[1]=1;}}
                      
else if(x<100){x=x*1000000;if(pd==0) {tit[0]=h;tiit[0]=2;}
                      else {tit[1]=us;tiit[1]=2;}}
                      
else if(x<1000){x=x*100000;if(pd==0) {tit[0]=h;tiit[0]=3;}
                      else {tit[1]=us;tiit[1]=3;}}
                      
else if(x<10000){x=x*10000;if(pd==0) {tit[0]=K;tiit[0]=1;}
                      else {tit[1]=us;tiit[1]=4;}}
                      
else if(x<100000){x=x*1000;if(pd==0) {tit[0]=K;tiit[0]=2;}
                      else {tit[1]=us;tiit[1]=5;}}
                      
else if(x<1000000){x=x*100;if(pd==0) {tit[0]=K; tiit[0]=3;}
                      else {tit[1]=us;tiit[1]=6;}}
                      
else if(x<10000000){x=x*10;if(pd==0) {tit[0]=M; tiit[0]=1;}
                      else {tit[1]=s; tiit[1]=1;}}
                      
                      else if(pd==0) {tit[0]=M; tiit[0]=2;}
                      else {tit[1]=s;tiit[0]=2;}
               return(x);}
 
 dao(uint8 addx)  //从FPGA中取数据函数//
{uint32 zc;
 uint32 Ns;
 IO3DIR=(clr|sel2|sel1|sel0);
 IO3CLR=(sel2|sel1|sel0);
 switch(addx)
 { case 0:{ zc=IO3PIN&0xff;
            zc=zc<<24;
            Ns=Ns|zc;
            
            IO3SET=sel0; 
            zc=IO3PIN&0xff; 
            zc=zc<<16;
            Ns=Ns|zc;
            IO3CLR=sel0;
            IO3SET=sel1;
            zc=IO3PIN&0xff;
            zc=zc<<8;
            Ns=Ns|zc; 
            IO3SET=sel0;
            IO3SET=sel1;
            zc=IO3PIN&0xff;
            Ns=Ns|zc;}break;
            
       
   
   case 1:{ IO3CLR=sel0;
            IO3CLR=sel1;
            IO3SET=sel2; 
            zc=IO3PIN&0xff;
            zc=zc<<24;
            Ns=Ns|zc;
            
            IO3SET=sel2;
            IO3SET=sel0;
            zc=IO3PIN&0xff; 
            zc=zc<<16;
            Ns=Ns|zc;
            
            IO3CLR=sel0;
            IO3SET=sel1;
            IO3SET=sel2;
            zc=IO3PIN&0xff;
            zc=zc<<8;Ns=Ns|zc;
           
            IO3SET=sel0;
            IO3SET=sel1;
            IO3SET=sel2;
            zc=IO3PIN&0xff;
            Ns=Ns|zc;};break;
       default:break;}
  return(Ns);} 

void pl(void)//测频开始函数//
{fp32 Ns;
 fp32 Nx; 
 fp32 Fx;
 fp32 period;
 fp32 a[2];
 uint8 tit[2];
 uint8 tiit[2];
 
 IO3DIR=(SPUL|CL|clr);
 IO3SET=SPUL;
 IO3SET=CL;
while(IO3PIN&START==0);
 dely(650);
IO3CLR=CL;
while(IO3PIN&START==1);
 dely(10);  
 Ns=dao(0);
 Nx=dao(1);
 Fx=30000000/Ns;
Fx=Fx*Nx;
period=1000000/Fx;//微秒//

    Fx=kc(Fx,0,tit,tiit);
period=kc(period,1,tit,tiit);

a[0]=Fx;
a[1]=period;
dao1(a,tit,tiit);}


int main()
{PINSEL0 = 0x00000000;
 IO0DIR = BEEPCON;
 IO0CLR = 0xfffff;
 IO3DIR=(SPUL|CL|clr);
 IO3CLR=CLR;
 IO3CLR=START;
while(1)
{IO0SET = BEEPCON;
dely(100);
IO0CLR = BEEPCON;
dely(100);
if((PIN_21&IO0PIN)==0)//键判断//
{IO3SET=clr;//FPGA清理
 delay();
 IO3CLR=clr;
 pl();
 delay();
while((PIN_21&IO0PIN)==0);//键判断//
delay();
}}
return(0);}






********************************************************************************
LIBRARY IEEE;  -- 2003/7/21   GWDVPB
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY pingliji IS
    PORT (CLK0 : IN STD_LOGIC; --CLOCK0 标准频率时钟信号
          TCLK : IN STD_LOGIC; --PIO27 待测频率时钟信号
           CLR : IN STD_LOGIC; --PIO0 清零和初始化信号
            CL : IN STD_LOGIC; --PIO1 当SPUL为高电平时,CL为预置门控信号,用于测频计数时间控制
                               --当SPUL为低电平时,CL为测脉宽控制信号,CL高电平时测高电平脉宽
                               --而当CL为低电平时,测低电平脉宽。
          SPUL : IN STD_LOGIC;     --PIO2 测频或测脉宽控制
         START : OUT STD_LOGIC; --PIO2
          EEND : OUT STD_LOGIC; --PIO3 由低电平变到高电平时指示脉宽计数结束,
           SEL : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --PIO6/PIO5/PIO4
                                             --两个32位计数器计数值分8位读出多路选择控制
          DATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --PIO8/9/10/11/12/13/14/15 8位数据读出
        
          CONT : OUT STD_LOGIC --计数分频
			
);
END ;
ARCHITECTURE behav OF pingliji IS
    SIGNAL BZQ  : STD_LOGIC_VECTOR(31 DOWNTO 0);  --标准计数器
    SIGNAL TSQ  : STD_LOGIC_VECTOR(31 DOWNTO 0);  --测频计数器
    SIGNAL ENA  : STD_LOGIC;   -- 计数使能
    SIGNAL CNT  : STD_LOGIC_VECTOR(15 DOWNTO 0); 
    
    SIGNAL LL : STD_LOGIC;
    SIGNAL  MA  : STD_LOGIC;  
    SIGNAL CLK1,CLK4 : STD_LOGIC;
    SIGNAL CLK2 : STD_LOGIC;
    SIGNAL CLK3 : STD_LOGIC;
    SIGNAL   Q1 : STD_LOGIC;
    SIGNAL   Q2 : STD_LOGIC;
    SIGNAL   Q3 : STD_LOGIC;
    SIGNAL BENA : STD_LOGIC;
    SIGNAL  PUL : STD_LOGIC;  --脉宽计数使能
    SIGNAL    Q : STD_LOGIC_VECTOR(6 DOWNTO 0);

    SIGNAL   SS : STD_LOGIC_VECTOR(1 DOWNTO 0);

  BEGIN
    START <= ENA ;

    DATA <= BZQ(31  DOWNTO  24)  WHEN SEL = "000"  ELSE  -- 标准频率计数低8位输出
            BZQ(23 DOWNTO  16)  WHEN SEL = "001"  ELSE
            BZQ(15 DOWNTO 8)  WHEN SEL = "010"  ELSE
            BZQ(7 DOWNTO 0)  WHEN SEL = "011"  ELSE  -- 标准频率计数最高8位输出
  
           TSQ(31 DOWNTO  24)  WHEN SEL = "100"  ELSE  --待测频率计数值最低8位输出
            TSQ(23 DOWNTO  16)  WHEN SEL = "101"  ELSE
            TSQ(15 DOWNTO   8)  WHEN SEL = "110"  ELSE
            TSQ(7 DOWNTO 0)  WHEN SEL = "111"  ELSE  --待测频率计数值最高8位输出
            TSQ(7 DOWNTO 0)  ;      
-- HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

 BZH :  PROCESS(CLK0, CLR)                    --标准频率测试计数器,标准计数器
      BEGIN
        IF CLR = '1' THEN   BZQ <= ( OTHERS=>'0' ) ;
        ELSIF CLK0'EVENT AND CLK0 = '1' THEN
            IF BENA = '1' THEN   BZQ <= BZQ + 1;   
            END IF;
        END IF;
    END PROCESS;

-- gggggggggggggggggggggggggggggggggggggggggggggggggggg

 TF : PROCESS(TCLK, CLR, ENA)                      --待测频率计数器,测频计数器
     BEGIN
       IF CLR = '1' THEN   TSQ <= ( OTHERS=>'0' );
       ELSIF TCLK'EVENT AND TCLK = '1' THEN
           IF ENA = '1' THEN   TSQ <= TSQ + 1;   
           END IF;
       END IF;
   END PROCESS;

--FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

 PROCESS(TCLK,CLR)   --计数控制使能触发器,CL为预置门控信号,同时兼作正负脉宽测试控制信号
      BEGIN
       IF CLR = '1' THEN   ENA <= '0' ;
        ELSIF TCLK'EVENT AND TCLK = '1' THEN
               ENA <= CL ;   
       END IF;
    END PROCESS;

--OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
  MA  <= (TCLK AND CL) OR NOT(TCLK OR CL)  ; --测脉宽逻辑
 CLK1 <= NOT MA ; 
 CLK2 <= MA AND Q1 ;
 CLK3 <= NOT CLK2  ;
   SS <= Q2 & Q3 ;
-- HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
 DD1:  PROCESS(CLK1,CLR)   
         BEGIN
           IF CLR = '1' THEN   Q1 <= '0' ;
             ELSIF CLK1'EVENT AND CLK1 = '1' THEN  Q1 <= '1' ;   
           END IF;
       END PROCESS;

DD2:  PROCESS(CLK2,CLR)   
         BEGIN
           IF CLR = '1' THEN   Q2 <= '0' ;
             ELSIF CLK2'EVENT AND CLK2 = '1' THEN  Q2 <= '1' ;   
           END IF;
      END PROCESS;

DD3:  PROCESS(CLK3,CLR)   
         BEGIN
           IF CLR = '1' THEN   Q3 <= '0' ;
             ELSIF CLK3'EVENT AND CLK3 = '1' THEN  Q3 <= '1' ;   
           END IF;
      END PROCESS;
-- HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
GT :
    PUL <= '1' WHEN SS = "10" ELSE  --当SS=“10”时,PUL高电平,允许标准计数器计数,
           '0' ;                    --禁止计数

   EEND <= '1' WHEN SS = "11" ELSE  --EEND为低电平时,表示正在计数,由低电平变到高电平
           '0' ;                    --时,表示计数结束,可以从标准计数器中读数据了
--UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
  BENA <= ENA WHEN SPUL = '1' ELSE  --标准计数器时钟使能控制信号,当SPUL为1时,测频率
          PUL WHEN SPUL = '0' ELSE  --当SPUL为0时,测脉宽和占空比
          PUL ;
--UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
PROCESS(CLK0)
BEGIN
IF CLK0'EVENT AND CLK0='1' THEN Q<=Q+1; IF Q="1111111" THEN Q<="0000000";
 LL<=NOT LL;
END IF;
END IF;
END PROCESS;
  CONT<=LL;

END behav;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -