verilog小程序求救

verilog小程序求救,第1张

always@(posedge clk)

begin

singnal => ;

end

在时序逻辑的赋值里面必须用阻塞赋值

而且一个always块 *** 作一个被赋值信号!

修改前:

always@(posedge clk)

begin

if(aaa==0)

begin

aaa=1;

show=0;

end

else

begin

show=show+1;

end

end

修改后:

//for reg aaa

always@(posedge clk)

begin

if(aaa==0)

aaa《=1;

end

//for reg show

always@(posedge clk) begin

if(aaa==0)

show => 1'b0;

else

begin

show=>show+1;

end

end

请分清楚是同步reset还是异步reset

always@(posedge rst)

begin

aaa=0;

end

你这种写法会使编译器发疯的

想一想:如果posedge rst && aaa==0

然后aaa的值是多少???

所以你应该这么写

1根据一个always块 *** 作一个被赋值信号

always@(posedge clk or posedge rst)

if(rst)

aaa => 1'b0;

else

if ()

else

end

最后一点,请把名字起得好一点 通俗一点

别起什么aaa的破名字!!

VB代码如下:

VERSION 500

Begin VBForm Form1 

   Caption         =   "随机字符串"

   ClientHeight    =   6420

   ClientLeft      =   120

   ClientTop       =   450

   ClientWidth     =   7740

   LinkTopic       =   "Form1"

   ScaleHeight     =   6420

   ScaleWidth      =   7740

   StartUpPosition =   3  '窗口缺省

   Begin VBTextBox Text2 

      BeginProperty Font 

         Name            =   "宋体"

         Size            =   2175

         Charset         =   134

         Weight          =   400

         Underline       =   0   'False

         Italic          =   0   'False

         Strikethrough   =   0   'False

      EndProperty

      Height          =   2295

      Left            =   240

      MultiLine       =   -1  'True

      TabIndex        =   5

      Top             =   3120

      Width           =   5175

   End

   Begin VBTextBox Text1 

      BeginProperty Font 

         Name            =   "宋体"

         Size            =   2175

         Charset         =   134

         Weight          =   400

         Underline       =   0   'False

         Italic          =   0   'False

         Strikethrough   =   0   'False

      EndProperty

      Height          =   2295

      Left            =   240

      MultiLine       =   -1  'True

      TabIndex        =   4

      Top             =   480

      Width           =   5175

   End

   Begin VBCommandButton Command4 

      Caption         =   "按钮4"

      Height          =   975

      Left            =   5640

      TabIndex        =   3

      Top             =   4440

      Width           =   1695

   End

   Begin VBCommandButton Command3 

      Caption         =   "按钮3"

      Height          =   975

      Left            =   5640

      TabIndex        =   2

      Top             =   3120

      Width           =   1695

   End

   Begin VBCommandButton Command2 

      Caption         =   "按钮2"

      Height          =   975

      Left            =   5640

      TabIndex        =   1

      Top             =   1800

      Width           =   1695

   End

   Begin VBCommandButton Command1 

      Caption         =   "按钮1"

      Height          =   975

      Left            =   5640

      TabIndex        =   0

      Top             =   480

      Width           =   1695

   End

End

Attribute VB_Name = "Form1"

Attribute VB_GlobalNameSpace = False

Attribute VB_Creatable = False

Attribute VB_PredeclaredId = True

Attribute VB_Exposed = False

Dim i As Integer, k As Integer

''按钮1

Private Sub Command1_Click()

    Randomize (Time)

    For i = 1 To Len(Text1Text) Step 1

        If Mid(Text1Text, i, 1) = "" Then

            Text1Text = Mid(Text1Text, 1, i - 1) & (Int(Rnd()  100) Mod 10) & Mid(Text1Text, i + 1, Len(Text1Text))

        End If

    Next i

End Sub

''按钮2

Private Sub Command2_Click()

    Randomize (Time)

    For i = 1 To Len(Text1Text) Step 1

        If Mid(Text1Text, i, 1) = "" Then

            Text1Text = Mid(Text1Text, 1, i - 1) & Chr(Int(Rnd()  100) Mod 26 + 97) & Mid(Text1Text, i + 1, Len(Text1Text))

        End If

    Next i

