risc-v中文社区

 找回密码
 立即注册
查看: 2244|回复: 1

[原创] verilog中数据交换(2)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-9-18 14:03:28 | 显示全部楼层 |阅读模式
直接交叉输出是上帖的做法,其实有时候需要模块内部寄存器之间在一个时钟周期之内互相交换数据,可以借助非阻塞赋值用二个FDRE达到目的:
module change_2register_1cycle(
        input clk,
        input enable,
        input reset,
        input in,
        output out
);
        //交换tmp1和tmp2两个寄存器的值
        reg tmp1;
        reg tmp2;
        always @(posedge clk) begin
                if(reset) begin
                        tmp1 <= 1'b0;
                        tmp2 <= 1'b0;
                end
                else if(enable == 1'b1) begin //enable必须是一个周期的脉冲信号
                        tmp1 <= in; //当启动交换时,先将输入送给tmp临时寄存器 本实验并不是研究模块的in和out,所以in,out只是为实验而实验而已。
                end
                else begin
                        tmp1 <= tmp2;
                        tmp2 <= tmp1;
                        //上面两句执行之后:tmp1就是tmp2的值,而tmp2就是原来tmp1的旧值
                end
        end
        assign out = tmp2;
endmodule

回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-18 14:05:09 | 显示全部楼层
综合之后的图如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-20 21:33 , Processed in 0.017633 second(s), 18 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表