西工大硬件描述语言实验报告


    


    硬 件 描 述 语 言
    实 验 报 告















    班级 xxxxxxxx
    学号 xxxxxxxx
    姓名 xxxxxxxx


    目 录
    硬 件 描 述 语 言 0
    实 验 报 告 0
    实验 简单组合逻辑设计 2
    实验二 简单分频时序逻辑电路设计 4
    实验三 利条件语句实现计数分频时序电路 7
    实验四 阻塞赋值非阻塞赋值区 12
    实验五 always块实现较复杂组合逻辑电路 16
    实验六 Verilog中函数 21
    实验七 Verilog HDL中务(task) 25
    实验八 利限状态机进行时序逻辑设计 32
    实验九 利状态机实现较复杂接口设计 36
    实验十 利SRAM设计FIFO 46

    实验 简单组合逻辑设计

    实验目
    1掌握基组合逻辑电路实现方法
    2初步解两种基组合逻辑电路生成方法
    3学测试模块编写
    4通综合布局布线解层次仿真物理意义

    二 实验容
    次实验采Verilog HDL语言设计综合数较器功较数a数b结果果两数相输出结果1否出结果0写出测试模型进行较全面测试

    三 实验步骤
    1建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
    2编译源码测试模块测试模块源文件进行测试进行仿真
    3观察综合生成文件源文件点相点
    4综合时采FPGA器件观察综合结果什

    四 实验代码
    1模块源码
    module compare(equal a b)
    input ab
    output equal
    assign equal (a b)10
    endmodule

    2测试代码
    `timescale 1ns1ns

    module compare_t
    reg a b
    wire equal
    initial
    begin
    a0
    b0
    #100 a0 b1
    #100 a1 b1
    #100 a1 b0
    #100 a0 b0
    #100 stop
    end
    compare m(equal(equal)a(a)b(b))
    endmodule

    五 综合仿真
    RTL图仿真波形图:



    六 思考题
    1课练测试方法二中第二initial块什?第initial块什关系?

    测试方法二中第二initial暂停仿真便观察仿真波形第initial行关系

    2果第二initial块中没写出#10000者stop仿真会进行?

    果没写#10000仿真会直接停止没stop仿真会结束

    3较两种测试方法种更全面?

    第二种测试方法更全面测试更种变换情况




    实验二 简单分频时序逻辑电路设计

    实验目
    1掌握条件语句简单时序模块设计中
    2掌握verilog语句简单时序模块设计中
    3学Verilog模块中应计数器
    4学测试模块编写综合层次仿真

    二 实验容
    1always块@(posedge clk)@(negedge clk)结构表述时序逻辑设计12分频综合模型波形图:

    2模块进行RTL级仿真综合门级仿真布局布线仿真

    三 实验步骤
    1建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
    2编译源码测试模块测试模块源文件进行测试综合仿真波形图
    3观察综合生成文件源文件点相点
    4记录数完成实验报告

    四 实验代码
    1 模块代码
    module half_clk(resetclk_inclk_out)
    input clk_inreset
    output clk_out
    reg clk_out
    always @(posedge clk_in)
    begin
    if(reset)
    clk_out0
    else
    clk_out~clk_out
    end
    endmodule

    2测试代码
    `timescale 1ns100ps
    `define clk_cycle 50
    module top
    reg clkreset
    wire clk_out
    always #`clk_cycle clk~clk
    initial
    begin
    clk0
    reset1
    #10 reset0
    #110 reset1
    #100000 stop
    end
    half_clk m0(reset(reset)clk_in(clk)clk_out(clk_out))
    endmodule

    五 综合仿真
    RTL图仿真波形图



    六 思考题
    1果没reset信号否控制2分频clk_out信号相位?

    果没reset信号法控制2分频clk_out信号相位

    2 clk时钟触发(2分频产生时钟)直接产生4分频
    8分频者16分频时钟?

    助整型变量j做计数操作

    3clk时钟触发直接产生占空分频时钟?

    助整型变量j做计数操作clk时钟触发直接产生4分频8分频者16分频时钟产生占空分频时钟




    实验三 利条件语句实现计数分频时序电路

    实验目
    1掌握条件语句简单时序模块设计中
    2掌握基时序电路实现方法
    3学Verilog模块中应计数器
    4学测试模块编写综合层次仿真

    二 实验容
    1复课熟悉条件语句方式
    2建立工程编写源代码
    3综合布局布线仿真分析always语句时序逻辑中作
    4学测试模块编写综合仿真

    三 实验步骤
    1建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
    2编译源码测试模块测试模块源文件进行测试综合仿真
    3观察综合生成文件源文件点相点
    4综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列观察综合结果什

    四 实验代码
    1模块代码
    module fdivision(RESETF10MF500K)
    input F10MRESET
    output F500K
    reg F500K
    reg [70]j
    always @(posedge F10M)
    if(RESET) 低电复位
    begin
    F500K < 0
    j < 0
    end
    else
    begin
    if(j19) 计数器进行判断确定F500K信号否反转
    begin
    j < 0
    F500K < ~F500K
    end
    else
    j < j+1
    end
    endmodule

    2测试代码
    `timescale 1ns100ps
    `define clk_cycle 50
    module division_top
    reg F10MRESET
    wire F500K_clk
    always #`clk_cycle F10M~F10M
    initial
    begin
    RESET1
    F10M0
    #100 RESET0
    #100 RESET1
    #10000 stop
    end
    fdivision fdivision(RESET(RESET)F10M(F10M)F500K(F500K_clk))
    endmodule

    五 综合仿真
    RTL图仿真波形图:



    六 思考题
    1考虑实现意数值分频

    意分频代码:
    module divn(clkrst_no_clk)
    input clkrst_n
    output o_clk
    parameter WIDTH 3
    parameter N 5

    reg [WIDTH10] cnt_pcnt_n   count_posecount_nege
    reg clk_pclk_n

    assign o_clk (N1) clk (N[0])(clk_p&clk_n) clk_p 
    果N1o_clkclk 果N偶数o_clkclk_p 果N奇数o_clkclk_p & clk_n
    相运算clk_pclk_n两者高电低电clk两者相 差半clk相结果o_clk占空50

    always @ (posedge clk or negedge rst_n)
    begin
    if(rst_n)
    cnt_p<0
    else if (cnt_p(N1))
    cnt_p<0
    else
    cnt_pend

    always @ (posedge clk or negedge rst_n)
    begin 
    if(rst_n)
    clk_p<0
    else if (cnt_p<(N>>1)) 
    clk_p<0
    else
    clk_p<1
    end

    always @ (negedge clk or negedge rst_n)
    begin
    if(rst_n)
    cnt_n<0
    else if (cnt_n(N1))
    cnt_n<0
    else
    cnt_nend

    always @ (negedge clk or negedge rst_n)
    begin 
    if(rst_n)
    clk_n<0
    else if (cnt_n<(N>>1))
    clk_n<0
    else
    clk_n<1
    end  

    endmodule

    3 果综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列想想综合结果什?

    时钟分频实现方法果采行波时钟方式(异步设计)容易造成时钟偏差难控制芯片部逻辑基单元中触发器建立保持时间时芯片部参数代码时序分析结果分析正常
    果分频时钟作级设计工作时钟整设计时钟时钟实现话(异步设计)存信号跨时钟域转换问题跨时钟域信号果设计会采亚稳态

    3课试着利10MB时钟设计单周期形状周期波形

    模块代码:
    module zhouqiwave(resetF10Ma)
    input resetF10M
    output a
    reg a
    reg [150]b
    always@(reset or posedge F10M)
    if(reset)
    begin
    a<0
    b<0
    end
    else
    begin
    if(b199)
    begin
    a<~a
    bend
    else
    begin
    if(b299)
    begin
    a<~a
    bend
    if(b499)
    begin
    a<0
    bend
    else
    bend
    end
    endmodule
    测试代码:
    `timescale 10ns10ns

    module zhouqiwave_tb
    reg F10Mreset
    wire a
    always #5 F10M~F10M

    initial
    begin
    reset0
    F10M0
    #5 reset1
    #6000 stop
    end
    zhouqiwave m(reset(reset)F10M(F10M)a(a))
    endmodule




    实验四 阻塞赋值非阻塞赋值区

    实验目
    1通实验掌握阻塞赋值非阻塞赋值概念区
    2深入理解序执行发执行概念
    3解非阻塞阻塞赋值场合
    4学测试模块编写综合层次仿真

    二 实验容
    1次实验参课练三采Verilog HDL语言描述两模块分包含阻塞非阻塞赋值语句
    2编写测试模块相输入信号条件较阻塞非阻塞语句输出结果
    3模块进行RTL级仿真综合门级仿真布局布线仿真
    4分析阻塞赋值非阻塞赋值区

    三 实验步骤
    1仔细阅读课建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
    2编译源码测试模块测试模块源文件进行测试综合仿真
    3观察综合生成两电路结构图观察仿真波形图分析阻塞非阻塞赋值异
    4综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列观察综合结果什

    四 实验代码
    模块代码:
    a) 采阻塞赋值
    module blocking(clkabc)
    output [30] bc
    input [30] a
    input clk
    reg [30] bc
    always @(posedge clk)
    begin
    b a
    c b
    display(Blocking a d b d c dabc)
    end
    endmodule
    b) 采非阻塞赋值
    module non_blocking(clkabc)
    output [30] bc
    input [30] a
    input clk
    reg [30] bc
    always @(posedge clk)
    begin
    b < a
    c < b
    display(Non_Blocking a d b d c dabc)
    end
    endmodule

    测试代码:
    `timescale 1ns100ps
    `includeblockingv
    `includenon_blockingv
    module compareTop
    wire [30] b1c1b2c2
    reg [30] a
    reg clk
    initial
    begin
    clk0
    forever #50 clk~clk
    end

    initial
    begin
    a4'h3
    display(____________)
    # 100 a4'h7
    display(____________)
    # 100 a4'hf
    display(____________)
    # 100 a4'ha
    display(____________)
    # 100 a4'h2
    display(____________)
    # 100 display(____________)
    stop
    End

    non_blocking non_blocking(clkab2c2)
    blocking blocking(clkab1c1)
    endmodule

    五 综合仿真



    六 思考题
    1解释说明测试模块中forever语句语句否够执行?什?

    forever循环语句常产生周期性波形作仿真测试信号always处独立写程序中必须写initial块中

    2blocking模块中两种方法仿真综合结果会什样变化?作出仿真波形分析综合结果
    a)
    always@(posedge clk)
    begin
    cb
    ba
    end
    实现面非阻塞赋值相赋值结果

    b)
    always@(posedge clk)ba
    always@(posedge clk)cb
    出现竞争现象




    实验五 always块实现较复杂组合逻辑电路

    实验目
    1掌握always实现较组合逻辑电路方法
    2进步解assignalways两种组合电路实现方法区注意点
    3学测试模块中机数产生应
    4学综合层次仿真较结果

    二 实验容
    1运always语句块设计8位数选择器求:路输入数输出数均4位2进制数选择开关(少3位)输入数发生变化时输出数相应变化
    2写出测试模块模块功进行测试
    3模块进行RTL级仿真综合门级仿真布局布线仿真

    三 实验步骤
    1仔细阅读课建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
    2编译源码测试模块测试模块源文件进行测试综合仿真
    3观察综合生成两电路结构图观察仿真波形图分析assignalways两种组合电路实现方法区注意点
    4综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列观察综合结果什

    四 实验代码
    1模块代码:
    `define plus    3'd0
    `define minus  3'd1
    `define band    3'd2
    `define bor    3'd3
    `define unegate 3'd4

    通指令判断输入数执行相应操作包括加减求反
    指令作数指令身发生变化结果作出时反应
    module  alu(outopcodeab)
    output[70] out
    reg[70]    out
    input[20] opcode
    input[70] ab              操作数

    always@(opcode or a or b)    电敏感always块
    begin
    case(opcode)
    `plus  out a+b    加操作
    `minus out ab  减操作
    `band  out a&b    求
    `bor   out a|b   求          
    `unegate  out~a 求 反
    default  out8'hx 未收指令时输出意态
    endcase
    end
    endmodule   

    2测试代码:
    `timescale 1ns1ns
    `include  aluv
    module    alutest
    wire[70] out
    reg[70]  ab
    reg[20]  opcode
    parameter  times5
    initial
    begin      
    a{random}256  Give a radom number blongs to [0255]
    b{random}256  Give a radom number blongs to [0255]
    opcode3'h0
    repeat(times)
    begin
    #100    a{random}256  Give a radom number
      b{random}256  Give a radom number
      opcodeopcode+1
     end          
     #100  stop        
       end       
    alu    alu1(outopcodeab)
    endmodule

    五 综合仿真



    六 思考题
    1分析assign语句always语句进行组合逻辑设计时什异点?

    verilog语言中赋值语句两种种持续赋值语句(assign语句)种程赋值语句(always语句)
    持续赋值语句(assign语句)wire型变量赋值wire值存住需直值需持续赋值
    程赋值语句(always语句)reg 型变量赋值always语句执行需满足触发条件always程块里面容时刻执行需赋值象定义成寄存器类型便值保持住程赋值分阻塞赋值非阻塞赋值<两种

    2always块设计八功算术运算单元输入信号ab均4位功选择select3位输出信号out(5位)算术运算单元执行操作select信号关具体关系表列(忽略输出结果中溢溢位):
    Select信号
    函数输出
    3’b000
    a
    3’b001
    a+b
    3’b010
    ab
    3’b011
    ab
    3’b100
    ab(余数)
    3’b101
    a<<1
    3’b110
    a>>1
    3’b111
    (a>b)(副值较)
    模块代码:
    `define original 3'd0
    `define plus 3'd1
    `define minus 3'd2
    `define division 3'd3
    `define remainder 3'd4
    `define leftmov 3'd5
    `define rightmov 3'd6
    `define compare 3'd7

    module mathunit(outselectab)
    output [40]out
    reg [40] out
    input [20] select
    input [30] ab

    always@(select or a or b)
    begin
    case(select)
    ` original out a
    `plus out a+b
    `minus out ab
    `division out ab
    `remainder out ab
    `leftmov out a<<1
    `rightmov out a>>1
    `compare out a>bab
    default out 4’bx
    endcase
    end
    endmodule




    实验六 Verilog中函数

    实验目
    1解函数定义模块设计中
    2解函数综合性问题
    3解许综合器综合复杂算术运算

    二 实验容
    1次实验Verilog HDL语言函数调简单示范
    2实验采步时钟触发运算执行clk时钟周期会执行次运算
    3测试模块中通调系统务display时钟降显示计算结果

    三 实验步骤
    1建立工程文件
    2参资料编写源文件tryfunctv测试模块tryfuctTopv
    3测试模块tryfuctTop中调系统务display时钟降显示计算结果系统务display示例:
    @(negedge clk)
    display( time nd resultd n result )
    调函数仿真tryfuctTop模块波形

    四 实验代码
    1模块代码:
    module tryfunct(clkresultreset)
    output[310] result
    input resetclk
    reg[310] result
    always @(posedge clk) clk触发步运算
    begin
    if(reset) reset低时复位
    result<0
    else
    begin
    result < factorial(3)
    end
    end
    function [310] factorial 函数定义
    input [30] operand
    reg [30] index
    begin
    factorial operand 1 0
    for(index 2 index < operand index index + 1)
    factorial index * factorial
    end
    endfunction
    endmodule

    2测试代码:
    `include tryfunctv
    `timescale 1ns100ps
    `define clk_cycle 50

    module tryfuctTop
    reg[30] ni
    reg resetclk
    wire[310]result
    initial
    begin
    clk0
    n0
    reset1
    # 100 reset0
    # 100 reset1
    for(i0i<15ii+1)
    begin
    #200 ni
    end
    #100 stop
    end
    always #`clk_cycle clk~clk
    tryfunct m(clk(clk)n(n)result(result)reset(reset))
    endmodule

    五 综合仿真



    六 思考题
    1设计带控制端逻辑运算电路分完成整数方立方数5阶运算求综合编写测试模块出种层次仿真波形较

    模块代码:
    module myfunction(clknresultresetsl)
    output[60] result
    input[20] n
    input resetclk
    input [10] sl
    reg[60] resultdefine input and output
    always @(posedge clk)
    begin
    if(reset)
    result<0
    else
    begin
    case(sl)
    2'd0 result2'd1 result2'd2 resultendcase
    end
    end
    function[60] square
    input [20] operand
    begin
    squareoperand*operand
    end
    endfunction
    function[60] cubic
    input [20] operand
    begin
    cubicoperand*operand*operand
    end
    endfunction
    function[60] factorial
    input [20] operand
    reg [20] index
    begin
    factorial 1
    for(index 2 index < operand index index + 1)
    factorial index * factorial
    end
    endfunction
    endmodule
    测试代码:
    `include myfunctionv
    `timescale 1ns100ps
    `define clk_cycle 50
    module testmyfunc
    reg[20] n
    reg resetclk
    reg[10] sl
    wire[60] result
    parameter times20
    initial
    begin
    n0
    reset1
    clk0
    sl0
    #100 reset0
    #100 reset1
    repeat(times)
    begin
    #50 sl{random}3
    #50 n{random}6
    end
    #1000 stop
    end
    always #`clk_cycle clk~clk
    myfunction myfunct(clk(clk)n(n)result(result)reset(reset)sl(sl))
    endmodule




    实验七 Verilog HDL中务(task)

    实验目
    1掌握务Verilog模块设计中应
    2学会电敏感列表always中拼接操作务阻塞赋值等语句生成复杂组合逻辑高级方法

    二 实验容
    利电敏感always模块较两变量排序务设计出4(4位)行输入数高速排序组合逻辑

    三 实验步骤
    1建立工程文件编写模块源码测试模块求测试模块源文件进行较全面测试
    2编译源码测试模块测试模块源文件进行测试综合仿真
    3观察务仿真波形分析task带处
    4综合时采FPGA器件Altera公司Cyclone II系列Stratix III系列观察综合结果什

    四 实验代码
    1模块代码:
    module sort4(rarbrcrdabcd)
    output[30] rarbrcrd
    input[30] abcd
    reg[30] rarbrcrd
    reg[30] vavbvcvd
    always @ (a or b or c or d)
    begin
    {vavbvcvd}{abcd}
    sort2(vavc) va vc
    sort2(vbvd) vb vd
    sort2(vavb) va vb
    sort2(vcvd) vc vd
    sort2(vbvc) vb vc
    {rarbrcrd}{vavbvcvd}
    end
    task sort2
    inout[30] xy
    reg[30] tmp
    if(x>y)
    begin
    tmpx
    xy
    ytmp
    end
    endtask
    endmodule

    2测试代码:
    `timescale 1ns100ps
    `include sort4v
    module task_Top
    reg[30] abcd
    wire[30] rarbrcrd
    initial
    begin
    a0b0c0d0
    repeat(5)
    begin
    #100 a {random}15
    b {random}15
    c {random}15
    d {random}15
    end
    #100 stop
    end
    sort4 sort4 (a(a)b(b)c(c)d(d)ra(ra)rb(rb)rc(rc)rd(rd))
    endmodule

    五 综合仿真



    六 思考题
    两种方法设计功相模块该模块够完成四8位二进制输入数泡排序求:
    a) 第种方法模仿面例子纯组合逻辑实现
    b) 第二种假设8位数时钟节拍串行输入求时钟触发务执行法时钟周期完成次数交换操作
    c) 较两种方法运行速度消耗资源

    方法:
    模块代码:
    module bub(aibicidiaobocodo)
    input[70] aibicidi
    output[70] aobocodo
    reg[70] aobocodo
    reg[70] arbrcrdr
    reg[30] n
    parameter so4

    always @(ai or bi or ci or di)
    begin
    {arbrcrdr}{aibicidi}
    for(nson>1nn1)
    bb(arbrcrdrn)
    {aobocodo}{arbrcrdr}
    end

    task bb
    inout[70] x1x2x3x4
    input[30] n
    reg[70] temp
    reg[30] s
    if(n>0)
    for(s1sbegin
    case(s)
    1sort2(x1x2)
    2sort2(x2x3)
    3sort2(x3x4)
    endcase
    end
    endtask

    task sort2
    inout[70] xy
    reg[70] temp
    if(x>y)
    begin
    tempx
    xy
    ytemp
    end
    endtask
    endmodule
    测试代码:
    `timescale 1ns100ps

    module buubTEST
    reg[70] aibicidi
    wire[70] aobocodo

    initial
    begin
    ai0bi0ci0di0
    repeat(4)
    begin
    #100 ai{random}256
    bi{random}256
    ci{random}256
    di{random}256
    end
    #100 stop
    end

    bub m0(aibicidiaobocodo)
    endmodule
    方法二(时序逻辑):
    模块代码:
    module bub_1(inclkarbrcrdraobocodo)
    input[70] in
    imput clk
    output[70] arbrcrdr
    reg[70] aobocodo
    reg[70] arbrcrdr
    reg[30] nsq
    parameter so4

    initial
    begin
    n0s0q0
    end

    always @(posedge clk)
    begin
    if(nbegin
    nn+1
    arbrcrdrend
    if(nso+1)
    begin
    nsq<1
    end
    if(s>1)
    begin
    {aobocodo}<{arbrcrdr}
    if(qbegin
    case(q)
    1sort2(arbr)
    2sort2(brcr)
    3sort2(crdr)
    endcase
    qend
    else
    begin
    sq<1
    end
    end
    end endalways

    task sort2
    inout[70] xy
    reg[70] temp
    if(x>y)
    begin
    tempx
    xy
    ytemp
    end
    endtask
    endmodule
    测试代码:
    `timescale 1ns100ps

    module bubTEST_1
    reg[70] in
    reg clk
    wire[70] aobocodoarbrcrdr

    initial
    begin
    clk0
    in0
    begin
    repeat(4)
    #100 in{random}256
    end
    #100 stop
    end

    always #50 clk~clk
    bub_1 m0(inclkarbrcrdraobocodo)
    endmodule




    实验八 利限状态机进行时序逻辑设计

    实验目
    1掌握利限状态机实现般时序逻辑分析方法
    2掌握Verilog编写综合限状态机标准模板
    3掌握Verilog编写状态机模块测试文件般方法

    二 实验容
    1阅读书例子熟悉状态机设计流程设计思路
    2设计串行数检测器求:连续441时输出1输入情况0
    3建立工程编写源代码测试模块
    4布局布线级仿真

    三 实验步骤
    1建立工程编写模块源码
    2编写测试模块思考模块实现逐位左移循环进入状态机测试
    3布局布线仿真结合出状态转化图理解状态机工作原理
    4记录数完成实验报告

    四 实验代码
    1模块代码:
    module seqdet(xzclkrststate)
    input xclkrst
    output z
    output[20] state
    reg[20] state
    wire z
    parameter IDLE'd0 A'd1 B'd2C'd3 D'd4E'd5 F'd6G'd7
    assign z ( stateE && x0 ) 1 0

    always @(posedge clk)
    if(rst)
    state < IDLE
    else
    casex(state)
    IDLE if(x1)
    state < A
    A if(x0)
    state < B
    B if(x0)
    state < C
    else
    state < F
    C if(x1)
    state < D
    else
    state < G
    D if(x0)
    state < E
    else
    state < A
    E if(x0)
    state < C
    else
    state < A
    F if(x1)
    state < A
    else
    state < B
    G if(x1)
    state < F
    defaultstateIDLE
    endcase
    endmodule

    2测试代码:
    `timescale 1ns1ns
    `include seqdetv
    module seqdet_Top
    reg clkrst
    reg[230] data
    wire[20] state
    wire zx
    assign xdata[23]
    always #10 clk ~clk
    always @(posedge clk)
    data{data[220]data[23]}
    initial
    begin
    clk0
    rst1
    #2 rst0
    #30 rst1
    data 'b1100_1001_0000_1001_0100
    #500 stop
    end
    seqdet m(xzclkrststate)
    endmodule

    五 综合仿真



    六 思考题
    1什源文件中状态转化非阻塞赋值语句?果换成阻塞赋值语句?什?

    时序块 RTL 代码中非阻塞赋值
    非阻塞赋值块结束完成赋值操作赋值方式避免仿真出现险竞争现象
    组合 RTL 代码中阻塞赋值
    阻塞方式变量进行赋值时变量值赋值语句执行完立改变
    非阻塞赋值方式进行赋值时赋值语句步执行通常时钟时变量进行赋值时钟进行采样




    实验九 利状态机实现较复杂接口设计

    实验目
    1学运状态机控制逻辑开关设计出较复杂接口逻辑
    2复杂设计中务(task)结构提高程序读性
    3加深综合风格模块认识

    二 实验容
    利状态机实现较复杂接口设计

    三 实验步骤
    1建立工程编写模块源码
    2编写测试模块思考状态机实现复杂接口设计
    3布局布线仿真
    4记录数完成实验报告

    四 实验代码
    1模块代码:
    module writing(resetclkaddressdatasdaack)
    input reset clk
    input[70] data address
    inout sda sdaack
    output ack
    reg link_write link_write
    reg[30] state
    reg[40] sh8out_state
    reg[70] sh8out_buf
    reg finish_F
    reg ack
    parameter idle0addr_write1data_write2stop_ack3
    parameter bit01bit12bit23bit34bit45bit56bit67bit78

    assign sdalink_write sh8out_buf[7] 1'bz

    always @(posedge clk)
    begin
    if(reset)
    begin
    link_write <0
    state finish_F <0
    sh8out_state ack <0
    sh8out_buf <0
    end
    else
    case(state)
    idle
    begin
    link_write <0
    finish_F <0
    sh8out_stateack <0
    sh8out_buf
    state end
    addr_write
    begin
    if(finish_F0)
    begin
    shift8_out
    end
    else
    begin
    sh8out_state < idle
    sh8out_buf < data
    statefinish_F<0
    end
    end
    data_write
    begin
    if(finish_F0)
    shift8_out
    else
    begin
    link_write<0
    state< stop_ack
    finish_F<0
    ack<1
    end
    end
    stop_ack
    begin
    ack<0
    stateend
    endcase
    end

    task shift8_out
    begin
    case(sh8out_state)
    idle
    begin
    link_write<1
    sh8out_stateend
    bit7
    begin
    link_write<1
    sh8out_statesh8out_bufend
    bit6
    begin
    sh8out_statesh8out_bufend
    bit5
    begin
    sh8out_statesh8out_bufend
    bit4
    begin
    sh8out_statesh8out_bufend
    bit3
    begin
    sh8out_statesh8out_bufend
    bit2
    begin
    sh8out_statesh8out_bufend
    bit1
    begin
    sh8out_statesh8out_bufend
    bit0
    begin
    link_write<0
    finish_F<1
    end
    endcase
    end
    endtask
    endmodule

    2测试代码:
    `timescale 1ns100ps
    `define clk_cycle 50

    module writingTop
    reg resetclk
    reg[70]dataaddress
    wire acksda

    always #`clk_cycle clk ~clk

    initial
    begin
    clk0
    reset1
    data0
    address0
    #(2*`clk_cycle) reset0
    #(2*`clk_cycle) reset1
    #(100*`clk_cycle) stop
    end

    always@(posedge ack)
    begin
    datadata+1
    addressaddress+1
    end

    writing writing(reset(reset)clk(clk)data(data)address(address)ack(ack)sda(sda))
    endmodule

    五 思考题
    1彻底搞清楚例参考第二部分第16章实际例子独立编写实现EEPROM全部读写功行转换IIC串行总线读写信号模块编写完整符合工程求测试模块进行种层次仿真观察波形

    `timescale 1ns1ns
    module EEPROM_WR(SDASCLACKRESETCLKWRRDADDRDATA)
    output SCL 串行时钟线
    output ACK 读写周期应答信号
    input RESET 复位信号
    input CLK 时钟信号输入
    input WRRD 读写信号
    input[100] ADDR 址线
    inout SDA 串行数线
    inout[70] DATA 行数线
    reg ACK
    reg SCL
    reg WFRF 读写操作标志
    reg FF 标志寄存器
    reg [10] head_buf 启动信号寄存器
    reg[10] stop_buf 停止信号寄存器
    reg [70] sh8out_buf EEPROM写寄存器
    reg [80] sh8out_state EEPROM 写状态寄存器
    reg [90] sh8in_state EEPROM 读状态寄存器
    reg [20] head_state 启动状态寄存器
    reg [20] stop_state 停止状态寄存器
    reg [100] main_state 状态寄存器
    reg [70] data_from_rm EEPROM读寄存器
    reg link_sda SDA 数输入EEPROM开关
    reg link_read EEPROM读操作开关
    reg link_head 启动信号开关
    reg link_write EEPROM写操作开关
    reg link_stop 停止信号开关
    wire sda1sda2sda3sda4

    串行数开关控制次序输出输入
    assign sda1 (link_head) head_buf[1] 1'b0
    assign sda2 (link_write) sh8out_buf[7] 1'b0
    assign sda3 (link_stop) stop_buf[1] 1'b0
    assign sda4 (sda1 | sda2 | sda3)
    assign SDA (link_sda) sda4 1'bz
    assign DATA (link_read) data_from_rm 8'hzz

    状态机状态定义
    parameter
    Idle 11'b00000000001
    Ready 11'b00000000010
    Write_start 11'b00000000100
    Ctrl_write 11'b00000001000
    Addr_write 11'b00000010000
    Data_write 11'b00000100000
    Read_start 11'b00001000000
    Ctrl_read 11'b00010000000
    Data_read 11'b00100000000
    Stop 11'b01000000000
    Ackn 11'b10000000000

    行数串行输出状态
    sh8out_bit7 9'b000000001
    sh8out_bit6 9'b000000010
    sh8out_bit5 9'b000000100
    sh8out_bit4 9'b000001000
    sh8out_bit3 9'b000010000
    sh8out_bit2 9'b000100000
    sh8out_bit1 9'b001000000
    sh8out_bit0 9'b010000000
    sh8out_end 9'b100000000
    串行数行输出状态
    Parameter
    sh8in_begin 10'b0000000001
    sh8in_bit7 10'b0000000010
    sh8in_bit6 10'b0000000100
    sh8in_bit5 10'b0000001000
    sh8in_bit4 10'b0000010000
    sh8in_bit3 10'b0000100000
    sh8in_bit2 10'b0001000000
    sh8in_bit1 10'b0010000000
    sh8in_bit0 10'b0100000000
    sh8in_end 10'b1000000000
    启动状态
    head_begin 3'b001
    head_bit 3'b010
    head_end 3'b100
    停止状态
    stop_begin 3'b001
    stop_bit 3'b010
    stop_end 3'b100

    parameter YES 1
    NO 0

    产生串行时钟scl输入时钟二分频
    always @(negedge CLK)
    if(RESET)
    SCL < 0
    else
    SCL < ~SCL

    状态机程序
    always @ (posedge CLK)
    if(RESET)
    begin
    link_read < NO
    link_write < NO
    link_head < NO
    link_stop < NO
    link_sda < NO
    ACK < 0
    RF < 0
    WF < 0
    FF < 0
    main_state < Idle
    end
    else
    begin
    casex(main_state)
    Idle
    begin
    link_read < NO
    link_write < NO
    link_head < NO
    link_stop < NO
    link_sda < NO
    if(WR)
    begin
    WF < 1
    main_state < Ready
    end
    else if(RD)
    begin
    RF < 1
    main_state < Ready
    end
    else
    begin
    WF < 0
    RF < 0
    main_state < Idle
    end
    end
    Ready
    begin
    link_read < NO
    link_write < NO
    link_stop < NO
    link_head < YES
    link_sda < YES
    head_buf[10] < 2'b10
    stop_buf[10] < 2'b01
    head_state < head_begin
    FF < 0
    ACK < 0
    main_state < Write_start
    end
    Write_start
    if(FF 0)
    shift_head
    else
    begin
    sh8out_buf[70] < {1'b11'b01'b11'b0ADDR[108]1'b0}
    link_head < NO
    link_write < YES
    FF < 0
    sh8out_state < sh8out_bit6
    main_state < Ctrl_write
    end
    Ctrl_write
    if(FF 0)
    shift8_out
    else
    begin
    sh8out_state < sh8out_bit7
    sh8out_buf[70] < ADDR[70]
    FF < 0
    main_state < Addr_write
    end
    Addr_write
    if(FF 0)
    shift8_out
    else
    begin
    FF < 0
    if(WF)
    begin
    sh8out_state < sh8out_bit7
    sh8out_buf[70] < DATA
    main_state < Data_write
    end
    if(RF)
    begin
    head_buf < 2'b10
    head_state < head_begin
    main_state < Read_start
    end
    end
    Data_write
    if(FF 0)
    shift8_out
    else
    begin
    stop_state < stop_begin
    main_state < Stop
    link_write < NO
    FF < 0
    end
    Read_start
    if(FF 0)
    shift_head
    else
    begin
    sh8out_buf< {1'b11'b01'b11'b0ADDR[108]1'b1}
    link_head < NO
    link_sda < YES
    link_write < YES
    FF < 0
    sh8out_state < sh8out_bit6
    main_state < Ctrl_read
    end
    Ctrl_read
    if(FF 0)
    shift8_out
    else
    begin
    link_sda < NO
    link_write < NO
    FF < 0
    sh8in_state < sh8in_begin
    main_state < Data_read
    end
    Data_read
    if(FF 0)
    shift8in
    else
    begin
    link_stop < YES
    link_sda < YES
    stop_state < stop_bit
    FF < 0
    main_state < Stop
    end
    Stop
    if(FF 0)
    shift_stop
    else
    begin
    ACK < 1
    FF < 0
    main_state < Ackn
    end
    Ackn
    begin
    ACK < 0
    WF < 0
    RF < 0
    main_state < Idle
    end
    default main_state < Idle
    endcase
    end
    endmodule




    实验十 利SRAM设计FIFO

    实验目
    1学掌握存取队列理状态机设计基方法
    2解掌握存储器构成FIFO接口设计基技术
    3工程概念编写完整测试模块达完整测试覆盖

    二 实验容
    利SRAM模型设计SRAM读写控制逻辑SRAM行户表现FIFO(先进先出存储器)

    三 实验步骤


    四 实验代码
    `define FIFO_SIZE 8
    `include sramv 仿真工具需加句 sramv模块编译
    `timescale 1ns1ns

    module t
    reg [70] in_data FIFO数总线
    reg fifordfifowr FIFO控制信号
    wire[70] out_data
    wire nfull nempty FIFO状态信号
    reg clkrst
    wire[70] sram_data SRAM数总线
    wire[100] address SRAM址总线
    wire rdwr SRAM读写控制信号

    reg [70] data_buf[`FIFO_SIZE0] 数缓存结果检查
    integer index 读写data_buf指针

    系统时钟
    initial clk0
    always #25 clk~clk

    测试激励序列
    initial
    begin
    fiford1
    fifowr1
    rst1
    #40 rst0
    #42 rst1
    if (nempty) display(timeError FIFO be empty nempty should be low\n)
    连续写FIFO
    index 0
    repeat(`FIFO_SIZE)
    begin
    data_buf[index]random
    write_fifo(data_buf[index])
    index index + 1
    end
    if (nfull)
    display(timeError FIFO full nfull should be low\n)
    repeat(2) write_fifo(random)
    #200
    连续读FIFO
    index0
    read_fifo_compare(data_buf[index])
    if (~nfull)
    display(timeError FIFO not full nfull should be high\n)
    repeat(`FIFO_SIZE1)
    begin
    index index + 1
    read_fifo_compare(data_buf[index])
    end
    if (nempty)
    display(timeError FIFO be empty nempty should be low\n)
    repeat(2) read_fifo_compare(8'bx)
    reset_fifo
    写读FIFO
    repeat(`FIFO_SIZE*2)
    begin
    data_buf[0] random
    write_fifo(data_buf[0])
    read_fifo_compare(data_buf[0])
    end
    异常操作
    reset_fifo
    read_fifo_compare(8'bx)
    write_fifo(data_buf[0])
    read_fifo_compare(data_buf[0])
    stop
    end

    fifo_interface fifo_mk (in_data(in_data)
    out_data(out_data)
    fiford(fiford)
    fifowr(fifowr)
    nfull(nfull)
    nempty(nempty)
    address(address)
    sram_data(sram_data)
    rd (rd)wr(wr)
    clk(clk)rst(rst) )

    sram m1 ( Address (address)
    Data (sram_data)
    SRG (rd) SRAM读
    SRE (1'b0) SRAM片选低效
    SRW (wr) ) SRAM写

    task write_fifo
    input [70] data
    begin
    in_datadata
    #50 fifowr0 SRAM中写数
    #200 fifowr1
    #50
    end
    endtask

    task read_fifo_compare
    input [70] data
    begin
    #50 fiford0 SRAM中读数
    #200 fiford1
    if (out_data data)
    display(timeError Data retrieved (h) not match the one stored (h) \n
    out_data data)
    #50
    end
    endtask

    task reset_fifo
    begin
    #40 rst0
    #40 rst1
    end
    endtask
    endmodule
    余代码参见实验指导


    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 2 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    电子硬件工程师工作职责描述

    电子硬件工程师工作职责描述1、负责设计嵌入式硬件平台开发(主要为RK、MTK平台平板电脑设计与开发),并进行调试;2、负责方案和元器件选型、PCB设计评审、硬件可靠性评估,包括时序、纹波噪声、...

    2年前   
    487    0

    c语言实验报告

    c语言实验报告  学号:__________    姓名:__________    班级:__________    日期:__________   指导教师:__________    成...

    11年前   
    839    0

    C语言实验报告《指针》

    C语言实验报告《指针》  学号:__________    姓名:__________    班级:__________    日期:__________   指导教师:__________ ...

    11年前   
    1004    0

    C语言实验报告《数组》

    C语言实验报告《数组》  学号:__________    姓名:__________    班级:__________    日期:__________  指导教师:__________  ...

    11年前   
    915    0

    C语言实验报告《函数》

    C语言实验报告《函数》  学号:__________    姓名:__________    班级:__________    日期:__________  指导教师:__________  ...

    12年前   
    1417    0

    《高级语言程序设计》实验报告

    1.掌握在Visual C++6.0环境下C程序的建立、编辑、编译和执行过程。2.掌握C程序的最基本框架结构,完成简单程序的编制与运行。3.了解基本输入输出函数scanf()、printf ()...

    2年前   
    509    0

    C语言程序设计实验报告

    C语言程序设计实验报告  实验名称 计算出1000以内10个最大素数之和   实验目的   1、熟练掌握if、if…else、if…else if语句和witch语句格式及使用方法,掌握if语...

    11年前   
    1005    0

    C语言实验报告《综合实验》

    C语言实验报告《综合实验》  学号:__________    姓名:__________    班级:__________    日期:__________  指导教师:__________...

    10年前   
    891    0

    《高级语言程序设计》实验报告

    设计一种用单链表存储多项式的结构(每个结点存储一项的系数和指数,类型都为int)并编写一个产生多项式链表的函数和一个实现两个多项式相加和相乘的函数。

    6年前   
    3558    0

    硬件测试工程师岗位的主要职责描述

    硬件测试工程师岗位的主要职责描述职责:1.负责360IOT业务线家庭智能安防产品的硬件固件测试,负责从试产到量产导入的品质保证工作;2.根据项目需求、硬件规格书以及相关测试标准,设计测试标准以...

    2年前   
    473    0

    西工大社会实践报告

    西工大社会实践报告  【引言】20xx年7月13日,由西北工业大学材料学院和理学院组成的广州行社会实践队从西安出发赴有“羊城”美誉之称的广州来到几家知名企业进行零距离接触。在出发之前,我们广州...

    10年前   
    353    0

    “提高学生英语言语技能”研究课题实验报告

    “提高学生英语言语技能”研究课题实验报告  “提高学生英语言语技能”研究课题实验报告  一、课题研究的背景和目标 1、问题的提出现在中学英语教学最大的弊病就是学生缺少言语技能。为了改善学生的交...

    12年前   
    449    0

    2021年c语言实验报告分析总结

     2021年c语言实验报告分析总结撰写人:___________日 期:___________2021年c语言实验报告分析总结在科技高度发展的今天,计算机在人们之中的作用越来越突出。而c语言...

    3年前   
    584    0

    操作系统实验报告C语言实现银行家算法

    实 验 报 告题 目名 称C语言实现银行家算法院 系信息科学与工程学院班 级完成时间指导老师本次实验成绩组长联系电话邮件地址组员(姓名,学号)主要任务程序算法的编写、实现、运行调...

    3年前   
    505    0

    铜陵学院C语言程序设计实验报告

    《C语言程序设计》 实验报告第二学期班 级 学 号姓 名指导教师实验一 Visual C++ 6.0编程环境与C语言程序的调试过程一、实验学时2 学时。二、...

    1年前   
    297    0

    C语言实验报告《逻辑结构程序设计》

    C语言实验报告《逻辑结构程序设计》  学号:__________    姓名:__________    班级:__________    日期:__________   指导教师:_____...

    12年前   
    781    0

    硬件维保方案

    IT设备整体服务方案Version 1.02011年X月 目 录第1章、 概述 41.1、 前言 41.2、 IT服务外包定义及发展现状 51.3、 IT服务外包优势 6第2章、 方案描述 ...

    3年前   
    747    0

    硬件组成更明了

    硬件组成更明了【教学目标】1.知识与技能:(1)认识机箱内的硬件。(2)了解机箱内主要部件的作用。(3)了解电脑系统的组成。(4)了解电脑的基本工作流程。2.过程与方法:(1)通过图片或实物观...

    3年前   
    640    0

    硬件设备运维方案

    目 录1 概述 222 服务内容 222.1 服务目标 222.2 信息资产统计服务 232.3 网络、安全系统运维服务 232.4 服务器设备、存储系统运维服务 262.5 数据库系统运维...

    4年前   
    1259    0

    集体配送硬件要求

    集体配送应具备如下功能间:收货验货间、食品库房、洁具间、粗加工间、切配间、烹饪间(包含蒸饭)、二次更衣间、分装间、清洗消毒间。

    6年前   
    1460    0

    文档贡献者

    文***享

    贡献于2021-01-01

    下载需要 2 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档