Verilog CRC

Verilog CRC
Verilog CRC

?网页

?图片

?视频

?音乐

?搜吧

?问问

?博客

?新闻

?更多?

?登录

?帮助|

?提意见

?问问首页

?问题库

?问问之星|

?问问团队

全部问题 >教育/科学>学习帮助>问题页

【征集】回首2009,网罗问问的趣味提问和答案!

已关闭问题

verilog HDL 的CRC校验程序,谁能给我写出注释,解释算法?

150

[ 标签:crc 校验,hdl,crc ]

module crc(crc_reg,crc,d,calc,init,d_valid,clk,reset);

output[15:0] crc_reg;

output[7:0] crc;

input[7:0] d;

input calc;

input init;

input d_valid;

input clk;

input reset;

reg[15:0] crc_reg;

reg[7:0] crc;

wire[15:0] next_crc;

always @(posedge clk or posedge reset) begin

if (reset)

begin

crc_reg <= 16'h0000;

crc <= 8'h00;

end

else if (init)

begin

crc_reg <= 16'h0000;

crc <= 8'h00;

end

else if (calc & d_valid)

begin

crc_reg <= next_crc;

crc <= ~{next_crc[8], next_crc[9], next_crc[10], next_crc[11],

next_crc[12], next_crc[13], next_crc[14], next_crc[15]};

end

else if (~calc & d_valid)

begin