End Sub

''按钮3

Private Sub Command3_Click()

    Randomize (Time)

    For i = 1 To Len(Text1Text) Step 1

        If Mid(Text1Text, i, 1) = "" Then

            k = (Int(Rnd()  100) Mod 36)

            If k < 10 Then

                Text1Text = Mid(Text1Text, 1, i - 1) & k & Mid(Text1Text, i + 1, Len(Text1Text))

            Else

                Text1Text = Mid(Text1Text, 1, i - 1) & Chr(k + 87) & Mid(Text1Text, i + 1, Len(Text1Text))

            End If

        End If

    Next i

End Sub

''按钮4

Private Sub Command4_Click()

    ClipboardSetText (Text1Text)

    Text2Text = ClipboardGetText()

End Sub

任务1:识别小型语言所有单词的词法分析程序设计

源程序设计语言 G[<程序>]

<程序>→<变量说明><BEGIN> <语句表> <END>

<变量说明>→VAR<变量表>:<类型>;|<空>

<变量表>→<变量表>,<变量>|<变量>

<类型>→INTEGER

<语句表>→<语句> | <语句>;<语句表>

<语句>→<赋值语句>|<条件语句>|<WHILE语句>|<复合语句>

<赋值语句>→<变量>:=<算术表达式>

<条件语句>→IF<关系表达式>THEN<语句>ELSE<语句>

<WHILE语句>→WHILE<关系表达式>DO<语句>

<复合语句>→BEGIN<语句表>END

<算术表达式>→<项>|<算术表达式>+<项>|<算术表达式>-<项>

<项>→<因式>|<项><因式>|<项>/<因式>

<因式>→<变量>|<整数>|(<算术表达式>)

<关系表达式>→<算术表达式><关系符><算术表达式>

<变量>→<标识符>

<标识符>→<标识符><字母>|<标识符><数字>|<字母>

<整数>→0|<非零数字><泛整数>

<泛整数>→<数字>|<数字><泛整数>|ε

<关系符>→<|<=|==|>|>=|<>

<字母>

→A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z

<非零数字>→1|2|3|4|5|6|7|8|9

<数字>→<非零数字>|0

<空>→

要求和提示:

词法分析阶段,可以打开任意位置和名称的源文件进行词法分析,可以进行非法字符和数字后边跟字母的错误判断,如果没有错误则提示“词法分析正确完成!”,并且可以选择输出tokentxt(token文件)stringtxt(符号表)两个文件;

1.词法分析程序的主要任务如下:

① 组织源程序的输入,识别出源程序中的各个基本语法单位(也称为单词或语法符号),按规则转换成二元式的形式;

② 删除无用的空白字符、回车符、及其它非实质性符号;

③ 删除注解行;

④ 为后面的语法和语义分析提供二元式链表;

单词 编码 单词 编码

标识符 1 < 15

正整数 2 <= 16

BEGIN 3 > 17

END 4 >= 18

IF 5 <> 19

THEN 6 == 20

ELSE 7 ; 21

WHILE 8 . 22

DO 9 := 23

INTEGER 10 , 24

+ 11 ( 25

- 12 ) 26

13

/ 14

1) 对标识符的长度控制在8个字符(包括8个)以内,超过的做截断处理;

2) 数字不大于65535,否则报错;

3) 能跳过源程序中的空白格:两个单词之间的任何空格,制表符,回车,换行都是白空格,除了用来分隔单词以外,没有意义;

4) 能跳过注释:

a) 接连出现的/到下一次接连出现的/之间的任何文字都是注释(多行);

b) 从某行接连出现的//到该行的结尾的任何文字都是注释(单行)。

3怎样编写词法分析程序:

1) 预处理:把源文件一个字符一个字符的读入词法分析程序设置的输入字符结构体数组中(输入缓冲区),读入过程要删除注释,删除多余的白空格;

2) 从源程序字符数组中获得单词, 编码为二元式:

二元式采用结构体数组存储, 把单词类型和词元记录下来。

