Verilog刷题记录-HDLBits(更新中)

2021/1/11

wire4

1.assign语句是并行的,其先后不影响执行顺序

2.如果input/output不申明,默认类型为wire型

input wire a
//等价于
input a

3.assign语句实际上是将两条wire连接起来(即输入wire型,输出也是wire型。

notgate

4.区分(!与~) ! 逻辑非; ~ 按位取反

andgate

5.单目& 归约与;双目& 按位与 ;双目&&逻辑与

norgate xnorgate

知识点大概同上,注意异或为^,异或非(即同或)为!^

2021/1/12

Declaring wires

很简单 中间变量的定义

7458

简单的与或门

vector0

6.注意vector的声明在变量名之前,与C不同

//correct
wire [7:0] a;
//wrong
wire a[7:0];

而调用时则在变量名之后

b = a[3:0];

vector1/vector2

7.字节序的声明和调用要始终保持一致,如

//wrong
wire [3:0] a;
...
b = a[0:3];//字节序不一致

8.implicit net

如果assign语句的左边变量没有声明,将自动定义为一个1bit net型变量,这很可能产生bug

wire [2:0] a, c;   // Two vectors
assign a = 3'b101;  // a = 101
assign b = a;       // b =   1  implicitly-created wire
assign c = b;       // c = 001  <-- bug
my_module i1 (d,e); // d and e are implicitly one-bit wide if not declared.
                    // This could be a bug if the port was intended to be a vector.

9.packed与unpacked数组

6中提到多bit变量其维度声明在其变量名之前,这实际上是一种packed的变量,如

wire [7:0] a;

我们在调用a时,不必具体指定调用a的那几位,默认a为一个8维变量
而若维度声明在变量后,即为unpacked变量,常用于声明memory,如

reg [7:0] mem [15:0];

这实际上声明了一个大小为16的memory,字长为8bit,在调用时

out <= mem[0];

则out取出的是mem的第0个数据,字长为8bit。

Vectorgates

简单 按位与和逻辑与的区别

2021/1/13

gates4

简单,该题用归约操作符可以减少代码量。

vector3/vectorr

简单,连接符的使用。

vector4/vector5

10.重复拼接

assign a = {b,b,b,b,b};
//equal to
assign a = {5{b}};

// 有符号扩展,7位a扩展为32位b
assign b = {{24{a[7]}},a};

2021/1/14

今天刷完module模块的9题

Module ~ Module shift8

这几道题都是模块实例化。

11.模块实例化,(.内部端口(外部信号))

mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );
//out,in1,in2为mod_a的端口名

Module add~cseladd

12.变量不说明默认1位,常量默认32位

Module addsub

13.由加法器可构成减法器

a-b = a+~b+1;
Verilog刷题记录-HDLBits(更新中)_第1张图片

2021/1/15

always blocks ~ avoid latches

14.assign语句和组合块always @(*)可表达相同的逻辑。

15.组合块中使用阻塞赋值(=),同步块always @( posedge/negedge)采用非阻塞赋值(<=)。

16.if语句和选择语句assign a = ()? c:d;可表达相同的逻辑。

17.如果组合块中条件不完备,电路为了保持当前状态就会产生锁存器(latch)。

18.if case等语句只能在always块中使用。

2021/1/17

Conditional~reduction

简单。归约运算符。

2021/1/19

vector 100r~bcdadd100

19.generate 的使用:注意需要给generate模块赋模块名(下例中为u)

generate
    genvar i;
        for (i = 0; i <= 7;  i = i + 1) 	 begin: u
	    adder8 add (sum[i], co[i+1],  a1[i], a2[i], ci[i]);	 
        end 
endgenerate

20.实例数组的使用:

module driver (in, out, en);
      input [2: 0] in;
      output [2: 0] out;
      input en;
      bufif0  u[2:0]  (out, in, en);   // array of buffers
endmodule

今天把verilog language一大章刷完了。明天开始circuit。

2020/1/20

后天考试,今天刷完了simulation一章。


发现越到后面知识点已经没什么好记下来的了,所以之后就改成打卡吧~(如果有遇到不会的还是会记下来的)

2021/1/21

考试前一天,刷了两题状态机

2021/1/23

wire~7420chip

2021/1/24

truth tables ~ even longer vectors

2021/1/25

2-to-1 multiplexer ~ 256-to-1 4-bit multiplexer

21.range的上限不能是变量

今天再刷题时,遇到了报错

    always@(*)
        out = in[sel*4+3:sel];
     报错
     Error (10734): Verilog HDL error at top_module.v(6): sel is not a constant File: /var/www/verilog/work/vlg6VPWLT_dir/top_module.v Line: 6

查了一下,是由于range的上限不能是变量:

//正确
assign leadingBits[3] = magnitude[bitsEnd + 3];
assign leadingBits[2] = magnitude[bitsEnd + 2];
assign leadingBits[1] = magnitude[bitsEnd + 1];
assign leadingBits[0] = magnitude[bitsEnd + 0];
//报错
assign leadingBits[3:0] = magnitude[bitsEnd + 3:bitsEnd];

解决方法:
(1)可以用+:,-:操作符来表示:见https://blog.csdn.net/feiliantong/article/details/107782129
(2)拼接符

//方法1
    always@(*)
        out = in[sel*4 +: 4];
//方法2
	assign out = {in[sel*4+3], in[sel*4+2], in[sel*4+1], in[sel*4+0]};

2021/1/26

half adder ~ 4-digital BCD adder

2021/1/28

3-variable ~ k-map implemented with mutiplexer

2021/2/3

D flip-flop ~ dual-edge triggered flip flop

22.

always块中,对时钟同时上升和下降沿触发会报错

always@(posedge clk ,negedge clk)//报错

若要实现双边沿触发的触发器,需要一个上升沿触发的触发器和一个下降沿触发的触发器。代码如下:

module top_module (
    input clk,
    input d,
    output q
);
    reg q_pos,q_neg;
    always@(posedge clk)
        q_pos <= d;
    always@(negedge clk)
        q_neg <= d;
    assign q = clk ? q_pos : q_neg;

endmodule

2021/2/22

刷完counters

注意进位条件,高位进位的条件为地位全部为最高位。

你可能感兴趣的:(学习笔记,verilog)