crc_reg <= {crc_reg[7:0], 8'h00};

crc <= ~{crc_reg[0], crc_reg[1], crc_reg[2], crc_reg[3],

crc_reg[4], crc_reg[5], crc_reg[6], crc_reg[7]};

end

end

assign next_crc[0] = crc_reg[12] ^ d[7] ^ crc_reg[8] ^ d[3];

assign next_crc[1] = crc_reg[13] ^ d[6] ^ d[2] ^ crc_reg[9];

assign next_crc[2] = d[5] ^ crc_reg[14] ^ d[1] ^ crc_reg[10];

assign next_crc[3] =d[4] ^ crc_reg[15] ^ d[0] ^ crc_reg[11];

assign next_crc[4] = crc_reg[12] ^ d[3];

assign next_crc[5] = crc_reg[12]^crc_reg[13]^d[7]^crc_reg[8]^d[2]^d[3];

assign next_crc[6] = crc_reg[13] ^ d[6] ^ crc_reg[14] ^ d[1] ^ d[2] ^ crc_reg[9];

assign next_crc[7] = d[5] ^ crc_reg[14] ^ crc_reg[15] ^ d[0] ^ d[1] ^ crc_reg[10];

assign next_crc[8] = d[4] ^ crc_reg[15] ^ d[0] ^ crc_reg[0] ^ crc_reg[11];

assign next_crc[9] = crc_reg[12] ^ crc_reg[1] ^ d[3];

assign next_crc[10] = crc_reg[13] ^ d[2] ^ crc_reg[2];

assign next_crc[11] = crc_reg[3] ^ crc_reg[14] ^ d[1];

assign next_crc[12] = crc_reg[12] ^ crc_reg[4] ^ d[7] ^ crc_reg[15] ^ d[0] ^ crc_reg[8] ^ d[3];

assign next_crc[13] = crc_reg[13] ^ d[6] ^ crc_reg[5] ^ d[2] ^ crc_reg[9];

assign next_crc[14] = d[5] ^ crc_reg[14] ^ crc_reg[6] ^ d[1] ^ crc_reg[10];

assign next_crc[15] = d[4] ^ crc_reg[15] ^ d[0] ^ crc_reg[7] ^ crc_re

问题补充 2007-11-29 15:48

谢谢您抽时间回答我的问题。我刚接触verilog ,还不清楚如何入门。你能再

跟我解释一下以下两个问题吗?回答清楚就给您分数。

(1)calc 的作用

(2)assign next_crc[0]

assign next_crc[1]

。。。。

assign next_crc[15] 这一排公式改怎么理解,有什么规律呀?

谢谢了

Ago/cy回答:1 人气:14 提问时间:2007-11-27 21:16

答案

module crc(crc_reg,crc,d,calc,init,d_valid,clk,reset);//定義端口

//以下定義輸入輸出類型及位寬

output[15:0] crc_reg;

output[7:0] crc;

input[7:0] d;

input calc;

input init;

input d_valid;

input clk;

input reset;

//內部寄存器定義及位寬

reg[15:0] crc_reg;

reg[7:0] crc;

//線型定義及位寬

wire[15:0] next_crc;

always @(posedge clk or posedge reset) begin

//異步清零

if (reset)

begin

crc_reg <= 16'h0000;

crc <= 8'h00;

end

//同步清零

else if (init)

begin

crc_reg <= 16'h0000;

crc <= 8'h00;

end

//下面即是算法的實現,不清楚自己上網查一下CRC的算法.

else if (calc & d_valid)

begin

crc_reg <= next_crc;

crc <= ~{next_crc[8], next_crc[9], next_crc[10], next_crc[11], next_crc[12], next_crc[13], next_crc[14], next_crc[15]};

end

else if (~calc & d_valid)

begin

crc_reg <= {crc_reg[7:0], 8'h00};

crc <= ~{crc_reg[0], crc_reg[1], crc_reg[2], crc_reg[3],

crc_reg[4], crc_reg[5], crc_reg[6], crc_reg[7]};

end

end

assign next_crc[0] = crc_reg[12] ^ d[7] ^ crc_reg[8] ^ d[3]; assign next_crc[1] = crc_reg[13] ^ d[6] ^ d[2] ^ crc_reg[9]; assign next_crc[2] = d[5] ^ crc_reg[14] ^ d[1] ^ crc_reg[10];

assign next_crc[3] =d[4] ^ crc_reg[15] ^ d[0] ^ crc_reg[11];

assign next_crc[4] = crc_reg[12] ^ d[3];

assign next_crc[5] = crc_reg[12]^crc_reg[13]^d[7]^crc_reg[8]^d[2]^d[3];

assign next_crc[6] = crc_reg[13] ^ d[6] ^ crc_reg[14] ^ d[1] ^ d[2] ^ crc_reg[9];

assign next_crc[7] = d[5] ^ crc_reg[14] ^ crc_reg[15] ^ d[0] ^ d[1] ^ crc_reg[10];

assign next_crc[8] = d[4] ^ crc_reg[15] ^ d[0] ^ crc_reg[0] ^ crc_reg[11]; assign next_crc[9] = crc_reg[12] ^ crc_reg[1] ^ d[3];

assign next_crc[10] = crc_reg[13] ^ d[2] ^ crc_reg[2];

assign next_crc[11] = crc_reg[3] ^ crc_reg[14] ^ d[1];

assign next_crc[12] = crc_reg[12] ^ crc_reg[4] ^ d[7] ^ crc_reg[15] ^ d[0] ^ crc_reg[8] ^ d[3];

assign next_crc[13] = crc_reg[13] ^ d[6] ^ crc_reg[5] ^ d[2] ^ crc_reg[9]; assign next_crc[14] = d[5] ^ crc_reg[14] ^ crc_reg[6] ^ d[1] ^ crc_reg[10];

assign next_crc[15] = d[4] ^ crc_reg[15] ^ d[0] ^ crc_reg[7] ^ crc_re 代做FPGA项目 2007-11-29 15:36

相关内容

??Verilog HDL怎样才算学到实际应用?2个回答

??Verilog HDL和VHDL的区别?2个回答

??Verilog HDL的一个程序是什么意思?1个回答

??这个Verilog HDL的程序是什么意思?3个回答

??Verilog HDL的另一个程序是什么意思?1个回答

?crc校验

?crc失败文件被破坏

?解压文件crc失败

?crc错误

?qq炫舞解压crc失败

?crc失败

?crc算法

?crc校验错误

在线专家

?

凉风、等待…

o精选回答:

o?问个奥数问题,急急急急急

o?数学题呀,,,

o?长方形ABCD中,AB=8CM,BC=4C…

o?有关创新比赛的具体比赛有哪些?

o?六年级数学解决问题

热门搜索

?节日综合症

?冬奥会

?元宵节

?米兰时装周

?虎年

?年终奖

?2010两会时间

?世博会

?裸官

?苏乞儿

?刘谦魔术

?房价走势

?倒春寒

?烫发的危害

?奥斯卡

更多>>热门专题

闻所未闻的十…

世界上最高的…

??中国五大淡水湖

??世界上最长的三条河

??九招防电脑辐射

??计算机硬件的五大基本组成部分

??揭秘09年十大票房炮灰电影

精华知识

??文言文算不算古诗文??

??学开车要具备哪些条件?

??诸葛亮为何不取代刘备的皇位?

??数学方程中的真根是什么意思?

??哪个成语是形容有实力但是谦虚低调…

问问活动

2009年3亿用户都在问什么?快来看看!

十大娱乐事件、十大网络用语、人物影视top10......所有你想知道的,尽在问问!

Copyright ? 1998 – 2010 Tencent. All Rights Reserved.

华为verilog培训教程

共41页 资源类别: HDL 语言 内部公开 1.0 密级 版本文档编号 文档中心 Verilog HDL 入门教程 (仅供内部使用) yyyy/mm/dd 日期: 批准: 日期:中研基础 批准:2004.8.3 日期:中研基础拟制:版权所有 不得复制

修订记录 初稿完成 1.00 2004.8.3作者 描述 修订版本 日期 绝密请输入文档编号 Verilog HDL 入门教程 2004-08-16第2页,共41页 版权所有,侵权必究

目 录 28 5 结构建模..............................................................274.8 case 语句..........................................................254.7 条件语句..........................................................254.6.6 连接运算符....................................................254.6.5 条件运算符....................................................244.6.4 按位逻辑运算符................................................234.6.3 逻辑运算符....................................................224.6.2 关系运算符....................................................214.6.1 算术运算符. (21) 4.6 运算符和表达式.....................................................204.5.2 寄存器类型 ...................................................204.5.1 线网类型 (20) 4.5 数据类型..........................................................184.4.2 常量.........................................................184.4.1 值集合. (18) 4.4 数字值集合........................................................184.3 格式.............................................................174.2 注释.............................................................174.1.3 书写规范建议..................................................174.1.2 关键词.......................................................174.1.1 定义 (17) 4.1 标识符 (17) 4 Verilog HDL 基本语法 (16) 3.3.4 混合设计描述..................................................153.3.3 行为描述方式..................................................143.3.2 数据流描述方式................................................123.3.1 结构化描述方式 (12) 3.3 三种建模方式......................................................113.2 时延.............................................................113.1.3 模块语法......................................................103.1.2 模块的结构....................................................93.1.1 简单事例. (9) 3.1 模块 (9) 3 Verilog HDL 建模概述 (7) 2.4.2 能力..........................................................72.4.1 历史. (7) 2.4 Verilog HDL 简介.....................................................62.3 设计方法学.........................................................62.2 硬件描述语言.......................................................52.1 数字电路设计方法. (5) 2 HDL 设计方法学简介......................................................51 前言...................................................................绝密 请输入文档编号 Verilog HDL 入门教程 2004-08-16 第3页,共41页 版权所有,侵权必究

Verilog HDL 综合实用教程

《Verilog HDL 综合实用教程》读书笔记——锁存器、触发器
加入收藏
2007-08-29 00:23
?
转发分享 人人网 开心网 新浪微博 搜狐博客 百度收藏 谷歌收藏 qq 书签 豆瓣 淘江湖 Facebook Twitter Digg Yahoo!Bookmarks
锁存器:
推导出锁存器的一般规则是,如果变量未在 always 语句所有可能的执行过程中被赋值, 就推导出锁存器。如果变量在 if 的所有分支中都被赋值则综合成组合逻辑。 case、casez、casex 可转成 if、else 形式。当 case 中不是所有情况都列举出或使用 default 语句时、在 case 语句前对 case 中赋值对象赋初值也可避免综合出锁存器。若不 是以上各种情况且须综合成组合逻辑可以使用综合命令,如下: 例: always @ (Toggle) case (Toggle) //synthesis full_case 2'b01: NextToggle = 2'b10; 2'b10: NextToggle = 2'b01; end case end module 上例中的//synthesis full_case 是综合命令,告知综合工具 case 中已是全部列举可能的 情况,这样综合后无锁存器。(正常的 case 语句是有优先级的,先出现的优先级最高,若 case 中各分支是互斥时,综合成译码逻辑。当使用 casex 时用综合命令//synthesis parallel-case 告知综合工具该 casex 是互斥的)。 触发器: 沿控制的用触发器,且沿控制的赋值用非阻塞的方式“Zee<=A;”。 当 always 中是沿敏感时,此 always 中有 if……else if……且在这些 if……else if 中有多 于 1 个对同一变量赋值时,这个变量很可能被综合成有异步置位或清零的触发器。 例: always @ (negedge Reset or negedge Set or negedge CLKA) if (!Reset) NextState<=12; else if (!Set) NextState<=5;

VerilogHDL的入门学习(可编辑修改word版)

先记下来: 1、不使用初始化语句; 2、不使用延时语句; 3、不使用循环次数不确定的语句,如:forever,while 等; 4、尽量采用同步方式设计电路; 5、尽量采用行为语句完成设计; 6、always 过程块描述组合逻辑,应在敏感信号表中列出所有的输入信号; 7、所有的内部寄存器都应该可以被复位; 8、用户自定义原件(UDP 元件)是不能被综合的。 一:基本 Verilog 中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器,还有可能被优化掉。 二:verilog 语句结构到门级的映射 1、连续性赋值:assign 连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因此连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign 语句中的延时综合时都将忽视。 2、过程性赋值: 过程性赋值只出现在always 语句中。 阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。 建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。 过程性赋值的赋值对象有可能综合成wire, latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。 过程性赋值语句中的任何延时在综合时都将忽略。 建议同一个变量单一地使用阻塞或者非阻塞赋值。 3、逻辑操作符: 逻辑操作符对应于硬件中已有的逻辑门,一些操作符不能被综合:===、!==。 4、算术操作符: Verilog 中将reg 视为无符号数,而integer 视为有符号数。因此,进行有符号操

作时使用integer,使用无符号操作时使用reg。 5、进位: 通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:Wire [3:0] A,B; Wire [4:0] C; Assign C=A+B; C 的最高位用来存放进位。 6、关系运算符: 关系运算符:<,>,<=,>= 和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net 还是integer。 7、相等运算符:==,!= 注意:===和!==是不可综合的。 可以进行有符号或无符号操作,取决于数据类型 8、移位运算符: 左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。 9、部分选择: 部分选择索引必须是常量。 10、BIT 选择: BIT 选择中的索引可以用变量,这样将综合成多路(复用)器。 11、敏感表:Always 过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。 12、IF: 如果变量没有在IF 语句的每个分支中进行赋值,将会产生latch。如果IF 语句中产生了latch,则IF 的条件中最好不要用到算术操作。Case 语句类似。Case 的条款可以是变量。 如果一个变量在同一个IF 条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。 13、循环: 只有for-loop 语句是可以综合的。

CPLD入门教程

目录 前言 (2) 第一章 MAX+plusII 软件和license的获得 (6) 第二章 MAX+plusII 软件的安装和license及驱动的设置 2.1 MAX+plusII 软件的安装 (7) 2.2 MAX+plusII 软件的license设置 (8) 2.3 MAX+plusII 软件的驱动设置 (12) 第三章用VHDL语言设计三人表决器 3.1打开MAX+plusII (22) 3.2新建VHDL文档 (23) 3.3输入设计文件 (24) 3.4保存文件 (25) 3.5检查编译 (27) 3.6创建symbol (32) 3.7波形防真 (33) 3.8下载验证 (40) 第四章用原理图输入的方式设计三人表决器 (47) 第五章用verilog-HDL语言设计三人表决器 (51)

前言 编写本入门教程(V1.2)的目点是为了让FPGA/CPLD初学者快速地入门。该教程的特点是通过基本概念讲解和实际的例子来让初学者迅速了解FPGA/CPLD。该教程是共享文件,可以复制、下载、转载,如果转载该文章请注明出处:https://www.360docs.net/doc/3112048434.html,;该教程未经许可,不得用于商业用途。 FPGA/CPLD是电子设计领域中最具活力和发展前途的一项技术,它的影响丝毫不亚于70年代单片机的发明和使用。 FPGA/CPLD的基本知识: 1.什么是FPGA/CPLD FPGA (Field Programmable Gate Array)是现场可编程门阵列,CPLD是复杂的可编程逻辑器件(Complex Programmable Logic Device)的简称,不同厂家有不同的称呼,Xilinx把SRAM工艺,要外挂配置用的EEPROM的PLD叫FPGA,把Flash工艺(类似EEPROM工艺),乘积项结构的PLD叫CPLD; Altera把自己的PLD产品MAX系列(EEPROM工艺),FLEX/ACEX/APEX系列(SRAM工艺)都叫作CPLD,即复杂PLD(Complex PLD),由于FLEX/ACEX/APEX系列也是SRAM工艺,要外挂配置用的EPROM,用法和Xilinx的FPGA一样,所以很多人把Altera的FELX/ACEX/APEX系列产品也叫做FPGA. 但由于FPGA和CPLD功能基本相同,只是工艺和实现形式不同,所以初学者可以不要详细区分,我们可以统称为FPGA/CPLD。 2.FPGA/CPLD的用途:

(完整word版)Verilog-A30分钟快速入门教程

?Verilog-A 30分钟快速入门教程 进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS Language Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(out)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(out)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如: @(cross(V(sample) -2.0, +1.0)) //指sample的电压超过2.0时触发该事件,将会执行后面的语句,+1.0表示正向越过,-1.0则相反 ddt( expr ) //求导,如: I(n1,n2) <+ C * ddt(V(n1, n2)); //表示了一个电容 idt( expr ,[ ic [, assert [, abstol ]]] ) //积分,如: V(out) <+ gain * idt(V(in) ,0) + gain * V(in); //比例积分,式中的0表示积分的初值 transition( expr [, time_delay [, rise_time [, fall_time [, time_tol ]]]] ) //将expr的值delay一下并指定上升下降沿时间,相当于一个传输门

Verilog语言基础教程

Verilog HDL Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象 设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 =============================== 中文版Verilog HDL简明教程:第1章简介 Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 历史 Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模

Verilog-A 30分钟快速入门教程

?进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS L anguage Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog 基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的 简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(o ut)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(o ut)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如:

3.2.1 Verilog HDL程序入门[共2页]

║68 第3章 硬件描述语言Verilog HDL基础 3.2 Verilog HDL程序基本结构 Verilog HDL是一种用于数字逻辑电路设计的语言。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。Verilog HDL既是一种行为描述的语言,也是一种结构描述的语言。也就是说,既可以用电路的功能描述,也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下5种。 ?系统级(system):用高级语言结构实现设计模块的外部性能的模型。 ?算法级(algorithm):用高级语言结构实现设计算法的模型。 ?RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。 ?门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。 ?开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。 一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。 Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下功能。 ?可描述顺序执行或并行执行的程序结构。 ?用延迟表达式或事件表达式来明确地控制过程的启动时间。 ?通过命名的事件来触发其他过程里的激活行为或停止行为。 ?提供了条件、if-else、case、循环程序结构。 ?提供了可带参数且非零延续时间的任务(task)程序结构。 ?提供了可定义新的操作符的函数结构(function)。 ?提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。 ? Verilog HDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。因其结构化的特点又使它具有以下功能。 —提供了完整的一套组合型原语(primitive); —提供了双向通路和电阻器件的原语; —可建立MOS器件的电荷分享和电荷衰减动态模型。 Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。 Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习Verilog HDL并不困难,只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面将介绍Verilog

Verilog语法入门,初学者必看

Verilog的词法约定 1Verilog是大小写相关的,其中的关键字全部为小写。 2空白符由空格、制表符、和换行符组成。 3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/*” 开始,以“*/”结束。多行注释不允许嵌套 4操作符有三种:单目操作符、双目操作符和三目操作符。 5数字声明 Verilog中有两种数字生命:指明位数的数字和不指明位数的数字 指明位数的数字表示形式: Size用来指明数字位宽度,只能用十进制整数表示 Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H) 例如 4’b1111 //4位2进制数 12’h3ac //12位16进制数 不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。 ‘o21 //32位八进制数 X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。 12’h12X //这是一个12位16进制数,其中低四位不确定 负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。 -6’d3 //一个6位的用二进制补码形式存储的十进制数3,表示负数 -6’sd3 //一个6位的带符号算数运算的负数 下划线符号和问号: 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉 问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。 12’B1111_0011_1110 // 增强可读性 4’b10?? //相当于4’b10zz 6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。 “Hello Verilog world” //是一个字符串 7标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。 标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。 reg value; //reg是关键字;value是标识符

QuartusⅡ8.1入门教程(一个Verilog程序的编译和功能仿真)

Quartus Ⅱ8.1入门教程 (一个Verilog 程序的编译和功能仿真) Quartus Ⅱ 是Altera 公司推出的专业EDA 工具,支持原理图输入、硬件描述语言的输入等多种输入方式。硬件描述语言的输入方式是利用类似高级程序的设计方法来设计出数字系统。接下来我们对这种智能的EDA 工具进行初步的学习。使大家以后的数字系统设计更加容易上手。 第一步:打开软件 ● 快捷工具栏:提供设置(setting ),编译(compile )等快捷方式,方便用户使用,用户也可以在菜单栏的下拉菜单找到相应的选项。 ● 菜单栏:软件所有功能的控制选项都可以在其下拉菜单中找到。 ● 信息栏:编译或者综合整个过程的详细信息显示窗口,包括编译通过信息和报错信息。 快捷工具栏 菜单栏 工作区 资源管理窗口 任务管理窗口

注意以下命名要一致。 第二步:新建工程(file>new Project Wizard)1 工程名称: 2添加已有文件(没有已有文件的直接跳过next)所建工程的保存路径 工程名称顶层模块名(芯片级设计为实体名),要求与工程名称相同 如果有已经存在的文 件就在该过程中添加, 软件将直接将用户所 添加的文件添加到工 程中。

3 选择芯片型号(我们选择MAX3000A 系列下的EPM3256AQC208-10芯片) (注:如果不下载到开发板上进行测试,这一步可以不用设置) 4 选择仿真,综合工具(第一次实验全部利用quartus 做,三项都选None ,然后next ) 所选的芯片的系列型号 快速搜索所需的芯片 选择芯片

5 工程建立完成(点finish) 选择第三方综合工具,如果 使用Quartus内部综合工具 则选择none 选择第三方仿真工具,如果 使用Quartus内部仿真工具 则选择none 选择时序分析仪 工程建立完成,该窗口显示所建立工程所有的芯片,其他第三方EDA工具选择情况,以及模块名等等信息。

Verilog-A 30分钟快速入门教程

Verilog-A 30分钟快速入门教程 进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS Language Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(out)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(out)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如: @(cross(V(sample) -2.0, +1.0)) //指sample的电压超过2.0时触发该事件,将会执行后面的语句,+1.0表示正向越过,-1.0则相反 ddt( expr ) //求导,如: I(n1,n2) <+ C * ddt(V(n1, n2)); //表示了一个电容 idt( expr ,[ ic [, assert [, abstol ]]] ) //积分,如: V(out) <+ gain * idt(V(in) ,0) + gain * V(in); //比例积分,式中的0表示积分的初值 transition( expr [, time_delay [, rise_time [, fall_time [, time_tol ]]]] ) //将expr的值delay一下并指定上升下降沿时间,相当于一个传输门

VerilogHDL语法基础

Verilog HDL语法基础(1) Verilog的词法约定 1Verilog是大小写相关的,其中的关键字全部为小写。 2空白符由空格、制表符、和换行符组成。 3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/ *”开始,以“*/”结束。多行注释不允许嵌套 4操作符有三种:单目操作符、双目操作符和三目操作符。 5数字声明 Verilog中有两种数字生命:指明位数的数字和不指明位数的数字 指明位数的数字表示形式: Size用来指明数字位宽度,只能用十进制整数表示 Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H) 例如 4’b1111 //4位2进制数 12’h3ac //12位16进制数 不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。 ‘o21//32位八进制数 X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。 12’h12X //这是一个12位16进制数,其中低四位不确定 负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。 -6’d3//一个6位的用二进制补码形式存储的十进制数3,表示负数 -6’sd3//一个6位的带符号算数运算的负数 下划线符号和问号: 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉 问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。 12’B1111_0011_1110// 增强可读性 4’b10??//相当于4’b10zz 6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。 “Hello Verilog world”//是一个字符串 7标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。 标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。

