当前位置:   article > 正文

HDLBits--答案

hdlbits

 2.2.7 Vectorr

   

1)       

  2)  always 内部用for循环,需要定义interger类型变量,同时在always内部不能使用assign连续赋值。 generate...endgenerate可有可无

           3) for语句在always 外部,或者使用for循环例化模块,需要定义genvar变量,同时for()begin:名字(必须要有名字),genvar i;可以放在generate........endgenerate里面

  

 2.28

拼接运算符 {num{vector} }

2.2.9

2.3.1

模块的层次结构是通过在另一个模块中实例化一个模块来创建的

模块实例化的方法有两种:1)、按位置连接,2)、按名称连接

1)、按位置将电线连接到端口,实例化模块时,端口根据模块的声明从左到右连接,

mod_a instance1 ( wa, wb, wc );

此实例化类型的模块mod_a,并赋予它一个实例名“INSTANCE1”的,然后连接信号wa(新模块外部)的第端口(新模块的in1),wb到第端口(in2),以及wc所述第端口(out)。这种语法的一个缺点是,如果模块的端口列表发生更改,则还需要找到并更改模块的所有实例以匹配新模块。mod_a 中的in1,in2,out分别连接top_mudule中的a,b,out

2)、按名字将电线连接到端口,即使端口列表发生变化,电线也能保持正确连接。

mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );

上述行实例化类型的模块mod_a名为“INSTANCE2”,然后连接信号wa(模块外部)的端口命名 in1wb到端口命名 in2,和wc到端口命名 out。

2.3.2

2.3.3

 2.3.4

     q1、q2就相当于两根线,用q1将第一个D触发器的q端和第二个触发器的d端相连。q2同理。

2.3.5

多路复用器能将 N 个输入通道的数据复用到一个输出通道上。使用多路复用器可使多路数据信息共享一路信道,能充分地利用通信信道的容量,大大降低系统的成本。通过改变A与B的值,就能输出端F到底输出D1,D2,D3,D4中的哪个值

在这里插入图片描述                             在这里插入图片描述

 2.3.6

2.3.7

2.3.8

 2.3.9

加-减器可以由加法器通过选择性地对其中一个输入取反来构建,这相当于对输入取反然后加1。最终的结果是一个可以做两种操作的电路:(a + b + 0)和(a + ~b + 1)。

2.4.1

程序块内部代码的语法与外部代码不同过程块具有更丰富的语句集(例如,if-then、case),不能包含连续赋值。过程连续赋值确实存在,但与连续赋值有些不同,并且不可综合。

  • Combinational: always @(*)
  • Clocked: always @(posedge clk)

assign 和combinational always 块描述了相同的电路。两者都创建了相同的组合逻辑块。每当任何输入(右侧)更改值时,两者都会重新计算输出。  assign out1 = a & b | c ^ d; always @(*) out2 = a & b | c ^ d;

关于 wire 与 reg 的说明:assign 语句的左侧必须是net类型(例如,wire),而过程赋值(在 always 块中)的左侧必须是变量类型(例如,reg)。这些类型(wire 与 reg)与合成的硬件无关,只是 Verilog 用作硬件模拟语言时遗留下来的语法。

2.4.2

对于硬件综合,有两种相关的always块:

  • 组合逻辑:always@(*)
  • 时序逻辑:alwaalways@(posedge clk)

时序always块创建组合逻辑块,就像组合always块一样,但时序always块是在组合逻辑块的输出处创建一组触发器(或“寄存器”)。逻辑块的输出不是立即可见,而是仅在下一个 (posedge clk) 之后立即可见。

阻塞与非阻塞分配

Verilog 中有三种类型的赋值:

  • 连续赋值(assign x = y;)。不能在过程块中使用(“always块”)。
  • 程序阻塞赋值:( x = y; )。只能在过程块内部使用。
  • 程序非阻塞赋值:( x <= y; )。只能在过程块内部使用。

在一个组合always块,使用阻塞分配。在时序always块中,使用非阻塞分配。

 

 always@(posedge clk) 会先将输出结果放在寄存器中,在下一个时钟上升沿到来时在输出

always@(*)在赋值时和assign连续赋值语句一样,直接输出结果

2.4.3

2.4.4

 2.4.5

2.4.6

 2.4.7

先给这几个输出赋一个初值,这个样子就算没有default其他情况也不会出现错误

2.5.1

 不能像c语言那样直接写成下图这样,因为 c中是串行运行,而verilog中是并行运行 

2.5.3

2.5.4

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/648879
推荐阅读
  

闽ICP备14008679号