分解单词的方法:

1) Case多路转换语句根据单词的特点直接编写;

2) 通过描述单词的正规文法得到相应的有穷自动机,通过case多路转换语句完成有穷自动机的处理流程。

3.编写词法分析程序要注意的问题:

1) 检查词法是否有错误

检查是否有非法字符:如 @, &, !

检查标志符和数字是否满足限制条件

检查注释符号是否配对

2) 符分隔单词

能够区分两个单词的符号为界符

有些界符不是单词:如白空格

有些界符仅仅用来分隔:如;

有些界符本身还是源程序不可缺少的单词,如(, ), +, /, 等等

有些界符包含两个字符:如<>, >=等等

3) 输出词法错误

如果有错误,需要报告词法错误的原因。并且要能够越过错误,分解下一个单词,直到源程序结束。

4) 输出的二元式流保存在二元式结构体数组中。

你好,希望采纳!

1L的哥们竟然没有分数也没有读写文件记录,我在他的基础上加了这个功能,采纳谁都可以哦~

#include <stdioh>

#include <ctypeh>

#include <timeh>

#include <stdlibh>

#include <windowsh>

#define IDNO_LENGTH 6

#define CALC_KIND 4

#define CALC_NUM 10

bool checkNo(char idNo[]);

char getSignal();

int getResult(int,int,char);

void takeTest();

//main函数

void main()

{

printf("Please input your four digit ID no(begin with two letters):");

char idNo[IDNO_LENGTH];

do

{

scanf("%s",&idNo);

fflush(stdin);

} while(checkNo(idNo)==false);

printf("1Start a test\t2Check score\t3Exitb\n");

int choose;

do

{

printf("选择:");

scanf("%d",&choose);

fflush(stdin);

} while(choose!=1 && choose!=2&& choose!=3);

if(choose==1)

{

takeTest();

}else if(choose==2)

{

FILE fp;

char ch;

if((fp=fopen("scoretxt","rt+"))==NULL)

{

printf("\n你还没做过题目测试");

getch();

exit(1);

}

ch=fgetc(fp);

while(ch!=EOF)

{

putchar(ch);

ch=fgetc(fp);

}

fclose(fp);

}

else

{

exit(0);

}

}

//获取随机运算符

char getSignal()

{

char signal[CALC_KIND]={'+','-','','/'};

srand((unsigned)time(NULL));

return signal[rand()%4];

}

//获取随机数

int random(double start, double end)

{

return (int)(start+(end-start)rand()/(RAND_MAX+ 10));

}

//运算

int getResult(int num1,int num2,char signal)

{

int res;

switch(signal)

{

case '+':

res=num1+num2;break;

case '-':

res=num1-num2;break;

case '':

res=num1num2;break;

case '/':

res=num1/num2;break;

default:

res=0;

printf("运算符不符合规则\n");

}

return res;

}

//列出10道题

void takeTest()

{

printf("开始答题,每道题10分,总共100分\n");

clock_t startTime;

startTime=clock();

int index;

int giveRes;

int num1;

int num2;

int score=0;

char signal;

for(index=0;index<CALC_NUM;index++)

{

srand((unsigned)time(NULL));

signal=getSignal();

num1=random(0,100);

num2=random(1,100);

printf("%d%c%d=",num1,signal,num2);

scanf("%d",&giveRes);

fflush(stdin);

if(getResult(num1,num2,signal)==giveRes)

{

printf("correct\n");

score+=10;

}

else

{

printf("wrong\n");

}

}

FILE fp=fopen("scoretxt","w");

fprintf(fp,"分数为%d",score);

fclose(fp);

printf("解10道题用了%lf秒\n",(double)(clock()- startTime)/CLOCKS_PER_SEC);

}

//检测idNo是否合规则,合规则返回true

bool checkNo(char idNo[])

{

int index;

bool flag;

flag=true;

for(index=0;index<IDNO_LENGTH;index++)

{

if(index<2)

{

if(!isalpha(idNo[index]))

{

flag=false;

printf("ID no 不符合规则,重新输入:");

break;

}

}

else

{

if(!isdigit(idNo[index]))

{

flag=false;

printf("ID no 不符合规则,重新输入:");

break;

}

}

}

return flag;

}