verilog入门经验(一) always块使用

1. 信号的产生及always块使用注意事项 1.1 不要在不同的always块内为同一个变量赋值。即某个信号出现在<=或=左边时,只能在一个always块内。(详细解释见 Verilog HDL与数字电路设计 P38) 所以注意,在产生一个信号时,所有产生该信号的条件都应放在一个always块内考虑。 1.2 不要在同一个always块内同时使用阻塞赋值(=)和非阻塞赋值(<=)。 1.3 使用always块描述组合逻辑时使用阻塞赋值(=),在使用always块描述时序逻辑时使用非阻塞赋值(<=)。简单理解可以是,在电平敏感的always块内使用阻塞赋值,在边沿敏感的always块内使用非阻塞赋值。 1.4 任何在always块内被赋值的变量都必须是寄存器型(reg)。即<=或=左边的信号,必须是reg型,<=或=右边的信号可以是reg型也可以是wire型。 另,端口声明中被声明为input或inout型的端口,只能被定义为线网型(wire);被声明为output型的端口,则可以被定义为线网型(wire)或者寄存器型(reg)。如果不定义,则默认为线网型(wire)。 1.5 always的敏感列表中可以同时包括多个电平敏感事件,也可以同时包括多个边沿敏感事件,但不能同时有电平和边沿敏感事件。另外,敏感列表中,同时包括一

