A bit can have the values 0 or 1. In a computer, these values are represented by a low and a high value of an electrical signal.
The value of a bit can be stored. This means that the value is remembered, as long as it is stored. While the value is stored, the value can be read, and used, for the purpose of performing different operations. Examples of operations could be to store the value somewhere, for example in memory, or using the value in an addition operation.
The value of a bit can be stored in a building block called D flip-flop.
A D flip-flop stores one bit of data. A new value can be stored when a clock signal changes value. A component which can change its stored value only when a clock signal changes is called a synchronous component.
A D flip-flop implementation in Verilog is shown in Figure 2.
module d_ff(clk, data_in, data_out); input clk; input data_in; output data_out; wire clk, data_in; reg reg_value; always @(posedge clk) reg_value <= data_in; assign data_out = reg_value; endmodule
Figure 2. A D flip-flop in Verilog.
The code in Figure 2 defines a module. The module has two inputs, called clk and data_in, and one output, called data_out.
The input variables clk and data_in are defined using the keyword input and the output variable data_out is defined using the keyword output.
iverilog -o d_ff_tb d_ff.v d_ff_tb.v
The simulation can be run by giving the command
The resulting printout is shown in Figure 4.
VCD info: dumpfile d_ff_tb_wave.vcd opened for output. At time 0, data_in=1, data_out=1 At time 1, data_in=0, data_out=1 At time 4, data_in=0, data_out=0 At time 6, data_in=1, data_out=0 At time 8, data_in=1, data_out=1 At time 9, data_in=0, data_out=1 At time 12, data_in=0, data_out=0
Figure 4. Printout from running the testbench in Figure 3.
initial begin $monitor("At time %t, data_in=%b, data_out=%b", $time, d_ff_data_in, d_ff_data_out); #16 $finish; end
with the effect that a printout is done whenever the time changes, or one of the variables d_ff_data_in or d_ff_data_out changes value. The changes for the variable d_ff_data_in are defined in an initial block in Figure 3 as
initial begin #1 d_ff_data_in = 0; #5 d_ff_data_in = 1; #3 d_ff_data_in = 0; end
The testbench in Figure 3 generates printouts as shown in Figure 4. The printouts show values of digital signals, each having the value one or zero. We can represent these signals as waveforms, with the level of the waveform being one or zero. Thinking of the value one as a high voltage level, and the value zero as a low voltage level, we can think of the waveforms as representing actual voltages, in an actual digital system.
A waveform can be visualized using the GTKWave program. We can download a GTKWave version for Mac, in the form of a zip-file that contains an executable GTKWave program. The GTKWave program can be started from a Mac Terminal, by giving the command open followed by the app file name of the program. As an example, I could start the program by doing
A GTKWave version for Ubuntu can be installed in Ubuntu, by giving the command
sudo apt-get install gtkwave
The program can then be started by giving the command gtkwave.