1. Hdibits: Verilog 構文の「基本」
ウェブサイトのリンク: Hdibits。
最初の質問:
有向ワイヤを定義します。
module top_module( input in, output out );
assign out = in;
endmodule
2 番目の質問:
次の図に示すように、3 つの入力と 4 つの出力を持つモジュールを作成します。
module top_module(
input a,b,c,
output w,x,y,z );
assign w = a ;
assign x = b ;
assign y = b ;
assign z = c ;
endmodule
3 番目の質問:
NOT ゲートを実装するモジュールを作成します。
module top_module( input in, output out );
not(out, in);
endmodule
4 番目の質問:
AND ゲートを実装するブロックを作成します。
module top_module(
input a,
input b,
output out );
and (out ,a ,b);
endmodule
5 番目の質問:
NOR (または not) ゲートを実装するブロックを作成します。
module top_module(
input a,
input b,
output out );
nor (out ,a ,b);
endmodule
6番目の質問:
XNOR (排他的 OR) ゲートを実装するモジュールを作成します。
module top_module(
input a,
input b,
output out );
xnor (out,a ,b);
endmodule
7番目の質問:
以下の回路を実装します。AND ゲートと OR ゲートを接続するための 2 本の中間ワイヤ (任意の名前を付けます) を作成します。NOT ゲートに供給するワイヤーは実際にはワイヤーなので、ここで 3 番目のワイヤーを宣言する必要はないことに注意してください。ワイヤにはソース (ゲートの出力) が 1 つだけありますが、複数の入力に電力を供給できることに注意してください。
図の回路構造に従うと、割り当てる必要がある信号が 4 つあるため、最終的には 4 つの代入ステートメントになるはずです。
`default_nettype none //禁用隐式网络
module top_module(
input a,
input b,
input c,
input d,
output out,
output out_n );
wire net_1 ,net_2;
assign net_1 = a & b;
assign net_2 = c & d;
assign out = net_1 | net_2;
assign out_n = ~out;
endmodule
8番目の質問:
7458 チップと同じ機能を持つモジュールを作成します。10 入力と 2 出力を備えています。ステートメントを使用して各出力ワイヤを駆動することを選択することも、中間信号として使用する (4 つの) ワイヤを宣言することも選択できます。各内部ワイヤは AND ゲートの 1 つの出力によって駆動されます。さらに練習するには、両方の方法を試してください。
最初の方法:
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
wire left_1 ,left_2 ,right_1 , right_2;
assign left_1 = p2a & p2b;
assign left_2 = p2c & p2d;
assign p2y = left_1 | left_2;
assign right_1 = p1a & p1c & p1b;
assign right_2 = p1f & p1e & p1d;
assign p1y = right_1 | right_2;
endmodule
2 番目の方法:
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
wire left_1 ,left_2 ,right_1 , right_2;
and (left_1, p2a, p2b);
and (left_2, p2c, p2d);
or (p2y, left_1, left_2);
and (right_1, p1a, p1c, p1b);
and (right_2, p1f, p1e, p1d);
or (p1y, right_1, right_2);
endmodule
2. Hdibits: Verilog 構文の「ベクトル」
最初の質問:
1 つの 3 ビット入力を受け取り、同じベクトルを出力し、それを 3 つの別々の 1 ビット出力に分割する回路を構築します。出力を入力ベクトルの位置 0、位置 1 などに接続します。
図では、ベクトル内のビットごとに個別の線を描画するのではなく、横に数字の付いた目盛りがベクトル (または「バス」) の幅を示します。
module top_module (
input wire [2:0] vec,
output wire [2:0] outv,
output wire o2,
output wire o1,
output wire o0 ); // Module body starts after module declaration
assign outv = vec[2:0];
assign o2 = vec[2];
assign o1 = vec[1];
assign o0 = vec[0];
endmodule
2 番目の質問:
入力ハーフワード (16 ビット、[15:0]) を下位 [7:0] バイトと上位 [15:8] バイトに分割する組み合わせ回路を構築します。
`default_nettype none // Disable implicit nets. Reduces some types of bugs.
module top_module(
input wire [15:0] in,
output wire [7:0] out_hi,
output wire [7:0] out_lo );
assign out_lo = in[7:0];
assign out_hi = in[15:8];
endmodule
3 番目の質問:
32 ビット ベクトルは、4 バイト (ビット [31:24]、[23:16] など) を含むとみなすことができます。4 バイト ワードのエンディアンを反転する回路を構築します。
AaaaaaaaaBbbbbbbbCccccccccDdddddddd => DdddddddCcccccccBbbbbbbbbAaaaaaaaa
この操作は通常、リトル エンディアン x86 システムと多くのインターネット プロトコルで使用されるビッグ エンディアン形式の間など、データのエンディアンを交換する必要がある場合に使用されます。
`default_nettype none // Disable implicit nets. Reduces some types of bugs.
module top_module(
input wire [15:0] in,
output wire [7:0] out_hi,
output wire [7:0] out_lo );
assign out_lo = in[7:0];
assign out_hi = in[15:8];
endmodule
4 番目の質問:
2 つの 3 ビット入力を備え、2 つのベクトルのビットごとの OR、2 つのベクトルの論理和、および 2 つのベクトルの逆 (NOT) を計算する回路を構築します。の上半分に の逆数 (つまり bit[5:3]) を入れ、下半分に の逆数を入れます。試合のこと
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] out_or_bitwise,
output out_or_logical,
output [5:0] out_not
);
assign out_or_bitwise[2:0] = a[2:0] | b[2:0];
assign out_or_logical = a || b; //向量计算如果只有一个输出,则用双重逻辑符
assign out_not[5:3] = ~b[2:0];
assign out_not[2:0] = ~a[2:0];
endmodule
5 番目の質問:
2 つの 3 ビット入力を備え、2 つのベクトルのビットごとの OR、2 つのベクトルの論理和、および 2 つのベクトルの逆 (NOT) を計算する回路を構築します。の上半分に の逆数 (つまり bit[5:3]) を入れ、下半分に の逆数を入れます。試合のこと
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] out_or_bitwise,
output out_or_logical,
output [5:0] out_not
);
assign out_or_bitwise[2:0] = a[2:0] | b[2:0];
assign out_or_logical = a || b; //向量计算如果只有一个输出,则用双重逻辑符
assign out_not[5:3] = ~b[2:0];
assign out_not[2:0] = ~a[2:0];
endmodule
6番目の質問:
複数の入力ベクトルが与えられた場合、それらを連結し、複数の出力ベクトルに分割します。6 つの 5 ビット入力ベクトル (a、b、c、d、e、f) があり、合計 30 ビット入力になります。32 ビット出力には、w、x、y、z の 4 つの 8 ビット出力ベクトルがあります。出力は、入力ベクトルの後に 2 つの 1 ビットが続いたものを連結したものである必要があります。
module top_module (
input [4:0] a, b, c, d, e, f,
output [7:0] w, x, y, z );
//二种方法
wire [31:0] sum;
assign sum[31:0]={
a[4:0], b[4:0], c[4:0], d[4:0], e[4:0], f[4:0],2'b11};
assign {
w[7:0], x[7:0], y[7:0], z[7:0]} = sum[31:0];
// assign {w[7:0], x[7:0], y[7:0], z[7:0]} = {a[4:0], b[4:0], c[4:0], d[4:0], e[4:0], f[4:0],2'b11};
endmodule
7番目の質問:
8 ビットの入力ベクトル [7:0] を指定すると、そのビットの順序を逆にします。
module top_module(
input [7:0] in,
output [7:0] out
);
//高位为最左边第一位
assign out = {
in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7]};
endmodule
8番目の質問:
8 ビット数値を 32 ビットに符号拡張する回路を構築します。これには、符号ビットの 24 個のコピー (つまり、bit[7] を 24 回コピー) を連結し、その後に 8 ビットの数値そのものを連結する必要があります。
module top_module (
input [7:0] in,
output [31:0] out );//双层花括号可以让同样的向量成倍拼接
assign out = {
{
24{
in[7]}},in};
endmodule
9番目の質問:
5 つの 1 ビット信号 (a、b、c、d、および e) が与えられた場合、25 ビットのペアごとの 1 ビット比較をすべて 25 ビット出力ベクトルで計算します。比較される 2 つのビットが等しい場合、出力は 1 になるはずです。
out[24] = ~a ^ a; // a == a なので、out[24] は常に 1 になります。
out[23] = ~a ^ b;
out[22] = ~a ^ c;
...
out [ 1 ] = ~e ^ d;
out[0] = ~e ^ e;
module top_module (
input a, b, c, d, e,
output [24:0] out );//
assign out = ~ {
{
5{
a}} ,{
5{
b}} ,{
5{
c}} ,{
5{
d}} ,{
5{
e}}} ^ {
5{
a,b,c,d,e}};
endmodule