(1)var si,pr:set of 2n; 是集合

(2)表示集合为空,初始值

(3)while not(x in si) {当x这个值不在集合si中时}

x in si 就是 x这个元素在si这个集合中

一、集合类型

集合是由具有某些共同特征的元素构成的一个整体。在pascal中,一个集合是由具有同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。

(一)集合类型的定义和变量的说明

集合类型的一般形式为:

set of <基类型>;

说明:①基类型可以是任意顺序类型,而不能是实型或其它构造类型;同时,基类型的数据的序号不得超过255。例如下列说明是合法的

type letters=set of 'A''Z';

numbers=set of 09;

s1=set of char;

ss=(sun,mon,tue,wed,thu,fri,sat);

s2=set of ss;

②与其它自定义类型一样,可以将类型说明与变量说明合并在一起。如:

type numbers=set of 09;

var s:numbers;

与 var s:set of 09;等价。

(二)集合的值

集合的值是用"〔"和"〕"括起来,中间为用逗号隔开的若干个集合的元素。如:

[] 空集

[1,2,3]

['a','e','i','o','u']

都是集合。

说明:①集合的值放在一对方括号中,各元素之间用逗号隔开

②在集合中可以没有任何元素,这样的集合称为空集

③在集合中,如果元素的值是连续的,则可用子界型的表示方法表示。例如:

〔1,2,3,4,5,7,8,9,10,15〕

可以表示成:

〔15,710,15〕

④集合的值与方括号内元素出现的次序无关。例如,〔1,5,8 〕和〔5,1,8〕的值相等。

⑤在集合中同一元素的重复出现对集合的值没有影响。例如,〔1,8,5,1,8〕与〔1,5,8〕的值相等。

⑥每个元素可用基类型所允许的表达式来表示。如〔1,1+2,4〕、〔ch〕、〔succ(ch)〕。

(三)集合的运算

1、赋值运算:只能通过赋值语句给集合变量赋值,不能通过读语句赋值,也不能通过write(或writeln)语句直接输出集合变量的值

2、集合的并、交、差运算:可以对集合进行并、交、差三种运算,每种运算都只能有一个运算符、两个运算对象,所得结果仍为集合。三种运算符分别用"+"、"*"、"-"表示;注意它们与算术运算的区别

3、集合的关系运算:集合可以进行相等或不相等、包含或被包含的关系运算,还能测试一个元素是否在集合中。所用的运算符分别是:=、<>、>=、<=、in

它们都是二目运算,且前4个运算符的运算对象都是相容的集合类型,最后一个运算符的右边为集合,左边为与集合基类型相同的表达式。

例4设有如下说明:

type weekday=(sun,mon,tue,wed,thu,fri,sat);

week=set of weekday;

subnum=set of 150;

写出下列表达式的值:

⑴〔sun,sat〕+〔sun,tue,fri〕

⑵〔sun,fri〕〔mon,tue〕

⑶〔sun,sat〕〔sunsat〕

⑷〔sun〕-〔mon,tue〕

⑸〔mon〕-〔mon,tue〕

⑹〔sunsat〕-〔mon,sun,sat〕

⑺〔1,2,3,5〕=〔1,5,3,2〕

⑻〔1,2,3,4〕<>〔14〕

⑼〔1,2,3,5〕>=〔13〕

⑽〔15〕<=〔14〕

⑾〔1,2,3〕<=〔13〕

⑿ 2 in〔110〕

答:表达式的值分别是:

⑴ 〔sun,sat,tue,fri〕

⑵ 〔 〕

⑶ 〔sun,sat〕

⑷ 〔sun〕

⑸ 〔 〕

⑹ 〔tuefri〕

⑺ TRUE

⑻ FALSE

⑼ TRUE

⑽ FALSE

⑾ TRUE

⑿ TRUE

例5输入一系列字符,对其中的数字字符、字母字符和其它字符分别计数,输入“?”后结束

源程序如下:

program ex10_2;

var id,il,io:integer;

ch:char;

