How to write the verilog modules for each of the following digital circuit components and then create a testbench?
Multiplexer
Implement a 8x1 32-bit multiplexer.
Input: x (8 32-bit numbers), and sel (3 bits).
Output: y (32 bits). x is the data input (x[0], ..., x[7]).
The multiplexer should use the value of sel to determine the output y. For example, if sel= (001)2, y should be the value of x1. Adder (15 pts) Implement a 32-bit adder. Input: x (32 bits), y (32 bits), ci (1 bit). Output: co (1 bit), and s (32 bits). This adder should calculate the result of x + y + ci, and send the result to s and also the carry to co. For example, if x = 0x00000001, y = 0xFFFFFFFF, and co = 1, then the output should be s = 0x00000001 and ci = 1.
Shifter
Implement a 32-bit shifter.
Input: x (32 bits), c (5 bits), and op (2 bits). Output: y.
This shifter should shift the input number x by c bits according to the shift operations indicated by op:
op = 0 left logical shift,
op = 1 right logical shift,
op = 2 right arithmetic shift,
op = 3 left circular shift.
For example, if x=0x80000001 and c=4, the value of y should be 0x00000010 if op=0, 0x08000000 if op=1, 0xF8000000 if op=2, and 0x00000018 if op=3.
Absolute Value
Take a 32-bit signed integer as input, and convert it into its absolute value as output. Notice that −231 will not be used as the input value. Input: x (32 bits). Output: y (32 bits). Example: If x=0x80000001, the output should be y=0x7FFFFFFF.
ALU
Implement a 32-bit ALU.
Input: a (32 bits), b (32 bits), and op (3 bits).
Output: s (32 bits).
The ALU should send the results of operations with a and b to s. The operations are specified by the value of op, as shown in the following table: Assume a = 0x0000001 and b = 0xFFFFFFFF, we also show the results of each operations in the above table. Notice that AND, OR, XOR, and NOT are bitwise operations.
Testbench for the modules
User contributions licensed under CC BY-SA 3.0