个信号的上升沿敏感事件和下降沿敏感事件也是不允许的,因为这两个事件可以合并为一个电平事件。 2. 总clk的使用 always敏感列表里的边沿触发事件,就是一个clk信号,所以在制定ucf时,边沿触发事件信号都要被定义在clk IO端口上,有时随意分配的clk IO端口在Implement 时也会出错。需要到ucf中用 NET "polin" CLOCK_DEDICATED_ROUTE = FALSE; //polin为边沿触发事件信号 语句来规避错误。 所以在一个程序中,要尽量使用主clk作为always块的边沿触发信号。如果有些变量要通过某个信号的边沿触发来产生,那尽量将这个边沿触发信号做成一个判断条件,然后在产生变量时仍用主clk触发。 例程:要得到LCD大尺寸屏POL信号的2分频、8分频、16分频...,在控制板上拨动开关设置不同的状态,输出polout切换到不同的pol输入的分频信号。 思路,定义一个counter(cnt_pol)对输入pol信号进行计数,则cnt_pol的bit0位与pol输入信号一致, cnt_pol的bit1位为pol信号的2分频,bit2位为pol的4分频,bit3位为pol的8分频,bit4位为pol的16分频...

零基础学FPGA开发入门资料

零基础学FPGA开发入门资料 视频教程系列 QQ:903853270 下载地址: https://www.360docs.net/doc/3112048434.html,/item.htm?spm=a1z10.1.137712-76083467.2.HvLL9C&id=16903050536 目录简介 fpga 入门级资料教程verilog资料本部分主要由5部分教程构成,分别是《VerilogHDL 扫盲文》、《VerilogHDL那些事儿_建模篇》、 《Verilog_HDL_那些事儿_时序篇》、《Verilog_HDL_ 那些事儿_整合的概念》《Verilog 最后的私私细语》。 5部教程由浅入深,细细讲解。即便是你没有任何 fpga基础,从没有接触过fpga,你也能看懂。书中 还包含有大量的实验,从最简单的流水灯开始,一 步步教你走进fpga的世界。在开始本部分学习之前, 推荐先阅读夏宇闻教授编著的《数字逻辑设计》,可 以快速的帮助你入门。此书也收录在本资料目录下。modelsim资料本部分包括由《modelsim视频教程+源文件》及 《modelsim入门视频》两部分。在学习fpga的时候, 会用到fpga强大的仿真工具modelsim,本部分内容 详细的讲解了modelsim软件与quartus软件的联合 仿真,以及单独使用modelsim的时候,如何仿真。 每集仿真视频均含有源文件,方便大家在联系的时 候,调用验证。在学习verilog的时候,可以结合本 部分资料练习仿真,以判断自己的程序是否有误。fpga开发流程快速入门视频本部分视频教程详细介绍了fpga的开发流程,在实 际进行fpga开发学习的时候,建议先对本部分视频 进行学习。 夏宇闻verilog视频本部分视频教程由著名教授夏宇闻亲自讲解,在学 习本部分视频的时候,建议与夏教授编著的《数字 逻辑设计》这本书一起学习。便于理解verilog语言。周立功verilog视频本部分视频由周立功讲解verilog视频教程,在学习 verilog语言的时候,建议学习本部分视频教程。 特权FPGA视频教程(35集全)本部分视频内容由特权同学讲解,每集均以一个实 验为基础,学习fpga的开发流程,verilog语言的解 读,modelsim仿真软件的使用,以及常见逻辑算法 的介绍等。这部分视频内容建议在学完verilog的基 础上观看。本部分对于学习fpga的过程帮助甚大, 一定要仔细理解。