letter:set of char;

digit:set of '0''9';

begin

letter=['a''z','A''Z'];

digit:=['0''9'];

id:=0;il:=0;io:=0;

repeat

read(ch);

if ch in letter

then il:=il+1

else if ch in digit

then id:=id+1

else io:=io+1;

until ch='';

writeln('letter:',il,'digit:',id,'Other:',io);

end

二、记录类型

在程序中对于组织和处理大批量的数据来说,数组是一种十分方便而又灵活的工具,但是数组在使用中有一个基本限制,这就是:一个数组中的所有元素都必须具有相同的类型。但在实际问题中可能会遇到另一类数据,它是由性质各不相同的成份组成的,即它的各个成份可能具有不同的类型。例如,有关一个学生的数据包含下列项目:

学号 字符串类型

姓名 字符串类型

年龄 整型

性别 字符型

成绩 实型数组

Pascal给我们提供了一种叫做记录的结构类型;在一个记录中,可以包含不同类型的并且互相相关的一些数据。

(一)记录类型的定义

在pascal中,记录由一组称为“域”的分量组成,每个域可以具有不同的类型,记录类型定义的一般形式:

record

<域名1>:<类型1>;

<域名2>:<类型2>;

: :

: :

<域名n>:<类型n>;

end;

说明:①域名也称域变量标识符, 应符合标识符的语法规则;在同一个记录中类型中,各个域不能取相同的名,但在不同的记录类型中,两个类型中的域名可以相同

②记录类型的定义和记录变量可以合并为一个定义,如:

type date=record

year:19001999;

month:112;

day:131

end;

var x:date;

可以合并成:

var x: record

year:19001999;

month:112;

day:131

end;

③对记录的 *** 作,除了可以进行整体赋值, 只能对记录的分量——域变量进行。

④域变量的表示方法如下:

记录变量名域名

如前面定义的记录X,其3个分量分别为:xyear;xmonth;xday

⑤域变量的使用和一般的变量一样, 即域变量是属于什么数据类型,便可以进行那种数据类型所允许的 *** 作。

(二)记录的嵌套

当一个记录类型的某一个域类型也是记录类型的时候,我们说发生了记录的嵌套,看下面的例子:

例6某人事登记表可用一个记录表示,其中各项数据具有不同的类型,分别命名一个标识符。而其中的“出生年月日”又包括三项数据,还可以用一个嵌套在内层的记录表示。

具体定义如下:

type sexs=(male,female);

date=record

year:19001999;

month:112;

day:131;

end;

personal=record

name:string[15];

sex:sexs;

birthdate:date;

home:string[40];

end;

例7设计一个函数比较两个dates日期类型记录变量的迟早。

设函数名、形参及函数类型定义为:

AearlyB(A,B:dates):boolean;

函数的形参为两个dates类型的值参数。当函数值为true 时表示日期A早于日期B,否则日期A迟于日期B或等于日期B。显然不能对A、B两个记录变量直接进行比较,而要依具体的意义逐域处理。

源程序如下:

program ex6_7;

type dates=record

year:19001999;

month:112;

day:131

end;

var x,y:dates;

function AearlyB(A,B:dates):boolean;

var earln:boolean;

begin

early:=false;

if (Ayear<Byear) then early:=true;

if (Ayear=Byear)and(Amonth<Bmonth)

then early:=true;

if (Ayear=Byear)and(Amonth=Bmonth)and(Aday<Bday)

then early:=true;

AearlyB:=early;

end;{of AearlyB}

begin

write('Input DATE X(mm-dd-yy):')readln(Xmonth,Xday,Xyear);

write('Input DATE Y(mm-dd-yy):')readln(Ymonth,Yday,Yyear);

