如何在一个matlab 向量插值的每一位后插一个0 verilog

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
2012-Verilog试题A-集成10-一、 选择题
下载积分:500
内容提示:2012-Verilog试题A-集成10-一、 选择题
文档格式:PDF|
浏览次数:264|
上传日期: 02:38:57|
文档星级:
全文阅读已结束,如果下载本文需要使用
 500 积分
下载此文档
该用户还上传了这些文档
2012-Verilog试题A-集成10-一、 选择题
官方公共微信Verilog 1995 VS Verilog 2001 - T_shell - 为程序员服务
Verilog 1995 VS Verilog 2001 - T_shell
Verilog-1995 VS Verilog-2001
2001年3月IEEE正式批准了Verilog‐2001标准(IEEE),与Verilog‐1995相比主要有以下提高。
1、模块声明的扩展
Verilog‐2001允许将端口声明和数据类型声明放在同一条语句中,例子如下:
(2)Verilog‐2001中增加了ANSIC风格的输入输出端口声明,可以用于module,task和function。例子如下:
(3)对于含有parameter的module,例子如下:
2、带有初始化的寄存器类型变量声明
Verilog‐2001中允许在声明变量的同时对其进行初始化赋值,他是在initial语句中的0时刻开始执行。例子如下:
3、敏感表的改进
(1)逗号分开敏感列表
在敏感表中的变量可以用逗号“,”分开,当然,当然or也是可以的。例子如下:
always@(posedge clk,negedge rst)也是可以的。
(2)组合逻辑的电平敏感@*
//@(*) is also ok
“*”代表了逻辑块中每个被赋值的变量,例子如下:
4、有符号算数运算的扩展
(1)net型和reg型可以声明为带符号的变量
(2)函数的返回值可以是有符号数
(3)Literal integer numbers可以定义为有符号的
(4)增加算数右移左移(&&&,&&&)
操作符“&&&”和“&&&”。对于有符号数,执行算术移位操作时,将符号位填补移出的位。例子如下:
(5)增加系统函数$signed,$unsigned
用于在无符号和有符号数之间的转换
5、可变向量域的选择
[&starting_bit&+”:width]从起始位开始递增,位宽为width
[&starting_bit&‐”:width]从起始位开始递减,位宽为width
其中,起始位可以是变量,但位宽必须是整数。因此可以用可变域选择,用循环语句选取一个很长的向量所有位。
6、多维数组的建立
Verilog‐1995中只允许对reg,integer和time建立一维的数组,常用于RAM,ROM的建模。Verilog‐2001中可以对net和variable建立多维数组。
7、多维数组的赋值
Verilog‐1995不允许直接访问矩阵字的某一位或某几位,必须将整个矩阵字复制到另一个暂存变量中,从暂存中访问。
Verilog‐2001可以直接访问矩阵的某一维或某几位。
8、乘方运算符
增加乘方运算(power operate),运算符是**,如果其中有一个操作数是real类型的,返回值将是real类型。两个操作数都是integer类型,返回才是integer类型。
9、自动(可重入)任务和自动(递归)函数
(1)可重入任务
任务本质上是静态的,同时并发执行的多个任务共享存储区。当某个任务在模块中的多个地方被同时调用,则这两个任务对同一块地址空间进行操作,结果可能是错误的。Verilog‐2001中增加了关键字automatic,内存空间是动态分配的,使任务成为可重入的。
(2)递归函数
10、自动宽度扩展
Verilog‐1995中对于不指定位数的位宽超过32为的总线赋高阻时,只会对低32位赋值为高阻,高位将为0。
Verilog‐2001将高阻或不定态赋值给未指定位宽的信号时,可以自动扩展到整个位宽范围。
11、常数函数
Verilog语法规定必须使用数值或常数表达式来定义向量的位宽和阵列的规模。
Verilog‐1995中要求上述表达式必须为算数操作。
Verilog‐2001中可以使用函数,成为常数函数。他的数值在编译或详细描述中被确定。
12、增加了文件输入输出操作
Verilog‐1995中在文件的输入/输出操作方面功能非常有限,文件操作经常借助于Verilog PLI(编程语言接口),通过与C语言的文件输入/输出库的访问来处理。并且规定同时打开的I/O文件数不能多于31个。
Verilog‐2001增加了新的系统任务和函数,并且规定同时打开的文件数目为230个。
13、显式的参数重载
Verilog‐1995中参数重载有两种方法。一种是defparam语句显式的重新定义。第二种是在模块实体调用时使用#符号隐式的重新定义参数。
Verilog‐2001中增加了一种新的方法,成为显式参数重载。
14、generate语句
Verilog‐2001新增了语句“generate”,通过generate循环,可以产生一个对象(比如一个元件或一个模块等)的多个例化,为可变尺度的设计提供了方便。
generate语句一般在循环和条件语句中使用。Verilog‐2001增加了四个关键字generate、endgenerate、genvar和localparam,其中genvar是一个新的数据类型,用在generate循环中的标尺变量必须定义为genvar型数据。
15、register变为variable
自1998年的Verilog一来,register一直用来描述一种变量的类型,这常常给初学者带来困扰,误认为register和硬件中的寄存器一致。在Verilog‐2001参考手册中将register变为variable。
16、对条件编译的改进
Verilog‐1995中支持`ifdef、`else、`endif、`undef进行条件编译,Verilog‐2001中增加了`ifndef和`elseif
17、文件和行编译显示
Verilog需要不断的跟踪源代码的行号和文件名,可编程语言接口(PLII)可以取得并利用行号和源文件的信息,以标记运行是的错误。但如果Verilog代码经过其他工具的处理,源码的行号和文件名可能丢失。故在Verilog‐2001中增加了`line,用来标定源码的行号和文件名。
随着仿真器之外的其他工具把Verilog作为设计输入,这些工具需要Verilog语言能够加入跟指定工具有关的信息和命令。
Verilog没有定义标准的属性,属性的名字和数值由工具厂商或其他标准来定义。目前尚无指定的标准。
19、设计管理——Verilog配置
Verilog‐1995标准将设计管理工作交给软件来承担,但各仿真工具的设计管理方法各不相同,不利于设计的共享。为了更好地在设计人员之间共享Verilog设计,并且提高某个特定仿真的可重用性,Verilog‐‐2001标准增加了对设计内容的配置这部分内容。
增加关键字config、endconfig、design、instance、cell、use和liblist。
配置块位于模块定义之外,可以指定每一个Verilog模块的版本及其源代码的位置。Verilog程序设计从顶层模块开始执行,找到在顶层模块中实例化的模块,进而确定其源代码的位置,照此顺序,直到确定整个设计的源程序。
configcfg4
///给配置块命名
designrtlLib.top
///指定从哪里找到顶层模块
defaultliblistrtlLibgateL
///设置查找实例模块的默认顺序
instancetest.dut.a2liblistggateL
//明确指定模块实例使用哪一个库
20、系统任务和系统函数的扩展
Verilog‐2001增加了17个文件输入/输出任务:$fgetc、$ungetc、$fflush、$ferror、$fgets、$rewind、$swrite、$swriteb、$swriteo、$swriteh、$sformat、$sdf_annotate、$ffscanf、$sscanf、$fread、$ftell、$fseek。
增加了两个转换函数:$signed和$unsigned。
增加了命令行输入任务:$test$plusargs和$value$plusargs。
21、VCD文件的扩展
VCD文件用于存储选定的变量数值变化的信息,信息的记录由VCD系统任务来完成。
在Verilog‐1995标准中只有一种类型的VCD文件,即四状态类型,这种类型的VCD文件只记录变量在0、1、x和z状态之间的变化,而且不记录信号强度信息。而在Verilog‐2001标准中增加了一种扩展类型的VCD文件,能够记录变量在所有状态之间的转换,同时记录信号强度信息。
扩展型VCD系统任务$dumpports、$dumpportsoff、$dumpportson、$dumpportsall、$dumpportslimit、$dumpportsflush、$vcdclose
(1)提高了ASIC/FPGA应用的正确性
①检测脉冲的传播错误
②负脉冲检测
③新的时序约束检查
④负时序约束
⑤提高了对SDF(标准延时文件)的支持
(2)编程语言接口PLI方面有所改进
本文链接:
,转载请注明。
原文地址:, 感谢原作者分享。
您可能感兴趣的代码Verilog学习心得(转)
我的图书馆
Verilog学习心得(转)
& & & &因为Verilog是一种硬件描述语言,所以在写Verilog语言时,首先要有所要写的module在硬件上如何实现的概念,而不是去想编译器如何去解释这个module. 比如在决定是否使用reg定义时,要问问自己物理上是不是真正存在这个register, 如果是,它的clock是什么? D端是什么?Q端是什么?有没有清零和置位?同步还是异步?再比如上面讨论的三态输出问题,首先想到的应该是在register的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。同样,Verilog中没有“编译”的概念,而只有综合的概念。&
&&&&& 写硬件描述语言的目的是为了综合,所以说要想写的好就要对综合器有很深的了解,这样写出来的代码才有效率。&
&&&&& 曾经接触过motorola苏州设计中心的一位资深工程师,他忠告了一句:就是用verilog描述电路的时候,一定要清楚它实现的电路,很多人只顾学习verilog语言,而不熟悉它实现的电路,这是设计不出好的电路来的.
&&&&& 一般写verilog code时,对整个硬件的结构应该是很清楚了,最好有详细的电路图画出,时序问题等都应该考虑清楚了。可以看着图直接写code。&
&&&&&& 要知道,最初Verilog是为了实现仿真而发明的.不可综合的Verilog语句也是很重要的.因为在实际设计电路时,除了要实现一个可综合的module外,你还要知道它的外围电路是怎样的,以及我的这个电路与这些外围电路能否协调工作.这些外围电路就可以用不可综合的语句来实现而不必管它是如何实现的.因为它们可能已经实际存在了,我仅是用它来模拟的.所以,在写verilog的时候应该要先明确我是用它来仿真的还是综合的.&&&&
&&&&&& 要是用来综合的话,就必须要严格地使用可综合的语句,而且不同的写法可能产生的电路会有很大差别,这时就要懂一些verilog综合方法的知识.就像前面说的,脑子里要有一个硬件的概念.特别是当综合报错时,就要想一想我这种写法能不能用硬件来实现,verilog毕竟还不是C,很多写法是不可实现的.要是这个module仅是用来仿真的,就要灵活得多了,这时你大可不必太在意硬件实现.只要满足它的语法,实现你要的功能就行了.
&&&&& 有网友说关于#10 clk=~clk的问题,虽然这种语句是不可综合的,但是在做simulation和verification是常常用它在estbench中来产生一个clock信号。再比如常常用到的大容量memory, 一般是不会在片上实现的,这个时候也需要一个unsynthesizable module. mengxy所言切中肯罄。
&&&&& 我们设计的module的目的是为了可以综合出功能正确,符合标准的电路来。我想这是个反复的过程,就像我们在写design flow中总要注明前仿真,综合后的仿真,以及后仿真等。仿真是用来验证我们的设计的非常重要的手段。而verilog里那些看是无聊的语句这个时候就会发挥很大的作用。我想,用过verilog_xl的兄弟应该深有体会。verilog_xl里的操作,可以用verilog里的系统命令来完成。通过最近的应聘我也深有体会,很多公司看中你在写code时,是否考虑到timing,
architecture,DFT等,这也说明verilog中的任何语句都非常重要的。
&&&& 要写代码前必须对具体的硬件有一个比较清晰的概念但是想一次完成可综合代码就太夸张了,verilog的自顶向下设计方法就是从行为建模开始的,功能验证了以后再转向可综合模型.太在意与可综合令初期设计变得太累
&&&&& 很同意这种看法,在做逻辑结构设计时,综合的因素是要考虑的,但是有很多东西不能考虑的过于细致,就是在设计的时候不能过于紧卡时延,面积等因素,因为这样以来综合后优化的余量就会很小,反而不利与设计的优化,如果在时延和面积要求不是很紧张的情况下,其实代码写的行为级,利用综合工具进行优化也是一种方法。偶就听说有一家很有名的公司,非常相信综合工具的优化能力,从来不作综合后仿真的,hehe.当然,如果面积和时延的要求很高,最好还是把代码写的底层一点,调用库单元时,也要充分考虑其面积和时延的因素。
Verilog与C++的类比
1. Verilog中的module对应C++中的class。它们都可以实例化。例如可以写一个FullAdder module,表示全加器这种器件。&
module FullAdder(a, b, cin, sum, cout);
& input a, b,
& output sum, &
& assign {cout, sum} = a + b +
endmodule &
然后在执行8-bit补码加减运算的ALU module中实例化8个FullAdder,表示ALU用到了8个FullAdder。&
module ALU(a, b, result, cout, is_add);
& input[7:0]& a,
& input&&&&&& is_
& output[7:0]
& output&&&&&&&
& wire[7:0] b_not = ~b;
& wire[7:0] b_in = is_add ? b : b_
& wire[7:0]
& assign carry[0] = is_add ? 1'b0 : 1'b1;&
& // module 实例化
& // 8-bit ripple adder
& FullAdder fa0(a[0], b_in[0], carry[0], result[0], carry[1]);
& FullAdder fa1(a[1], b_in[1], carry[1], result[1], carry[2]);
& FullAdder fa2(a[2], b_in[2], carry[2], result[2], carry[3]);
& FullAdder fa3(a[3], b_in[3], carry[3], result[3], carry[4]);
& FullAdder fa4(a[4], b_in[4], carry[4], result[4], carry[5]);
& FullAdder fa5(a[5], b_in[5], carry[5], result[5], carry[6]);
& FullAdder fa6(a[6], b_in[6], carry[6], result[6], carry[7]);
& FullAdder fa7(a[7], b_in[7], carry[7], result[7], cout);
endmodule &
对应在C++中先写FullAdder class,然后在ALU class中以FullAdder作为data member。&
class FullAdder
& FullAdder fa[8];
另外一点,moudle声明port的方式,像是从早期C语言的函数定义中学来的:
char* strcpy(dst, src)
&&& // ...
2. Verilog中的模块调用时,指定端口可以使用名称绑定。C++在调用函数时,参数只能按顺序书写。例如memset()的原型是:&
void *memset(void *s, int c, size_t n);
如果你想将某个buf清零,应该这么写:&
&char buf[256];
memset(buf, 0, sizeof(buf));&
但是如果你不小心写成了:&
memset(buf, sizeof(buf), 0); &
编译器不会报错,但运行的实际效果是根本没有对buf清零。(记得Richard Stevens的书里提到过这一点。) &
在Verilog中,如果要写一个测试ALU的module,那么其中对ALU实例化的指令可以这么写:&
module alu_
&reg[8:0] a_in, b_
&reg & op_
&wire[7:0] result_
&wire&&&&& carry_
&ALU alu0(.a(a_in[7:0]), .b(b_in[7:0]), .is_add(op_in),
&&&&& .result(result_out), .cout(carry_out));
&&& // ...
endmodule&&&
这样就比较容易检查接线错误。&
另外,在C++中,如果所有参数类型不同,而且之间没有隐式类型转换,那么可以利用C++的强类型机制在编译期检查出这种调用错误。&
3. Verilog中把大括弧{}用作bit的并置,因此语句块要用begin/end标示。Verilog中小括号()和中括号[]的作用与C++中类似,前者用于函数或模块调用,后者用于下标索引。我想如果Verilog把尖括号&&用作bit并置的话,就能把大括号{}解放出来,用作标示语句块,这样写起来更舒服一些。
4. Verilog本质上是测试驱动开发的。对于每个module都应该有对应的test bench(或称test fixture)。比较好的情况是,一个工程师写module,另一个工程师写对应的testbench,这样很容易检查出对电路功能需求理解不一致的地方。因此还可以说Verilog主张结对编程(pair programming)。例如对前面的ALU module的test bench可以写成:&
`timescale 1ns / 1ns &
module alu_
&reg[8:0] a_in, b_
&reg & op_
&wire[7:0] result_
&wire&&&&& carry_&
&ALU alu0(.a(a_in[7:0]), .b(b_in[7:0]), .is_add(op_in),
&&&&&&&&& .result(result_out), .cout(carry_out));
&reg[9:0] get,
&reg & has_
&initial begin
&&has_error = 1'b0;
&&op_in = 1'b1; // test addition
&&for (a_in = 9'b0; a_in != 256; a_in = a_in + 1)
&&&&& for (b_in = 9'b0; b_in != 256; b_in = b_in + 1) begin
&&&&& 
&&&&& &get = {carry_out, result_out};
&&&&& &expected = a_in + b_
&&&&& &if (get !== expected) begin
&&&&& &&$display("a_in = %d, b_in = %d, expected %d, get %d",
&&&&& &&&&&&&&&& a_in, b_in, expected, get);
&&&&& &&has_error = 1'b1;
&&&&& &end
&&op_in = 1'b0; // test subtraction
&&if (has_error === 1'b0) begin
&&&$display("ALL TESTS PASSED!");
5. Verilog比起VHDL的不足之处在于,它只能定义concrete class,不能定义abstract class。也就是说interface和implementation不能分离。这在设计大型电路时就显得表现力不足。不过这关系不大,因为可以在编译时选择同一模块的不同实现版本,间接实现了接口与实现的分离。&
在VHDL中,强制将接口与实现分离。对每个模块,你都得先写接口(定义输入输出信号),即ENTITY;然后至少写一份实现,即ARCHITECTURE。每个ENTITY可以有不止一份实现,例如可以有行为描述的,也有数据流描述的。然后在配置文件中选择该ENTITY到底用哪一份实现。举例来说(选自《VHDL入门·解惑·经典实例·经验总结》一书),分频器模块可以这么写,先定义其接口FreqDevider,然后定义两份实现Behavior和Dataflow:
LIBRARY IEEE;
USE IEEE.Std_Logic_1164.A &
ENTITY FreqDevider IS
( Clock& : IN& Std_L
& Clkout : OUT Std_Logic
ARCHITECTURE Behavior OF FreqDevider IS
SIGNAL Clk : Std_L
& PROCESS (Clock)
&&& IF rising_edge(Clock) THEN
&&&&& Clk &= NOT C
&&& END IF;
& END PROCESS;
& Clkout &= C
ARCHITECTURE Dataflow OF FreqDevider IS
-- signal declarations
-- processes
在C++中,既可以写concrete class,也可以写abstract class。比Verilog和VHDL都方便。&
6. Verilog和VHDL都有模板的概念,Verilog称为参数(parameter),VHDL称为类属(generic)。不过好像都只能用整数作为模板参数,不能像C++那样用类型作为模板参数。&
7. 目前来看,Verilog是硬件描述语言,不是硬件设计语言。在用Verilog设计电路的时候,我们是把脑子中想好的电路用Verilog“描述”出来:哪里是寄存器、哪里是组合逻辑、数据通路是怎样、流水线如何运作等等都要在脑子里有清晰的映象。然后用RTL代码写出来,经过综合器综合出的电路与大脑中的设想相比八九不离十。这就像说C语言是可移植的汇编语言,以前好的C程序员在写代码的时候,能够知道每条语句背后对应的汇编代码是什么。&
verilog设计经验点滴
1,敏感变量的描述完备性
Verilog中,用always块设计组合逻辑电路时,在赋值表达式右端参与赋值的所有信号都必须在always @(敏感电平列表)中列出,always中if语句的判断表达式必须在敏感电平列表中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来,即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个信号变化时再起作用,纯组合逻辑电路不可能作到这一点。综合器会发出警告。
input a,b,c;
always @(a or b or c)
& & e=d&a&b; /*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变化*/
& & d=e |c;
input a,b,c;
always @(a or b or c or d)
& & e=d&a&b; /*d在敏感电平列表中,d变化时e立刻变化*/
& & d=e |c;
2, 条件的描述完备性
如果if语句和case语句的条件描述不完备,也会造成不必要的锁存器。
if (a==1'b1) q=1'b1;//如果a==1'b0,q=? q将保持原值不变,生成锁存器!
if (a==1'b1) q=1'b1;
else& && && &q=1'b0;//q有明确的值。不会生成锁存器!
& &reg[1:0] a,q;
& &case (a)
& && &2'b00 : q=2'b00;
& && &2'b01 : q=2'b11;//如果a==2'b10或a==2'b11,q=? q将保持原值不变,锁存器!
& &endcase
& &reg[1:0] a,q;
& &case (a)
& && &2'b00 : q=2'b00;
& && &2'b01 : q=2'b11;
& && &default: q=2'b00;//q有明确的值。不会生成锁存器!
& &endcase
Verilog中端口的描述
1,端口的位宽最好定义在I/O说明中,不要放在数据类型定义中;
module test(addr,read,write,datain,dataout)
input[7:0]&&
input[15:0]
input& && & read,
output[7:0]&&//要这样定义端口的位宽!
wire addr,read,write,
module test(addr,read,write,datain,dataout)
input&&datain,addr,read,
wire[15:0]
wire[7:0]&&
wire& && & read,
reg[7:0]& && &// 不要这样定义端口的位宽!!
2,端口的I/O与数据类型的关系:
& &&&端口的I/O& && && && &端 口 的 数 据 类 型
& && && && && && && &&&module内部& &&&module外部
& && &input& && && && &&&wire& && && & wire或reg
& && &output& && && &wire或reg& && && &&&wire
& && &inout& && && && &wire& && && && &&&wire
3,assign语句的左端变量必须是wire;直接用"="给变量赋值时左端变量必须是reg!
assign a=b; //a必须被定义为wire!!
& &a=b; //a必须被定义为reg!
&&VHDL 中 STD_LOGIC_VECTOR 和 INTEGER 的区别
例如 A 是INTEGER型,范围从0到255;B是STD_LOGIC_VECTOR,定义为8位。A累加到255时,再加1就一直保持255不变,不会自动反转到0,除非令其为0;而B累加到255时,再加1就会自动反转到0。所以在使用时要特别注意!
以触发器为例说明描述的规范性
1,无置位/清零的时序逻辑
& & always @( posedge CLK)
& && & begin
& && & Q&=D;
& && & end
2,有异步置位/清零的时序逻辑
& &异步置位/清零是与时钟无关的,当异步置位/清零信号到来时,触发器的输出立即被置为1或0,不需要等到时钟沿到来才置位/清零。所以,必须要把置位/清零信号列入always块的事件控制表达式。
& & always @( posedge CLK or negedge RESET)
& && & begin
& && & if (!RESET)
& && && & Q=0;
& && & else
& && && & Q&=D;
& && & end
3,有同步置位/清零的时序逻辑
& & 同步置位/清零是指只有在时钟的有效跳变时刻置位/清零,才能使触发器的输出分别转换为1或0。所以,不要把置位/清零信号列入always块的事件控制表达式。但是必须在always块中首先检查置位/清零信号的电平。
& & always @( posedge CLK )
& && & if (!RESET)
& && && & Q=0;
& && & else
& && && & Q&=D;
& && & end
结构规范性
&&在整个芯片设计项目中,行为设计和结构设计的编码是最重要的一个步骤。它对逻辑综合和布线结果、时序测定、校验能力、测试能力甚至产品支持都有重要的影响。考虑到仿真器和真实的逻辑电路之间的差异,为了有效的进行仿真测试:
&&1,避免使用内部生成的时钟
& &&&内部生成的时钟称为门生时钟(gated clock)。如果外部输入时钟和门生时钟同时驱动,则不可避免的两者的步调不一致,造成逻辑混乱。而且,门生时钟将会增加测试的难度和时间。
&&2,绝对避免使用内部生成的异步置位/清零信号
& &&&内部生成的置位/清零信号会引起测试问题。使某些输出信号被置位或清零,无法正常测试。
3,避免使用锁存器
& &&&锁存器可能引起测试问题。对于测试向量自动生成(ATPG),
& &&&为了使扫描进行,锁存器需要置为透明模式(transparent mode),
& &&&反过来,测试锁存器需要构造特定的向量,这可非同一般。
&&4,时序过程要有明确的复位值
& &&&使触发器带有复位端,在制造测试、ATPG以及模拟初始化时,可以对整个电路进行快速复位。
&&5,避免模块内的三态/双向
& &&&内部三态信号在制造测试和逻辑综合过程中难于处理.
补充不知你看了verilog 2001版本吗?现在的verilog在尽量往C语言的风格上靠拢。
1。敏感变量的描述完备性,我现在用always实现组合逻辑时,都是写成always@(*),这样很很好,自动把所有右端赋值信号加入。
2。module编写时这样更好:
module (&&
input [23:0]& && &&&rx_data& &,
//CRC_chk interface& && && && && && && && && && && &
output reg& && && & CRC_en& & ,& && && && && && && && && && && &
output reg& && && && &CRC_init&&,
input& && && && && && &&&CRC_err&&
TA的最新馆藏
喜欢该文的人也喜欢匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 如何提取每一位的数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信