收藏 分享(赏)

在中已经介绍了组合逻辑电路的实现-Read.doc

上传人:weiwoduzun 文档编号:1800155 上传时间:2018-08-24 格式:DOC 页数:25 大小:334KB
下载 相关 举报
在中已经介绍了组合逻辑电路的实现-Read.doc_第1页
第1页 / 共25页
在中已经介绍了组合逻辑电路的实现-Read.doc_第2页
第2页 / 共25页
在中已经介绍了组合逻辑电路的实现-Read.doc_第3页
第3页 / 共25页
在中已经介绍了组合逻辑电路的实现-Read.doc_第4页
第4页 / 共25页
在中已经介绍了组合逻辑电路的实现-Read.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、在第七讲中,已经介绍了组合逻辑电路的实现。组合逻辑电路的特点是:在任意时刻,电路产生的稳定输出仅与当前时刻的输入有关。时序逻辑电路则不同于它,其特点是:在任意时刻电路产生的稳定输出不仅与当前时刻的输入有关,而且还与电路过去的输入有关。本讲中将介绍时序逻辑电路的实现。8.1 闪烁灯的实现 To top 在目标板上,设计有一个 10MHz 的时钟源。假如直接把它输出到发光二级管 LED,由于人眼的延迟性,我们将无法看到 LED 闪烁,认为它一直亮着。如果我们期望看到闪烁灯,就需要将时钟源的频率降低后再输出。因此,可以采用如图 1 所示的逻辑功能框图。图 1 闪烁灯的逻辑功能框图其中,CLK 表示

2、10MHz 的时钟源,作为输入;LED0-LED7 表示发光二极管,作为输出;6 、 44、43、38、37 、36、35 、40 和42 是上述变量对应芯片 XC9536 的引脚。虚线框中的部分是 CPLD 设计,用于实现闪烁灯的功能。如图 1 所示,在 XC9536 中,加入计数电路与判别电路。计数电路可用计数器实现。每来一个时钟脉冲 CLK,计数器就加 1。而每当判断出计数器达到某个数值时,就使得灯 LED0-LED7 的亮灭反转一次,即:周期性地输出高电平“1“和低电平“0“。这样设计也就相当于把 10MHz 的时钟源分频后再输出。如果最终要使得灯 1s 闪烁一次,即:输出 1Hz 的

3、时钟脉冲,就需要把 10MHz 的时钟经过 107 分频。根据上述分析,可以得到下面的 Verilog-HDL 描述。/* 闪烁灯的 Verilog-HDL 描述 */module LIGHT ( CLK, LED ); / 模块名及端口参数,范围至 endmoduleinput CLK; / 输入端口定义,对应第 6 脚output 7:0 LED; / 输出端口定义,LED0-LED7分别对应第 44、43、38 、37、36、35 、40 和 42 脚reg 7:0 LED; / 输出端口定义为寄存器型reg 22:0 buffer; / 中间变量 buffer 定义为寄存器型alway

4、s ( posedge CLK ) / always 语句,表示每当 CLK 的上升沿到来时,完成 begin-end 之间语句的操作 begin / 顺序语句,到 end 止buffer = buffer +1; / 缓冲器 buffer 按位加 1if ( buffer = 23b11111111111111111111111) / 判别 buffer 中的数值为(223-1)107 时,做输出处理/“23“表示以位计的数值长度,“b“表示二进制,“111“ 表示二进制的数字序列beginLED=LED; / LED0-LED7反转一次,即:由 0 变为 1,或由 1 变为 0endend

5、endmodule把以上闪烁灯的描述,用 WebPACK Project Navigator 软件,生成目标文件,并通过下载电缆写入芯片 XC9536 中。然后,将芯片插到目标板上,即可看到闪烁灯的景象了。图 2 示出了下载过程中出现的引脚配置画面。图 2 闪 烁 灯 的 引 脚 配 置 画 面8.2 流 水 灯 的 实 现 To top 下 面 , 做 一 个 流 水 灯 的 设 计 。 如 果 把 流 水 做 慢 动 作 播 放 , 可 以 想 象 到 其 实 就 是 移 动 , 即 : 把 水 块 不 断 地 向 同 一 方向 移 动 , 而 原 来 的 水 块 保 持 不 动 , 就