if AearlyB(X,Y) then writeln(Date X early!') else writeln('Date X not early!');

end

(三)开域语句

在程序中对记录进行处理时,经常要引用同一记录中不同的域,每次都按641节所述的格式引用,非常乏味。为此Pascal提供了一个with语句,可以提供引用域的简单形式。开域语句一般形式:

with <记录变量名表> do

<语句>

功能:在do后的语句中使用with后的记录的域时, 只要直接写出域名即可,即可以省略图1022中的记录变量名和""。

说明:①一般在with后只使用一个记录变量名。如:

write('Input year:');

readln(xyear);

write('Input month:');

readln(xmonth);

write('Input day:');

readln(xday);

可以改写成:

with x do

begin

write('Input year:');readln(year);

write('Input month:');readln(month);

write('Input day:');readln(day);

end;

②设x,y是相同类型的记录变量,下列语句是非法的:

with x,y do;

③with后接若干个记录名时,应是嵌套的关系。如有记录说明:

var x:record

i:integer;

y:record

j:05;

k:real;

end;

m:real

end;

可以使用:

with x do

begin

read(i);

with y do

read(j,k);

readln(m);

end;

或简写为:

with x,y do

readln(i,j,k,m);

例8读入10个日期,再对每个日期输出第二天的日期。输入日期的格式是月、日、年,如9□30□1993,输出的格式为10/1/1993

分析:可用一个记录变量today表示日期。 知道一个日期后要更新为第二天的日期,应判断输入的日期是否为当月的最后一天,或当年的最后一天。

源程序如下:

program ex6_8;

type date=record

month:112;

day:131;

year:19001999;

end;

var today:array[110]of date;

i:integer;

maxdays:2831;

begin

for i:=1 to 10 do {输入10个日期}

with today[i] do

readln(month,day,year);

for i:=1 to 10 do

with today[i] do{求第i个日期中月份最后一天maxdays}

begin

case month of

1,3,5,7,8,10,12:maxdays:=31;

4,6,9,11 :maxdays:=30;

2 :if(year mod 400=0) or( year mod 4=0)

and(year mod 100<>0)

then maxdays:=29

else maxdays:=28;

end;

if day=maxdays

then begin

day:=1;

if month=12

then begin

month:=1;year:=year+1;

end

else month:=month+1;

end

else day:=day+1;

writeln(month,'/',day,'/',year);

end;

end

五、应用实例

例9编制用筛法求1-n(n≤200)以内素数的程序

分析:由希腊著名数学家埃拉托色尼提出的所谓“筛法”,步骤如下:

①将所有候选数放入筛中;

②找筛中最小数(必为素数)next,放入集合primes中;

③将next的所有倍数从筛中筛去;

④重复②~④直到筛空。

编程时,用集合变量sieve表示筛子,用集合primes存放所有素数。

源程序如下:

program ex10_3;

const n=200;

var sieve,primes:set of 2n;

next,j:integer;

begin

sieve:=[2n];{将所有候选数放入筛中}

primes:=[];{素数集合置空}

next:=2;

repeat

{找筛sieve中最小一个数}

while not(next in sieve) and(next<=n)do

next:=succ(next);

primes:=primes+[next];{将最小数放入素数集合中}

{将这个素数的倍数从筛中删去}

j:=next;

while j<=n do

begin

sieve:=sieve-[j];

j:=j+next;

end

until sieve=[];

j:=0;

for next:=2 to n do{打印出所有素数}

if next in primes then

begin

write(next:5);

j:=j+1;

if j mod 10=0 then writeln;

end;

writeln;

end

可以定义一个全局变量用来记录正确的数目,并在窗体创建时赋初始值:

procedure TForm1FormCreate(Sender: TObject);

begin

i := 0;

end;

//随机生成数:

procedure TForm1Button1Click(Sender: TObject);

var z,j : integer;

begin

Randomize;

j := random(1000);

z := random(1000);

label1Caption := inttostr(j);

label2Caption := inttostr(z);

end;

//当按下enter键时判断答案是否正确:

procedure TForm1Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if key = #13 then

begin

if edit1Text =inttostr(strtoint(label1Caption) + strtoint(label2Caption)) then

begin

label3Caption :='タ絋';

i := i+1;

edit2Text := inttostr(i);

end

else

label3Caption := '';

end;

end;

以上就是关于verilog小程序求救全部的内容,包括:verilog小程序求救、求帮写一个小程序。什么语言都行。要可以运行、设计一个小语言的词法分析程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10118466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存