# HDLBits：在线学习 Verilog （二十 · Problem 95 - 99）

Problem 95 Detect both edges

```module top_module (
input clk,
input [7:0] in,
output reg [7:0] anyedge
);

reg [7:0] in_temp;

always @ (posedge clk)
begin
in_temp <= in;
anyedge <= in ^ in_temp;
end

endmodule
```

Problem 96 Edge capture register

```module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg [31:0] temp;
wire [31:0] capture;

//同理，我们先检测输入信号的上升沿。
always @ (posedge clk)
begin
temp <= in;
end
//这里如果采用reg的话会出现时序错误。
assign capture = ~in & temp;

//检测到上升沿之后，来确定我们的输出
always @ (posedge clk)
begin
if(reset)
out <= 32'b0;
else
begin
for (int i=0; i<32; i=i+1)
begin
if(capture[i] == 1'b1)
out[i] <= 1'b1;
end
end
end

endmodule
```

Probelm 97 Dual-edge triggered flip-flop

MUX代码如下：

```module top_module (
input clk,
input d,
output q
);

reg q1, q2;

//这里来实现clk的上升沿与下降沿
assign q = clk?q1:q2;

always @ (posedge clk)
begin
q1 <= d;
end

always @ (negedge clk)
begin
q2 <= d;
end

endmodule
```

XOR代码如下：

```module top_module(
input clk,
input d,
output q);

reg p, n;

// clk的上升沿
always @(posedge clk)
p <= d ^ n;

// clk的下降沿
always @(negedge clk)
n <= d ^ p;

//在上升沿时候，p=d^n, 则q=d^n^n=d;
//在下降沿时候，n=d^p, 则q=p^d^p=d;
//加载一个新值时会取消旧值。
assign q = p ^ n;

// 这样写是无法综合的
/*always @(posedge clk, negedge clk) begin
q <= d;
end*/

endmodule
```

Problem 98 Four-bit binary counter

```module top_module (
input clk,
input reset,      // Synchronous active-high reset
output reg [3:0] q);

always @ (posedge clk)
begin
if(reset)
q <= 4'b0000;
else
q <= q + 1'b1;
end

endmodule
```

```module top_module (
input clk,
input reset,        // Synchronous active-high reset
output [3:0] q);

always @ (posedge clk)
begin
if(reset)
q <= 4'b0000;
else if(q <= 4'b1000)
q <= q + 1'b1;
else
q <= 4'b0000;
end

endmodule```

0 条评论

• ### HDLBits：在线学习 Verilog （十二 · Problem 55 - 59）

假设你正在设计一个电路来控制手机的振铃器和振动电机。当手机来电时(input ring)，电路必须把震动( output motor = 1 )或响铃( out...

• ### HDLBits：在线学习 Verilog （二十二 · Problem 105 - 109）

用计数器设计一个带am/pm的12小时时钟。该计数器通过一个CLK进行计时，用ena使能信号来驱动时钟的递增。

• ### HDLBits：在线学习 Verilog （二十一 · Problem 100 - 104）

设计一个0～9的计数器，共10个周期。该计数器采用同步复位且复位为0。但是本题是希望该计数器并不是随着clk的变化而递增，而是随着一个slowena使能信号来控...

• ### HDLBits：在线学习 Verilog （二十七 · Problem 130-134）

前面Problem 125 Simple one-hot state transtion 3应该已经介绍过独热one-hot编码方式。这是一种生成逻辑最为简单的...

• ### HDLBits：在线学习 Verilog （二十八 · Problem 135-139）

Problem 135 PS/2 packet parser and datapath / Fsm ps2data

• ### HDLBits：在线学习 Verilog （二十三 · Problem 110-114）

相比于上一题 5-bit 线性移位寄存器，本题原理上相同，但作者希望我们结合实际的板子（DE1-SoC，可能是一个教学板）和其外部接口（KEY&LED），实现一...

• ### HDLBits：在线学习 Verilog （二十四 · Problem 115-119）

下表更详细地给出了跳变的规则，（可以视为状态转移表），元素下一个状态可以视作输出，输入为元素本身的状态与相应两个相邻元素的当前状态。

• ### HDLBits：在线学习 Verilog （二十九 · Problem 140-144）

Problem 140 Serial two's complementer (Mealy FSM)

• ### HDLBits：在线学习 Verilog （十 · Problem 45 - 49）

解析：如上图所示， 一个异或门，一个同或门，我声明一个wire型的temp来存放同或门的输出。

• ### HDLBits：在线学习 Verilog （二 · Problem 10-14）

什么是 Verilog 中的向量（vector）？向量是一组 wire 信号的集合，通过赋予这一组信号的集合一个名称，以便于访问其中的 wire 信号。

• ### HDLBits：在线学习 Verilog （一 · Problem 0-9）

本文是系列文章的第一篇，讨论下前十道习题和解答，HDLBits 共有约 180 题。Step one - HDLBits

• ### HDLBits：在线学习 Verilog （十九 · Problem 90 - 94）

我们用3个包含触发器和多路选择器的子模块来实现图中电路。题目要求我们写出包含一个触发器和一个多路选择器的子模块。

• ### HDLBits：在线学习 Verilog （十六 · Problem 75 - 79）

一个4输入a, b, c, d和一输出的逻辑电路，当输入为2， 7或15时，输出为1， 当输入为0, 1, 4, 5, 6, 9, 10, 13, 或 14 时...

• ### HDLBits：在线学习 Verilog （十三 · Problem 60-64）

Problem 60 : 2-to-1 multiplexer (Mux2to1)

• ### HDLBits：在线学习 Verilog （十四 · Problem 65-69）

本题中需要实现一个 2 进制 1bit 加法器，加法器将输入的两个 1bit 数相加，产生两数相加之和以及进位。

• ### HDLBits：在线学习 Verilog （十五 · Problem 70 - 74）

题目要求我们创建一个100bit的二进制的加法器，该电路共包含两个100bit的输入和一个cin， 输出产生sum和cout。

• ### HDLBits：在线学习 Verilog （十一 · Problem 50 - 54）

在前面的练习中，我们使用简单的逻辑门和多个逻辑门的组合。这些电路是组合电路的例子。组合意味着电路的输出只是其输入的函数（在数学意义上）。这意味着对于任何给定的输...

• ### HDLBits：在线学习 Verilog （十七 · Problem 80-84）

接下来的题目是属于触发器，锁存器的专题。我们会从用 Verilog 实现基础 D 触发器开始，学习触发器这一数字电路中最重要的电路之一。

• ### HDLBits：在线学习 Verilog （十八 · Problem 85-89）

Problem 85 : DFF with byte enable(Dff16e)