Verilog语法基础讲解之参数化设计

Verilog语法基础讲解之参数化设计 在Verilog语法中,可以实现参数化设计。所谓参数化设计,就是在一个功能模块中,对于一个常量,其值在不同的应用场合需要设置为不同的置,则将此值在设计时使用parameter关键字声明,那么在上层模块例化使用该功能模块时,可以根据具体需求重新配置该常量的值,从而实现不同应用场合对对应常量的灵活调整。 以下为使用Verilog设计的一个控制LED闪烁灯的模块代码: 01module counter(Clk,Rst_n,led); 02 03input Clk;//系统时钟,50M 04input Rst_n;//全局复位,低电平复位 05 06outputreg led;//led输出 07 08reg[24:0]cnt;//定义计数器寄存器 09 10//计数器计数进程 11always@(posedge Clk ornegedge Rst_n) 12if(Rst_n==1'b0) 13cnt<=25'd0; 14elseif(cnt==25'd24_999_999) 15cnt<=25'd0; 16else 17cnt<=cnt+1'b1; 18 19//led输出控制进程 20always@(posedge Clk ornegedge Rst_n) 21if(Rst_n==1'b0) 22led <=1'b1; 23elseif(cnt==25'd24_999_999) 24led <=~led; 25else 26led <= led; 27 28endmodule 在此设计中,定义了一个名为cnt的计数器,该cnt在输入时钟”Clk”的驱动下,每个时钟的上升沿执行一次自加操作,当计数到达24999999后,计数器清零,同时led驱动状态发生翻转。由于系统时钟为50M,即周期为20ns,cnt每计数25000000次,即500ms,驱动led状

