⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctrl.txt

📁 minicore为一个加法器的最小结构
💻 TXT
字号:
`timescale 1ns/100ps
//_____________________________________________
// Company      :   tud			      	
// Author       :   ander			
// E-Mail   	:   <email>					
//								
// Date         :   Thu Nov  2 12:23:14 2006				
// Last Change  :   Thu Nov  2 12:23:14 2006			
// Module Name  :   ctrl					
// Filename     :   ctrl.v				
// Project Name	:   prz/tutorial06				
// Description	:   <short description>			
//								
//_____________________________________________
module ctrl (
	clk,
	a_reset_l,
	instr,
	data_sel,
	sel_acc,
	sel_cy,
	sel_opa,
	sel_opb,
	sel_ram_adr,
	sel_func,
	ram_cen,
	ram_wen,
	ram_oen
);

	input		clk;
	input		a_reset_l;
	input	[2:0]	instr;

	output	[1:0]	data_sel;
	output		sel_acc;
	output		sel_cy;
	output		sel_opa;
	output	[1:0]	sel_opb;
	output		sel_ram_adr;
	output		sel_func;
	output		ram_cen;
	output		ram_wen;
	output		ram_oen;

	reg	[1:0]	data_sel;
	reg		sel_acc;
	reg		sel_cy;
	reg		sel_opa;
	reg	[1:0]	sel_opb;
	reg		sel_ram_adr;
	reg		sel_func;
	reg		ram_cen;
	reg		ram_wen;
	reg		ram_oen;

	reg	[3:0]	current_state;
	reg	[3:0]	next_state;
	
	parameter I_MOV_IN_TO_ACC       = 3'b001;
	parameter I_ADD_IN_TO_ACC       = 3'b010;
	parameter I_SHIFT_ACC           = 3'b011;
	parameter I_MOV_IN_TO_ADR       = 3'b100;
	parameter I_MOV_IN_TO_RAM       = 3'b101;
	parameter I_MOV_RAM_TO_ACC      = 3'b110;

	parameter S_READY_FOR_INSTR     = 4'b0000;
	parameter S_I2A	                = 4'b0001;
	parameter S_I2OPA_A2OPB         = 4'b0010;
	parameter S_ADD_AB2A            = 4'b0011;
	parameter S_A2OPB               = 4'b0100;
	parameter S_SH_OPB2A            = 4'b0101;

	parameter S_I2ADR               = 4'b0110;
	parameter S_I2RAM               = 4'b0111;
	parameter S_RAM2A               = 4'b1000;
	parameter S_RAM2AB              = 4'b1001;


	always @(posedge clk or negedge a_reset_l)
	begin
		if (a_reset_l == 1'b0)
		begin
			current_state <= 4'h0;
		end
		else
		begin
			current_state <= next_state;
		end
	end

	always @(current_state or instr)
	begin
		data_sel[1:0] =	2'b00;
		sel_acc =	1'b0;
		sel_cy =	1'b0;
		sel_opa =	1'b0;
		sel_opb[1:0] =	2'b00;
		sel_func =	1'b0;
		sel_ram_adr =	1'b0;
		ram_cen =	1'b1;
		ram_wen =	1'b1;
		ram_oen =	1'b1;
		case (current_state)
		S_READY_FOR_INSTR:
			begin
				data_sel[1:0] =	2'b00;
				sel_acc =	1'b0;
				sel_cy =	1'b0;
				sel_opa =	1'b0;
				sel_opb[1:0] =	2'b00;
				sel_func =	1'b0;

				case (instr)
				I_MOV_IN_TO_ACC:
					begin
						next_state = S_I2A;
					end
				I_ADD_IN_TO_ACC:
					begin
						next_state = S_I2OPA_A2OPB;
					end
				I_SHIFT_ACC:
					begin
						next_state = S_A2OPB;
					end
				I_MOV_IN_TO_ADR:
					begin
						next_state = S_I2ADR;
					end
				I_MOV_IN_TO_RAM:
					begin
						next_state = S_I2RAM;
					end
				I_MOV_RAM_TO_ACC:
					begin
						next_state = S_RAM2A;
					end
				default:
					begin
						next_state = S_READY_FOR_INSTR;
					end
				endcase
			end
		S_I2A:
			begin
				data_sel[1:0] =	2'b00;
				sel_acc =	1'b1;
				sel_cy =	1'b0;
				sel_opa =	1'b0;
				sel_opb[1:0] =	2'b00;
				sel_func =	1'b0;

				next_state = S_READY_FOR_INSTR;
			end
		S_I2OPA_A2OPB:
			begin
				data_sel[1:0] =	2'b00;
				sel_acc =	1'b0;
				sel_cy =	1'b0;
				sel_opa =	1'b1;
				sel_opb[1:0] =	2'b10;
				sel_func =	1'b0;

				next_state = S_ADD_AB2A;
			end
		S_ADD_AB2A:
			begin
				data_sel[1:0] =	2'b10;
				sel_acc =	1'b1;
				sel_cy =	1'b1;
				sel_opa =	1'b0;
				sel_opb[1:0] =	2'b00;
				sel_func =	1'b0;

				next_state = S_READY_FOR_INSTR;
			end
		S_A2OPB:
			begin
				data_sel[1:0] =	2'b00;
				sel_acc =	1'b0;
				sel_cy =	1'b0;
				sel_opa =	1'b0;
				sel_opb[1:0] =	2'b10;
				sel_func =	1'b0;

				next_state = S_SH_OPB2A;
			end
		S_SH_OPB2A:
			begin
				data_sel[1:0] =	2'b10;
				sel_acc =	1'b1;
				sel_cy =	1'b1;
				sel_opa =	1'b0;
				sel_opb[1:0] =	2'b00;
				sel_func =	1'b1;

				next_state = S_READY_FOR_INSTR;
			end
		S_I2ADR:
			begin
				sel_ram_adr =	1'b1;

				next_state = S_READY_FOR_INSTR;
			end
		S_I2RAM:
			begin
				ram_cen =	1'b0;
				ram_wen =	1'b0;

				next_state = S_READY_FOR_INSTR;
			end
		S_RAM2A:
			begin
				ram_cen =	1'b0;

				next_state = S_RAM2AB;
			end
		S_RAM2AB:
			begin
				data_sel[1:0] =	2'b11;
				sel_acc =	1'b1;
				ram_cen =	1'b0;
				ram_oen =	1'b0;

				next_state = S_READY_FOR_INSTR;
			end
		default:
			begin
				data_sel[1:0] =	2'b00;
				sel_acc =	1'b0;
				sel_cy =	1'b0;
				sel_opa =	1'b0;
				sel_opb[1:0] =	2'b00;
				sel_func =	1'b0;

				next_state = S_READY_FOR_INSTR;
			end
		endcase
	end

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -