导航菜单
首页 » 图解 » 正文

https://blog.csdn.net/qq_41819186/article/details/115562659

More

1.

三目运算符的运算方式

条件表达式 ? 表达式1 : 表达式2

例:

(0 ? 3 : 5)     // 输出为5因为0为假
(sel ? b : a)   //由sel的值决定选择b或a

always @(posedge clk)         // T触发器
   q <= toggle ? ~q : q; 

((sel[1:0] == 2'h0 ) ? a : (sel[1:0] == 2'h1) ? b : c)//由sel值三选一电路   

多个混用时结合顺序为从右向左

例:

(a>b)?(b>c)?1:0:2 //先运算(b>c) ? 1 : 0再运算(a>b) ? X : 2
((sel[1:0] == 2'h0 ) ? a : (sel[1:0] == 2'h1) ? b : c)//先运算(sel[1:0] == 2'h1) ? b : c再运算((sel[1:0] == 2'h0 ) ? a : X )

例1:

给了四个数,选出其中最小的那一个。

解:

module top_module (
    input [7:0] a, b, c, d,
    output [7:0] min);//
    wire [7:0]bet0;
    wire [7:0]bet1;
    assign bet0 = a>b ? b : a;
    assign bet1 = d>c ? c : d;
    assign min = bet0>bet1 ? bet1 : bet0;
endmodule

2.

归约运算符可以对向量的每一位进行AND,OR,XOR(异或)

归约运算符的运算方式

& 向量

| 向量

^ 向量

例:

& a[7:0] //等效于 a[7]&a[6]&a[5]&a[4]a[3]&a[2]&a[1]&a[0];
| b[4:0] //等效于 b[4]|b[3]|b[2]|b[1]|b[0];
input[3:0] in
^ in //等效于 in[3]^in[2]^in[1]^in[0]

例1:

输入一个8位二进制数,要求输出奇偶校验码

奇偶校验码简单来说是指对给出二进制数添加一位校验位在最后 将原来“1”的数量变为奇数就是奇校验,变为偶数就是偶校验

例:

10010101101
100101011011//奇校验
100101011010//偶校验

module top_module( 
    input [7:0] in,
    output parity
);
   assign parity = ^in;//1数量为奇数时全部异或值为0
endmodule

3.

例1:

实现100为的全部与或非,和上题完全一样

解:

module top_module( 
    input [99:0] in,
    output out_and,
    output out_or,
    output out_xor 
); 
    assign out_or  = |in;
    assign out_xor = ^in;
endmodule

4.

例1:

翻转长度为100的向量

解:

module top_module( 
    input [99:0] in,
    output [99:0] out
);
    integer i;
    always@(*)
        begin//注意always格式
            for(i=0;i<100;i++)//使用for循环
              begin
              out[i]=in[99-i];
              end
        end
endmodule

5.

例1:

判断一个255位的二进制数中有多少个1

解:

module top_module( 
    input [254:0] in,
    output [7:0] out );
    integer i;
    always@(*)
        begin
            out = 8'b00000000;
            for(i=0;i<255;i++)
                begin //每一个新对应条件就需要一个begin
                    if(in[i] == 1'b1)
                        out = out + 1'b1;
                    else
                        out = out + 1'b0;
                end
        end
endmodule

6.

-for语句的运算方式:

循环变量

for(for循环条件)

begin:for循环名称

赋值语句

end

例:

module test(bin,gray);
       output [7:0] bin;
       input [7:0] gray;
       genvar i; 
       generate
              for(i=0;i<SIZE;i=i+1)
              begin:bit //为调用的模块命名
                     assign bin[i]=^gray[7:i];
              end
       endgenerate
endmodule

中的内容等效于

assign bin[0]=^gray[7:0];
assign bin[1]=^gray[7:1];
assign bin[2]=^gray[7:2];
assign bin[3]=^gray[7:3];
assign bin[4]=^gray[7:4];
assign bin[5]=^gray[7:5];
assign bin[6]=^gray[7:6];
assign bin[7]=^gray[7:7];

例1:

实例化100个全加器来实现一个100比特的二进制加法器,该加法器有两个100比特的输入和进位cin,输出为sum输出进位为cout

解:

用到上面提到的语句

//Adder100i
module top_module( 
	input [99:0] a, b,
	input cin,
	output [99:0] cout,
	output [99:0] sum 
);
addr add1(a[0], b[0],cin, cout[0],sum[0]);
genvar i;
	generate 
		for(i = 0;i<99;i++)
			begin: addr
				addr add_i(a[i+1],b[i+1],cout[i],cout[i+1],sum[i+1]);
			end
	endgenerate
endmodule
module addr(
	input a,b,
	input cin,
	output cout,
	output sum
);
	assign sum = a^b^cin;
	assign cout = (a&b)|(b&cin)|(cin&a);
endmodule

问题

不太理解的使用模块的例化以及调用 7.

例1:

本题已经提供了名为的一位BCD加法器,该加法器包括两个BCD码以及一个进位cin的输入,和sum的输出以及进位cout的输出

要求实例化100个来实现100位的BCD进位加法器,该模块有两个100位BCD码以及一个进位cin的输入,和sum的输出以及cout的输出

解:

同样用到

module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
    wire [399:0] cout_temp;
    genvar i;
    bcd_fadd u1(
        .a(a[3:0]),
        .b(b[3:0]),
        .cin(cin),
        .cout(cout_temp[0]),
        .sum(sum[3:0])
);
generate
    for(i=4;i<400;i=i+4)
        begin:bcd
            bcd_fadd ut(
                .a(a[i+3:i]),
                .b(b[i+3:i]),
                .cin(cout_temp[i-4]),
                .cout(cout_temp[i]),
                .sum(sum[i+3:i])
);
        end
endgenerate
    assign cout = cout_temp[396];
endmodule

8.问题

评论(0)

二维码