ISE快速入门详细教程verilog_青山紫木原创

Xilinx ISE 快速入门详细教程1 ——青山紫木 自己学习FPGA有些日子了,现在回过头来看看自己走过的路,有太多的曲折。读过网络上一些文档,得到了很大的帮助。现在自己入门了,就希望帮助别人。为了帮助广大的FPGA爱好者们更快入门,于是自己写了这篇《Xilinx ISE 快速入门详细教程》。既是一个总结,也是一个激励,在帮助他人的同时,更加提升自己的实力。 本文采用实例的方法介绍入门方法,相信只要跟着本文走,是一定可以快速掌握ISE的基本功能的。当然,这篇文章只是基础。当掌握了本文的内容后,还要多加练习,之后,还要读更多的文档以了解ISE 的更加高级的功能。 注意:本文是通过一个简单的工程实例——counter_bit8也就是一个8bit计数器,这个例子的编译、综合、实现整个过程来说明入门过程的。编程,配置(下载)用的是另外一个工程实例——trychip。我采用的是ISE的14.2版本,用的是verilog hdl 硬件描述语言。假设你已经安装好了ISE 14.2. 好了,废话少说,LET’ S GO! 一、运行ISE。

双击图标(你懂的)打开界面如下图图一所示: 图一 打开后界面 观察图一,可以看见有一个小的对话框“tip of the day.”这是程序自带的,用于给用户提供一些有关verilog 或ISE的一些信息,关闭即可。 二、新建工程。 如图二红色区域所示,点击工具栏中file,选择 New projiect. 图二 新建工程1 之后,会弹出图三所示对话框:

图三 新建工程2 在图三所示的Name一栏中填入工程名,用英文或阿拉伯数字。在Location一栏中,选择工程的路径,路径中不要有中文。其他都不用管。我们这里工程名取为counter_bit8,路径自己定义。 完后,点击Next.会弹出如图四所示对话框:

相关文档
最新文档