有一段程序不懂,求详解啊!verilog的

有一段程序不懂,求详解啊!verilog的,第1张

module pwm(sys_clk, led,led1);

input sys_clk; // 系统时钟

output led; // 输出 PWM信号

output reg led1; // 输出寄存器位 led1

reg PWM; // 定义寄存器位 PWM

reg [25:0] count; // 定义26位计数器 count

//LED亮度分为254个级别

reg [7:0] light; // 定义8位寄存器 它的值 0000_0000 到 1111_1111共255个

// 估计 0000_0000 代表无亮度,所以亮度分254个级别

//计数器

always@(posedge sys_clk)

count<=count+1; // 每经过一个系统时钟上升沿,26位计数器count加一

//级别跳变,跳变速度可由count[n]调节

always@(posedge count[16])begin // 计数器count的第16位 作为时钟上升沿,即count[15:0]

// 从16'h0000计数到 16'hffff共 65536个系统时钟脉冲

light<=light-1; // 每经过一个上升沿(65536个系统时钟脉冲), // 8位亮度寄存器减一,即亮度降一个级别

led1<=~led1; // 同时,led1寄存器位的值翻转一次

end

//PWM频率:clk从0计到17'h1FFFF为一个周期

always@(sys_clk)

if(count[16:0] < {light,9'b0}) // 如果计数器count[16:9] 小于 light亮度值,PWM 为0

PWM<=0;

else // 计数器count[16:9] 大于 light亮度值,PWM 为1

PWM<=1;

assign led=PWM; // 将PWM值输出给 led 端口

endmodule

// led1是每次发生亮度级别跳变时,改变一次状态,点亮或者熄灭

// led是 PWM输出,亮度渐变的过程,由亮变暗,由暗变亮

// 级别跳变可以通过 count[n]中n的数值来改变,n 越大,渐变越慢

1 设计规划阶段(Design Specification)

一个Design Specification的建立有赖于市场人员对所设计芯片的大致功能和成本提出要求,市场人员和工程师互相合作提出芯片的功能

2 架构与设计划分阶段(Architecture and Design Partition)

拟订开发部门的工程规格(Engineering spec),必须决定系统的架构

3 编程有测试环境阶段

完成基本的设计和仿真。在初期,设计人员就应该考虑个信号的走线问题!在高速电路和多信号设计中,必须考虑到将产生的串扰(Cross Talk)。

4 集成和仿真阶段(Integration and Simulation)

l 文件对比验证:预计输出(Expected Value)文件和电路真正的输出结果(Exact Result)的对比。

l 穿越整个CHIP:测试向量(Test Vector)要求能穿越整个CHIP到达外部。

l 合并测试向量:合理的合并测试向量并适度地打散激励(EXCIATION)

l 共享测试环境:在各模块已做整合的前提之下,各模块应该共享测试环境。

l 对模拟器件的处理:需要针对模拟器件做特殊的仿真。

5 综合阶段(Synthesis)

综合阶段对程序代码的逻辑做部分简化,并从标准单元中选取合适的单元组合成最佳的实际电路。而这个原则就是约束(CONSTRAINT FILE),这个文件决定了最后CHIP的SIZE和功能的实现。基本上综合就是Timing与Area之间求得一个平衡。

这个时候最好完成功耗分析(POWER ANALYSIS)

6 布局前仿真

待测对象:由逻辑门(GATE-LEVEL)所组成的网表文件(NETLIST)。这个阶段的仿真结果必须和INTEGRATION AND SIMULAION阶段一致。

特点:这个阶段仿真时间一般比较长,利用 *** 作系统所提供的工具程序来做自动化的批处理就显得重要,例如UNIX提供的MAKE等工具程序

7 布局与布线阶段(AUTO PLACEMENT AND ROUTE ,AP&R)

利用netlist和SYNTHESIS产生的CONSTRAINT FILE文件

目的:将实体的单元(CELL)组合成芯片上真正的电路。

l FloorPlan:决定管脚的排列和IP,MACRO等在IC内部摆放的位置。

l Placement:布局,将元件摆到适当的位置。何谓合适的位置,就要根据具体电路的功能,工程师的经验和不断地对结果的分析了。

l CTS(Clock Tree Synthesis):将时序器件所需要的时钟所需要的缓冲器放在合适的位置,避免产生CLOCK SKEW。

l ROUTE:将各元件(包括时钟缓冲器)正确地走线。

l SDF(Standard Delay Format):此文件的目的在于描述确切地元件及布线时间延迟,以作为前端设计者再仿真的延迟计算,或作为静态时序分析之用。这些Timing 数值的前提是必须将线路的负载的R,C值提取出来。

8 布局后仿真/静态时序分析/形式验证阶段(Post-Sim/STA/Formal Verification)

l Post-sim: 和前仿真必须的结果必须完全相同,但是因为有了更精确的TIMING数据,所以花费更大量的时间

l STA:仿真本身可分为动态和静态

动态性:从仿真的起始至结束有许多个时间(EVENT)发生来校验其功能。耗时长

静态时序分析:它并不管其待分析电路的功能如何,只要给定Constraint,静态时序分析就会分析电路结构,检查所有时序上不满足的地方。

l Formal Verification:

9DRC/LVS检查阶段

DRC(Design Rule Check):针对最后的LAYOUT结果做检查,以校验其是否违反元件本身的性能限制。

LVS(Layout VS Schematics):针对电路图和LAYOUT图做一致性验证。

10Design sign-off阶段

即掩膜生产之用,就是一般所称的Tape-Out

11手动修正(Engineering Change Order,ECO)

如果最后阶段发现了BUG,如果不大的话,那么如果从头改起将十分耗时,比较经济的做法是以手动的方式对电路进行修改,或者对布局修改。

因为手动修改非常容易出错,所以需要非常深厚的基本电路知识和经验!

如果已经TAPE-OUT才发现设计上的错误,则最后的补救只能在金属层的掩膜上修改

好像之前看过这个题目,代码如下

module adder(

input a,b,c,d,

output [3:0] x,

output y

);

assign x = (a<<3)+(b<<2)+(c<<1)+d ;

assign y = ( (x >4'd4 ) && ( x<= 4'd15) ) 1'b1 :1'b0 ;

endmodule

绝对没问题的,如果有问题继续追问

本节主要内容:动态数组,队列,联合数组,数组基本 *** 作,结构体类型,枚举类型

一:动态数组

1:基础

在run-time才知道元素个数,在compile-time不知道,可以在仿真的时候再确定元素个数

2:表示

3:可将固定数组赋值给动态数组,要求是元素个数相同

二:队列(先进先出)

1:基础知识

可插入,删除,sort,search,push,pop,add,remove;可将固定数组或者动态数组赋给队列

2:表示

三:联合数组

1:基础知识

充分利用内存里的离散空间,不连续空间;

索引值可以为整型,字符型,一维数组

2:表示

3:示例

在内存中的存储

说明:标准数组存储时,所有的存储器都用到了;联合数组使用内存时,稀疏。

4: *** 作

遍历(foreach),first,next,prev,delete,exits

四:数组的 *** 作

1:算术运算

sum,product,and,or and xor

例如下面是sum举例:

说明:onsum返回on的位数,即一位,即值1(5个1相加取一位);将onsum赋给位宽为8bit的summ,则返回值5。

2:sort,rsort(反过来排序),reverse,shuffle(打乱排序),find_first,find_first_with_index,unique(得到元素不重复的数组)

3:sum的扩展用法

//dsum(x) with ((x>7) x); //9 9+88

五:总结

Fixed Arrays: 在compile time时知道size;连续内存存放,支持多维

Dynamic Arrays:run time时得到size;连续内存;

Queues Arrays:FIFO/Stack

Associative Arrays:离散数据内存,索引可以为数字或者字符串;用于hash

六:结构体

将变量放在一起,比如总线协议放在结构体里;默认是unpacked存放

1:示例

使用:Instruction_Wordaddress = 24'hF00000;

2:packed存放(加入packed关键字)

第一个数据放在内存的左侧。

七:枚举类型

1:表示

enum {red,greenblue} RGB //red = 0,green = 1,blue = 2

2:枚举值类型

显式指定枚举值 enum{one = 1, five = 5, ten = 10} state;

部分显式指定值

下面的代码我已经用modelsim仿真过了,没有问题。

module count(out,clk,rst); //源程序

input clk,rst;

output[3:0] out;

reg[3:0] out;

initial out=4'd0;

always @(posedge clk or negedge rst)

begin

if(!rst) out=4'd0;

else

begin

out=out+4'd1;

if(out==4'd1||out==4'd6||out==4'd8) out=out+4'd1;

if(out==4'd5) out=out+4'd2;

end

end

endmodule

`timescale 1ns/1ns //测试程序

`include "countv"

module count_tp;

reg clk,rst;

wire[3:0] out;

parameter DELY=100;

count mycount(out,clk,rst);

always #(DELY/2) clk=~clk;

initial

begin

clk=0;rst=1;

#(DELY5) rst=0;

#DELY rst=1;

#(DELY20) $finish;

end

initial $monitor($time,,,"clk=%d rst=%d out=%d",clk,rst,out);

endmodule

以上就是关于有一段程序不懂,求详解啊!verilog的全部的内容,包括:有一段程序不懂,求详解啊!verilog的、Verilog设计流程问题、verilog 程序 abcd都是四位二进制 如何实现 X=8A+4B+2C+D,当输入数4<X≤15时为1否则为0等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9524047.html

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

发表评论

登录后才能评论

评论列表(0条)

保存