6、形 成 了 流 水 。 同 样 , 如 果 使 得 最 右 边 的 灯 先 亮 ; 然 后 , 通 过 移 位 , 在 其 左 侧 的 灯 ,由 右 向 左 依 次 点 亮 , 而 已 经 亮 的 灯 又 不 灭 , 不 就 形 成 了 向 左 的 流 水 灯 !因 此 , 同 样 可 以 采 用 如 图 1 所 示 的 逻 辑 功 能 框 图 。 初 始 状 态 时 , 8 个 灯 都 不 亮 。 每 来 一 个 时 钟 脉 冲CLK, 计 数 器 就 加 1。 每 当 判 断 出 计 数 器 中 的 数 值 达 到 107 时 , 就 会 点 亮 一 个 灯 , 并 进 行 移 位 。 这

7、 样 , 依 次 点 亮所 有 的 灯 , 就 形 成 了 流 水 灯 。 而 当 8 个 灯 都 点 亮 时 , 需 要 一 个 操 作 使 得 所 有 的 灯 恢 复 为 初 始 状 态 , 即 : 灯 都 不 亮 。然 后 , 再 一 次 流 水 即 可 。 如 果 是 左 移 位 , 就 出 现 向 左 流 水 的 现 象 ; 反 之 , 向 右 流 水 。 根 据 上 述 分 析 , 可 以 得 到 下 面 的Verilog-HDL 描 述 。/* 流 水 灯 的 Verilog-HDL 描 述 * /module LEDWATER ( CLK, LED ); / 模 块 名 及 端

8、 口 参 数 , 范 围 至 endmoduleinput CLK; / 输 入 端 口 定 义 , 对 应 第 6 脚output 7:0 LED; / 输 出 端 口 定 义 , LED0-LED7分 别 对 应 第 44、 43、 38、 37、 36、 35、 40 和 42脚reg 7:0 LED; / 输 出 端 口 定 义 为 寄 存 器 型reg 22:0 buffer; / 中 间 变 量 buffer 定 义 为 寄 存 器 型 initial / initial 语 句 , 用 于 对 8 个 灯 进 行 初 始 化 , 即 : 使 得 8 个 灯 都 不 亮LED=8b

9、11111111; / 依 照 图 1 可 知 , 输 出 为 高 电 平 时 , LED 灭 , 反 之 亮always ( posedge CLK ) / always 语 句 , 表 示 每 当 CLK 的 上 升 沿 到 来 时 , 完 成 begin-end 之 间 语 句 的 操 作begin / 顺 序 语 句 , 到 end 止buffer = buffer +1; / 缓 冲 器 buffer 按 位 加 1,if ( buffer = 23b11111111111111111111111) / 判 别 buffer 中 的 数 值 为 ( 223-1) 107 时 , 做

10、输 出 处 理/“23“表 示 以 位 计 的 数 值 长 度 , “b“表 示 二 进 制 , “111“表 示 二 进 制 的 数 字 序 列 beginLED=LED1; / LED 向 左 移 位 , 空 闲 位 自 动 添 0 补 位 。 例 : 第 一 次 移 位 后 , LED=8b11111110if ( LED=8b00000000 ) / 条 件 判 断 语 句 , 表 示 如 果 8 个 灯 全 亮LED=8b11111111; / 恢 复 为 初 始 状 态 , 即 : 8 个 灯 都 不 亮end end endmodule把 以 上 流 水 灯 的 描 述 , 用

11、WebPACK Project Navigator 软 件 , 生 成 目 标 文 件 , 并 通 过 下 载 电 缆 写 入 芯 片XC9536 中 。 然 后 , 将 芯 片 插 到 目 标 板 上 , 即 可 看 到 流 水 灯 的 景 象 了 。 下 载 过 程 中 出 现 的 引 脚 配 置 画 面 和 图 2 相 同 。8.3 可 编 程 单 脉 冲 发 生 器 To top可 编 程 单 脉 冲 发 生 器 是 一 种 脉 冲 宽 度 可 编 程 的 信 号 发 生 器 , 其 输 出 为 TTL 电 平 。 在 输 入 按 键 的 控 制 下 ,产 生 单 次 的 脉 冲 ,

12、脉 冲 的 宽 度 由 8 位 的 输 入 数 据 控 制 ( 以 下 称 之 为 脉 宽 参 数 ) 。 由 于 是 8 位 的 脉 宽 参 数 , 故可 以 产 生 255 种 宽 度 的 单 次 脉 冲 。在 目 标 板 上 , I0 I7 用 作 脉 宽 参 数 输 入 , PULSE_OUT 用 做 可 编 程 单 脉 冲 输 出 , 而 KEY 和 /RB 作 为 启 动键 和 复 位 键 。 图 3 示 出 了 可 编 程 单 脉 冲 发 生 器 的 电 路 图 。图 3 可编程单脉冲发生器的电路图8.3.1 由 系 统 功 能 描 述 时 序 关 系可 编 程 单 脉 冲 发

13、生 器 的 操 作 过 程 是 :(1) 预 置 脉 宽 参 数 。(2) 按 下 复 位 键 , 初 始 化 系 统 。(3) 按 下 启 动 键 , 发 出 单 脉 冲 。以 上 三 步 可 用 三 个 按 键 来 完 成 。 但 是 , 由 于 目 标 板 已 确 定 , 故 考 虑 在 复 位 键 按 下 后 , 经 过 延 时 自 动 产 生 预 置 脉 宽参 数 的 动 作 。 这 一 过 程 可 用 图 4 的 时 序 来 描 述 。 图 4 可 编 程 单 脉 冲 发 生 器 的 时 序 图图 中 的 /RB 为 系 统 复 位 脉 冲 , 在 其 之 后 自 动 产 生 LO

14、AD 脉 冲 , 装 载 脉 宽 参 数 N。 之 后 , 等 待 按 下 /KEY键 。 /KEY 键 按 下 后 , 单 脉 冲 P_PULSE 便 输 出 。 在 此 , 应 注 意 到 : /KEY 的 按 下 是 与 系 统 时 钟 CLK 不 同 步的 , 不 加 处 理 将 会 影 响 单 脉 冲 P_PULSE 的 精 度 。 为 此 , 在 /KEY 按 下 期 间 , 产 生 脉 冲 P1, 它 的 上 跳 沿 与 时钟 取 得 同 步 。 之 后 , 在 脉 宽 参 数 的 控 制 下 , 使 计 数 单 元 开 始 计 数 。 当 达 到 预 定 时 间 后 , 再 产

15、 生 一 个 与 时 钟 同 步 的 脉 冲P2。 由 P1 和 P2 就 可 以 算 出 单 脉 冲 的 宽 度 Tw。8.3.2 流 程 图 的 设 计根 据 时 序 关 系 , 可 以 做 出 图 5 所 示 的 流 程 图 。在 系 统 复 位 后 , 经 一 定 的 延 时 产 生 一 个 预 置 脉 冲 LOAD, 用 来 预 置 脉 宽 参 数 。 应 该 注 意 : 复 位 脉 冲 不 能 用 来同 时 预 置 , 要 在 其 之 后 再 次 产 生 一 个 脉 冲 来 预 置 脉 宽 参 数 。为 了 产 生 单 次 的 脉 冲 , 必 须 考 虑 到 在 按 键 KEY 有

16、 效 后 , 可 能 会 保 持 较 长 的 时 间 , 也 可 能 会 产 生 多 个 尖 脉 冲 。因 此 , 需 要 设 计 一 种 功 能 , 使 得 当 检 测 到 KEY 有 效 后 就 封 锁 KEY 的 再 次 输 入 , 直 到 系 统 复 位 。 这 是 本 设 计 的一 个 关 键 所 在 。图 5 可 编 程 单 脉 冲 发 生 器 的 流 程 图8.3.3 系 统 功 能 描 述根 据 时 序 和 流 程 图 , 可 以 进 一 步 描 述 系 统 的 功 能 。 图 6 给 出 了 系 统 功 能 描 述 。图 6 可 编 程 单 脉 冲 发 生 器 的 系 统 功

17、 能与 系 统 的 时 序 相 呼 应 , 功 能 框 图 较 详 细 地 描 述 了 系 统 应 有 的 功 能 。 系 统 主 要 有 以 下 三 大 模 块 组 成 :(1) 延 时 模 块 P_DLY。(2) 输 入 检 测 模 块 P_DETECT。(3) 计 数 模 块 LE_EN_DCNT。在 此 阶 段 , 应 尽 可 能 详 细 地 描 述 系 统 , 给 出 合 理 的 逻 辑 关 系 , 进 行 正 确 的 功 能 模 块 分 配 。 例 如 : 不 要 把 计 数 模 块LE_EN_DCNT 与 延 时 模 块 P_DLY 混 在 一 起 , 否 则 给 后 续 的 设

18、 计 带 来 不 必 要 的 麻 烦 。 对 每 一 个 模 块 有 了 详 细 的 功 能描 述 , 下 一 步 就 可 以 将 其 细 化 为 具 体 的 逻 辑 电 路 了 。8.3.4 逻 辑 框 图将 系 统 功 能 描 述 用 逻 辑 框 图 来 描 述 , 可 以 用 图 7 来 说 明 。图 7 可编程单脉冲发生器的逻辑功能(1) 延时模块 P_DLY。CLK 给延时单元提供计数时基,在复位脉冲/RB 从有效变为无效时,启动延时单元。延时时间到后便输出一个负有效的脉冲,其宽度为一个时钟周期。(2) 输入检测模块 P_DETECT。/RB 复位系统后,该模块等待/KEY 的输入,

19、一旦检测到有下跳,便一方面封锁输入,一方面产生并保持与时钟同步的一个上跳脉冲。该脉冲用以开启计数模块 LE_EN_DCNT 的计数允许端 EN。(3) 计数模块 LE_EN_DCNT。脉宽参数端 IN 接受 8 位的数据,经数据预置端 LOAD 装载脉宽参数,在计数允许端有效后便开始计数。该计数器设计成为减法计数的模式,当其计数到 0 时,输出端 OUT 由高电平变为低电平。该输出与来自延时模块 P_DETECT的输出进行“与“ 运算,便可得到单脉冲的输出。但是,根据以上的逻辑功能,还不能方便地用 Verilog-HDL 来描述,需要进一步分析、细化各模块的功能。另外,即使分析清楚了各模块,也

20、应该将各模块分别进行仿真,正确无误后,再将所有的模块连接起来,进行系统级的仿真。8.3.5 延 时 模 块 的 详 细 描 述 及 仿 真如 图 8 所 示 , /RB 的 下 跳 沿 将 U1 复 位 , 上 跳 沿 将 U1 的 输 出 端 置 “1“。 同 时 , /RB 将 U3 复 位 , 其 输 出 端开 启 “三 与 门 “。 在 这 种 情 况 下 , 时 钟 CLK 通 过 “三 与 门 “输 入 到 U2 的 IN 端 , U2 延 时 一 定 时 间 ( 本 设 计 为 5个 时 钟 周 期 ) 后 输 出 下 跳 的 脉 冲 , 该 脉 冲 持 续 一 个 时 钟 周

21、期 后 又 上 跳 , 上 跳 沿 输 入 到 T 触 发 器 , T 触 发 器 的输 出 端 封 锁 “三 与 门 “。 这 一 时 序 关 系 如 图 9 所 示 。 图 8 延时模块的逻辑功能描述图 9 延时脉冲的时序关系图 8 中的延时单元 DLY_UNIT 可用图 10 的逻辑电路实现。图 10 延时模块中的计数器至此,延时模块 P_DLY 已可用 Verilog-HDL 来描述了。/* 延时模块 P_DLY 的 Verilog-HDL 描述 */module pulse ( CLK, RB, DLY_OUT); / 模块名及端口定义,范围至 endmoduleinput CLK,

