目录
(5)循环语句(repeat+forever+while+for)
1. Verilog HDL程序是由模块构成的。每个模块嵌套在module和endmodule声明语句中。
2 每个Verilog HDL源文件中只有一个顶层模块,其他为子模块。可以每个模块写一个文件。
3.每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑描述。
4.模块中的时序逻辑部分在always块的内部,在always块中只能对寄存器变量赋值。
5.模块中对端口或其他wire型变量的赋值,必须在always块的外部使用assign语句,通常是将寄存器的值送出
6.程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。
7. 除了endmodule语句、begin_end语句和fork_join语句外,每个语句和数据定义的最后都要加分号
8.可用/*.....*/和//...对程序的任何部分作注释。加上必要的注释,可以增强程序的可读性
首先对数的表示方式进行讲解,Verilog只能表示二进制的逻辑值,可以为0,1,高阻,未知

如下图所示, 数在Verilog里面有3种表示

Verilog的数据类型分为 寄存器型(reg) 线型(wire) 符号常量(parameter) 寄存器数组
之所以reg叫做寄存器型,是因为数字电路中的触发器只在时钟有效边沿到来的时候,保存的值才能够发生改变。
reg型信号的定义格式如下:
定义一个n位的寄存器变量 : reg [n-1:0]变量名;
定义m个n位的寄存器变量 : reg [n-1:0]变量名1,变量名2,....变量名m;
下面给出2个例子:
reg [7:0] a, b, c; //a, b, c都是位宽为8位的寄存器
reg d; //1位的寄存器d
wire型信号的定义格式如下:
定义一个n位的wire变量 : wire [n-1:0]变量名;
定义m个n位的wire变量 : wire [n-1:0]变量名1,变量名2,.变量名m;
下面给出2个例子:
wire [7:0] a, b, c; // a, b, c都是位宽为8位的wire
wire d; //d是1位的wire
如果用关键词parameter来定义一个标识符,代表一个常量,这个常量就被称为符号常量。
例如: parameter width=3;//符号常量width的值是3,如果未进行重定义,当在程序中出现width时就用3代替。
同样的,可以一次性定义多个符号常量,parameter idle=1,one=2,two=3,stop=4;//定义了4个符号常量。如果未进行重定义,当代码中出现idle就用1代替,出现one就用2代替,出现tow就用3代替,出现stop就用4代替。
但是符号常量可以被重定义,使用#即可
如下图,一开始time_delay=5 time_count=10,重定义之后time_delay=4 time_count=8

存储器实际上是一个寄存器数组。
存储器使用如下方式定义reg [ msb: lsb] memory1 [ upper: lower]
(upper:lower)代表寄存器个数,(msb是最高有效位,lsb是最低有效位)代表每个寄存器的位数
例如:
reg[3:0] mymem1[63:0]; //mymem1为64个4位寄存器的数组。
reg dog [1:5]; //dog为5个1位寄存器的数组。
dog[4]= 1; //合法赋值语句,对其中一个1位寄存器赋值。
dog[1:51]= 0; //合法赋值语句,对存储器大范围赋值。
| 算术运算符 | 说明 |
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除 |
| % | 取模(余数) |
在进行整数的除法运算时,结果要略去小数部分,只取整数部分;
进行取模运算时( %) 结果的符号位采用模运算符中第一个操作数的符号。例如,-10%3结果-1,11%-3 结果为2。
在进行算术运算时,如果某一个操作数有不确定的值x,则整个结果也为不确定值x。
| 逻辑运算符 | 说明 |
| && | 逻辑与 |
| || | 逻辑或 |
| ! | 逻辑非 |
逻辑运算最常用于条件判断语句。逻辑运算只区分真假,而不管是什么数值。逻辑运算的输入4'ha1和4'h01是没有区别的,都是逻辑真,而0为逻辑假。一般来说,逻辑运算的结果要么为真(1)要么为假(0)
特例是如果有一个输入为未知X,那么结果也是X。
例如,4'ha1&&4h01是1,4'ha1&&4h00是0。
■对于逻辑与或:只有两个输入都是0的时候,逻辑或的结果才是0。
■对于逻辑非:当输入为非0值,输出就是0。
| 按位运算符 | 说明 |
| & | 按位与 |
| | | 按位或 |
| ~ | 按位取反 |
| ^ | 按位异或 |
| ~^ ^~ | 按位同或 |
按位运算符是对照数据的每一位进行运算, 例如0101&1100=0100,0101|1100=1101
ps:异或是指如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
同或是指如果a、b两个值不相同,则同或结果为0。如果a、b两个值相同,同或结果为1。
| 关系运算符 | 说明 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
关系运算符和逻辑运算符一般用于条件判断语句。
关系运算结果为1位的逻辑值1(真)或0(假),但也可能是x(未知)。关系运算符根据关系运算的结果是真还是假,用于条件判断。
关系运算时,若关系为真,则返回值为1;若声明的关系为假,则返回值为0;若某操作数为不定值x,则返回值也一定为x。
| 等式运算符 | 说明 |
| == | 等于 |
| != | 不等于 |
| === | 全等于 |
| !== | 全不等于 |
"=="和"!="称作逻辑等式运算符,其结果由两个操作数的值决定。由于操作数可能是x或z,其结果可能为x。
"==="和"!=="常用于case表达式的判别,又称作case等式运算符。其结果只能为0和1。如果操作数中存在x和z,那么操作数必须完全相同结果才为1,否则为0。
注意"=="和"="是完全不同的,"="是对寄存器赋值使用的。
| 移位运算符 | 说明 |
| << | 左移 |
| >> | 右移 |
a>>n中a代表要进行向右移位的操作数,n代表要移几位。a<<n表示将a逻辑左移n位。
这两种移位运算都用0来填补移出的空位。
例如a是一个5位的寄存器,那么a=4'b1001<<1,a的结果就是5'b10010。但是当a是一个4位的寄存器,那么a=4'b1001<<1,a的结果就是4'b0010。
用法: assign wire类型变量=条件?表达式1:表达式2;
如果满足条件,变量=表达式1,否则,变量=表达式2
使用拼接运算符可以将变量任意组合后输出或送给另一个变量。
用法:{信号1的某几位,信号2的某几位,......信号n的某几位}
{m,-a,b[3:0],w,3'b101}等同于{a,b[3],b[2],b[1],b[0],w,1b'[1],1'b[0],1'b[1]}
{4{w}}等同于{w,w,w,w}
{b{3{a,b}}等同于{b,a,b,a,b,a,b}



ps:


我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby有很大不同。由于我与ruby之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?
如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback
在我的双语Rails4应用程序中,我有一个像这样的LocalesController:classLocalesController用户可以通过此表单更改其语言环境:deflocale_switcherform_tagurl_for(:controller=>'locales',:action=>'change_locale'),:method=>'get',:id=>'locale_switcher'doselect_tag'set_locale',options_for_select(LANGUAGES,I18n.locale.to_s)end这有效。但是,目前用户无法通过URL更改
我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编
Ruby是完全面向对象的语言。在ruby中,一切都是对象,因此属于某个类。例如5属于Objectclass1.9.3p194:001>5.class=>Fixnum1.9.3p194:002>5.class.superclass=>Integer1.9.3p194:003>5.class.superclass.superclass=>Numeric1.9.3p194:005>5.class.superclass.superclass.superclass=>Object1.9.3p194:006>5.class.superclass.superclass.superclass.su