- 1、本文档共48页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]同步数字系统设计基础
模块体系结构框图 数据路径 控制逻辑 4bit加法器 9bit移位寄存器 CLK:同步时钟 Load:数据加载信号 Sh: ACC右移信号 Ad:ACC[8:4]更新信号 Done:结束信号 St:开始信号 M:乘数值信号 数据路径设计-加法器部分 module my_mult_data(reset,clk, mul, muld, load, sh, ad, m, product); input reset; input clk; //时钟 input load; //数据加载信号 input sh; // ACC寄存器值右移信号 input ad; // ACC[8:4]值更新信号 input [3:0] mul; // 4bit乘数 input [3:0] muld;// 4bit被乘数 output m; // 是否加被乘数信号 output [7:0] product; //乘法运算结果 ?// 模块内局部信号 reg [8:0] acc; // ACC寄存器 wire [4:0] sum; // 加法器输出部分和 ? assign sum = {1‘b0,muld}+ acc[7:4];// 描述加法器 数据路径设计-移位寄存器部分 assign m = acc[0];? // 将ACC最低位送m //用always块描述累加器操作 always @(posedge reset or posedge clk) if(reset==1) acc=9‘d0; // 复位信号reset为1时ACC置0 else if(load ==1) acc={5‘b00000,mul}; // 加载0和乘数到ACC else if(ad ==1) acc[8:4]= sum; // 加载求和值到ACC else if(sh ==1) acc={1‘b0,acc[8:1]}; // ACC右移?一位 assign product = acc[7:0];? // 乘法运算结果 endmodule 模块时序图设计 对较复杂的关键电路,结合算法流程图和初步的体系结构图,设计者应画出模块的时序图,必要时交互修改体系结构图。这是一个反复修改、细化设计的过程,需要设计者灵和应用相关知识和发挥创意,将事件驱动的算法转换为时钟驱动的控制信号和数据操作。 计算结果 控制逻辑ASM图 说明: 根据算法流程图、体系结构图或时序图,分配状态,并画出ASM图。 信号说明: Load:数据加载信号 Sh: ACC右移信号 Ad:ACC[8:4]更新信号 Done:结束信号 St:开始信号 M:乘数值信号 K: ACC右移次数为3时, k=1 控制逻辑的verilog设计 module my_mult_ctl(reset,clk, start, m, load, sh, ad, done); input clk; //时钟 input st; //开始信号 input m; // 是否加被乘数信号 output load; reg load; //数据加载信号 output sh; reg sh; // ACC寄存器值右移信号 output ad; reg ad; // ACC[8:4]值更新信号 output done; reg done; //结束信号 ? wire k; //累加结束信号 reg [1:0] cnt; //累加计数器 reg [1:0] state, next_state; parameter[1:0] S0=2’b00, S1=2’b01, S2=2’b10, S3=2’b11; 控制逻辑的verilog设计 always @(st or k or m or state) // 状态转移和输出,状态机组合逻辑电路 begin load=0; //非阻塞赋值,在本次always操作完成时才赋值, sh=0; //在本次always中其它地方可以改变该值,实际 ad=0; //赋值是最后一次改变的值。 done=0; case(state) S0: if( st==1’b1) //开始 begin load=1’b1;
文档评论(0)