22、 RB; / 输入端口定义output DLY_OUT; / 输出端口定义wire Q, QB, CNT_CLK; / 中间变量定义DFF_R U1 ( CLK, Q, RB); / D 触发器assign CNT_CLK = CLK / 赋值语句,实现把三与门的输出赋给 CNT_CLK DELAY U2 ( RB, CNT_CLK , DLY_OUT); / 延时单元T FF U3 ( DLY_OUT, QB, RB ); / T 触发器endmodule /* 延时单元 DELAY */module DELAY ( RESET_B, CLK, DIV_CLK ); / 模块名及端口定义,范

23、围至 endmoduleinput RESET_B, CLK; / 输入端口定义 output DIV_CLK; / 输出端口定义reg 2:0 Q; / 中间变量定义always ( posedge CLK or negedge RESET_B ) / always 语句,表示每当 CLK 的上升沿或 RESET_B 的下降沿到来时,完成 begin-end 之间语句的操作if ( !RESET_B ) / 如果 RESET_B=0 Q = 0; / 则 Q = 0,即:计数器清 0else if ( Q = 5 ) / 否则,如果 Q=5,即:计数器计数已满 Q = 0; / 则 Q =

24、0,即:计数器清 0 else Q = Q + 1; / 否则,计数器加 1assign DIV_CLK = (Q2 / 赋值语句,实现把三与门的输出反向后赋值给 DIV_CLKendmodule由于 D 触发器和 T 触发器的设计比较简单,这里就不做描述了,具体描述见参考文献(3)。 图 11 为延时模块的仿真结果。从仿真结果可以看出与设计是相吻合的。图 11 延时模块的仿真结果8.3.6 输 入 检 测 模 块 的 详 细 描 述 及 仿 真图 12 为 输 入 检 测 模 块 的 逻 辑 电 路 。 工 作 原 理 简 述 如 下 :(1) 系 统 复 位 脉 冲 /RB 使 U1、 U

25、2 复 位 。(2) U2 的 输 出 端 允 许 CLK 进 入 U1 的 CLK 端 。(3) U1 的 反 相 输 出 端 开 启 与 /KEY 相 关 的 与 门 , 允 许 /KEY 的 第 一 次 有 效 。(4) /KEY 无 效 ( 高 电 平 ) , 使 U1 的 D 端 为 低 电 平 。(5) P_DETECT 的 输 出 始 终 为 低 电 平 。(6) /KEY 有 效 ( 低 电 平 ) 。(7) U1 的 D 端 为 高 电 平 。(8) 待 时 钟 CLK 的 上 跳 沿 到 来 时 , 将 U1 的 D 端 高 电 平 打 至 U1 的 输 出 端 并 保 持

26、 。 此 输 出 的 上 跳 沿 与 时 钟CLK 同 步 。(9) 此 时 , U1 的 反 相 输 出 端 为 低 电 平 , 该 电 平 封 锁 与 /KEY 相 关 的 与 门 , 从 而 禁 止 /KEY 的 再 次 输 入 , 直到 复 位 脉 冲 /RB 的 到 来 。图 12 输入检测模块的逻辑功能描述/* 输入检测模块 P_DETECT 的 Verilog-HDL 描述 */module pulse ( CLK, RB, KEY , OUT); / 模块名及端口定义,范围至 endmoduleinput CLK, RB, KEY; / 输入端口定义output OUT; /

27、输出端口定义wire CLK2, T_QB ; / 中间变量定义assign CLK2 = CLK / 赋值语句,实现把与门的输出赋给 CLK2DFF_R U1 ( CLK2 , KEY / D 触发器TFF U2 ( OUT, T_QB, RB ); / T 触发器 endmodule由于 D 触发器和 T 触发器的设计比较简单,这里就不做描述了,具体描述见参考文献(3)。图 13 为输入检测模块的仿真结果。可以看出,在复位脉冲之后,KEY 的有效(低电平)使检测模块的输出为高电平,其一直保持到系统复位脉冲的到来。还可以看出,KEY 有效后,输出并不一定立刻出现高电平,而要等到时钟 CLK

28、的上跳沿到来。在输出为高电平的情况下,即使 KEY 再次有效,也不会影响输出。这说明模块一旦接受到了输入,便立刻禁止在其之后的输入,除非接收到复位脉冲的到来。在仿真时,应该给出尽可能多的信号组合来测试系统,否则会常常将人引入误区。图 13 输入检测模块的仿真结果8.3.7 计 数 模 块 的 详 细 描 述计 数 模 块 的 逻 辑 电 路 如 图 14 所 示 。 数 据 预 置 端 IN 的 数 据 在 LOAD 有 效 ( 高 电 平 ) 时 被 打 入 内 部 的 寄 存 器 。在 EN 有 效 的 情 况 下 , 计 数 器 开 始 做 减 法 计 数 。 当 计 数 值 减 为 0

29、 时 , 输 出 为 低 电 平 。 此 模 块 描 述 较 简 单 , 故 省略 模 块 的 仿 真 。图 14 计数模块的逻辑功能描述8.3.8 可 编 程 单 脉 冲 发 生 器 的 系 统 仿 真以 上 , 已 经 对 各 个 模 块 进 行 了 描 述 。 下 面 , 就 可 以 进 行 系 统 仿 真 了 。 可 编 程 单 脉 冲 发 生 器 的 系 统 描 述 可 见 参 考 文献 ( 3) 。图 15 为 可 编 程 单 脉 冲 发 生 器 的 逻 辑 仿 真 结 果 。 由 仿 真 结 果 可 以 看 出 , 单 脉 冲 输 出 的 持 续 时 间 ( 脉 冲 宽 度 )

30、由 输入 的 脉 宽 参 数 DATA_IN 决 定 。图 15 可编程单脉冲发生器的逻辑仿真结果8.3.9 可 编 程 单 脉 冲 发 生 器 的 硬 件 实 现仿 真 工 作 结 束 后 , 按 照 第 六 讲 介 绍 的 方 法 , 用 WebPACK Project Navigator 软 件 , 把 源 文 件 生 成 目 标 文件 , 并 通 过 下 载 电 缆 将 目 标 代 码 写 入 芯 片 。 这 样 , 就 可 以 实 际 检 测 该 硬 件 电 路 的 工 作 情 况 了 。图 16 为 可 编 程 单 脉 冲 发 生 器 的 实 测 波 形 。 本 例 中 , 脉 宽

31、 参 数 的 设 定 值 为 1。 因 此 , 应 该 产 生 宽 度 为 一 个时 钟 周 期 的 单 脉 冲 。 又 由 于 时 钟 为 10MHz, 即 周 期 为 100ns。 所 以 图 16 的 脉 宽 为 100ns。 实 测 的 数 据 显 示了 本 设 计 的 正 确 性 。图 16 可编程单脉冲发生器的实测波形参 考 文 献 :(1) J.B hasker 著 , 徐 振 林 等 译 : Verilog HDL, 机 械 工 业 出 版 社 , 北 京 , 2000.10.(2) 周 立 功 , 夏 宇 闻 : 单 片 机 与 CPLD 综 合 应 用 技 术 , 北 京 航 空 航 天 大 学 出 版 社 , p191-p196, 2003.9.(3) 常 晓 明 : Verilog-HDL 实 践 与 应 用 系 统 设 计 , 北 京 航 空 航 天 大 学 出 版 社 , 2003.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报